在《MediaWiki无法显示Webp格式的图片》中已经碰到一次因为Webp格式图片导致的出错,但却没有完全解决。今天在typecho上更新文章的时候同样插入了一张Webp格式的图片,结果服务器卡死了。从系统监控中能看到,CPU性能飙到了100%(平时基本都在50%以下)。
一开始觉得可能是typecho的问题,网上说它不支持Webp。结果在设置中发现新版本开始支持该格式了。在重启服务器后,再次尝试上传Webp图片,这次倒是成功了,既能顺利保存修改的文章,刷新页面也能正常显示图片。
就当我以为问题解决之时,服务器再次卡死了。尝试将Webp图片转换成jpg格式后替换原有图片,服务器就一切顺利了。
估计是Webp搞的鬼,看来之前的问题不得不想办法解决了。
首先解决PHP的gd库问题,因为需要重装PHP,所以当时没处理。但是跟后面的imagick安装相比,这种程度的折腾还是太容易了。
因为用的是oneinstack一键安装脚本,那就继续沿用该方式。只不过在开始重装前需要对脚本进行修改。
打开include子目录中的php-8.0.sh(之前用PHP8.0还算稳定,所以暂时没有升级的意愿,毕竟MediaWiki官方也没建议用php8,多一事不如少一事),在--with-zlib后面添加--with-webp(有两处,见下图高亮处):
oneinstack__php_add_with-webp.jpg
进入src子目录,删除php8.0的文件和文件夹。之后通过uninstall.sh选择Uninstall all PHP进行删除,再用install.sh交互安装,除PHP外全部选n,当然也可以直接用代码;

install.sh --php_option 10 --phpcache_option 1 --php_extensions imagick,fileinfo,redis,memcached

PHP的扩展根据个人需要自己决定。看看phpinfo的反馈:
php_gd_Webp_Support.jpg
php_imagick_no_Webp_Support.jpg
GD库是支持了,imagick还是不支持。
尝试用上述类似的方法重装imagick扩展。同样找到include子目录中的ImageMagick.sh,在第一个./configure的行最后加入--with-webp=yes,修改变成:

./configure --prefix=${imagick_install_dir} --enable-shared --enable-static --with-webp=yes

删除src子目录中的ImageMagick文件和文件夹。然后再次使用uninstall.sh(选择Uninstall PHP extensions->Uninstall imagick)卸载并通过./install.sh --php_extensions imagick安装imagick。
结果根本没效果。
网上另外的方法就是通过手动编译安装ImageMagick,因为CentOS 7通过yum安装方式获得的版本太低,不支持Webp格式。那就先卸载系统中的,然后下载并解压新版的ImageMagick。

wget https://imagemagick.org/download/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz

接着就是配置和编译:

./configure --prefix=/usr
make
sudo make install
ldconfig

据说7.0之后的版本默认开启webp支持,所以不再需要--with-webp参数。
安装很顺利,没有出现什么错误。通过convert-version看看效果:
convert-version_result_no_Webp.jpg
不是说默认开启webp的吗?为什么还是没有支持?那就带上参数试试,结果还是一样,没用。
在网上搜索了很久没有找到合理的解释和解决方案,无意中看到某篇文章提到配置结果:
ImageMagick_configure.jpg
为什么值是no?顺着这个线索找:
ImageMagick_configure_libwebp_too_old.jpg
原来是libwebp的版本太低了,所以导致ImageMagick没法支持webp。
可是CentOS 7最高也就只支持到0.3.0-11,手工编译又不确定哪个版本正确(我尝试过一次,好像没啥用而且还把PHP给弄崩溃,无法启动了)。
php-fpm_error.jpg
当然,这些都是后话了。
既然libwebp无法用高版本,那就找个能支持低版本的ImageMagick呢?貌似网上给出的答案是6.9.12.8-1.el7版本已支持webp格式,因为依赖了libwebp7-devel(x86-64)包,不过需要使用remi源。

yum -y install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

接下去就是安装ImageMagick6了

yum --enablerepo=remi install ImageMagick6

无法安装,提示libwebp版本冲突:

Error: libwebp7-devel conflicts with libwebp-devel-0.3.0-11.el7.x86_64

就在找寻解决方案的时候,chatGPT给出的提示是让我先删除libwebp-devel-0.3.0-11.el7.x86_64,然后执行

yum install libwebp7

都到这份上就死马当活马医,姑且一试。
安装完毕,再次安装ImageMagick6也挺顺利。
注意:如果你之前手动安装过ImageMagick,一定记得make uninstall一下,否则安装完毕还是以之前手动安装的为准。
到这里还算一切正常,直到我开始重新安装PHP的imagick扩展,竟然出现上面提到的127错误(error while loading shared libraries: libwebp.so.4)。
最开始以为就是因为手动编译了libwebp,可就算我用快照回滚(这篇文章诞生于N次的快照回滚,最惨的就是我把PHP整崩溃了,然后点保存时520错误,白写了)回到libwebp的手动编译前,通过上述步骤一样会发生错误。
最终的解决办法就是卸载PHP再重装。
php_imagick_Webp_Support.jpg
折腾两天之后,终于暂时告一段落!

参考资料

Oneinstack开启WebP图片支持的方法
oneinstack配置imagick的webp支持
PHP 安装 magick 模块,并开启 webp 格式支持
CentOS7安装ImageMagick和扩展包以支持webp和heic格式

最后修改:2024 年 01 月 05 日
如果觉得我的文章对你有用,请随意赞赏