众所周知,在我网站搭建的时候,Alpine Linux的最新稳定版本是3.20,时间真快啊,转眼Alpine Linux已经出到3.24了,3.24版本还是昨天刚出的。我现在用的3.20版本其实已经是再加上最近各种互联网基础设施级别的软件被曝的漏洞有点多,于是我打算对我的服务器软件栈来一次彻底的更新升级,顺带做个记录。
更换软件源并升级系统
首先,需要把系统的软件源从3.20版本换到3.24,我们需要修改apk软件包管理器的软件源:
vim /etc/apk/repositories原来应该是这样的:
https://dl-cdn.alpinelinux.org/alpine/v3.20/main
https://dl-cdn.alpinelinux.org/alpine/v3.20/community改成这样
https://dl-cdn.alpinelinux.org/alpine/v3.24/main
https://dl-cdn.alpinelinux.org/alpine/v3.24/community接下来,升级系统,注意要备份服务器的数据库和网站文件,以防万一。
apk upgrade升级完成后,重启系统,不出意外的话过一会重启好就是更新后的新版本系统了。
进入新系统,清理一下新增的默认配置文件:
find /etc -name "*.apk-new" -type f -delete安装新的PHP8.5
由于Alpine Linux 3.24 不再包含PHP8.2,需要迁移到PHP8.5,所以升级后系统的PHP8.2还是存在的,而PHP8.5相关的软件包则是没有安装的状态,我们需要进行安装。
首先,先确认一下安装了哪些PHP的软件包,使用这个命令可以查看:
apk list -I | grep php82结果如下:
php82-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-common-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-ctype-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-curl-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-dom-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-fileinfo-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-fpm-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-iconv-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-intl-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-mbstring-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-mysqli-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-mysqlnd-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-openssl-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-pdo-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-pdo_mysql-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-pdo_sqlite-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-phar-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-session-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-tokenizer-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]
php82-zip-8.2.28-r0 x86_64 {php82} (PHP-3.01 BSD-3-Clause LGPL-2.0-or-later MIT Zend-2.0) [installed]让我们安装PHP8.5相应的组件:
apk add php85 php85-common php85-ctype php85-curl php85-dom php85-fileinfo php85-fpm php85-iconv php85-intl php85-mbstring php85-mysqli php85-mysqlnd php85-openssl php85-pdo php85-pdo_mysql php85-pdo_sqlite php85-phar php85-session php85-tokenizer php85-zip 然后会得到以下报错:
ERROR: unable to select packages:
icu-data-en-74.2-r1:
breaks: icu-libs-78.1-r0[icu-data=78.1-r0]
satisfies: icu-libs-74.2-r1[icu-data=74.2-r1]
icu-libs-74.2-r1:
conflicts: icu-libs-78.1-r0
satisfies: php82-intl-8.2.28-r0[so:libicui18n.so.74] php82-intl-8.2.28-r0[so:libicuio.so.74] php82-intl-8.2.28-r0[so:libicuuc.so.74]
icu-libs-78.1-r0:
conflicts: icu-libs-74.2-r1
satisfies: php85-intl-8.5.7-r0[so:libicui18n.so.78] php85-intl-8.5.7-r0[so:libicuio.so.78] php85-intl-8.5.7-r0[so:libicuuc.so.78]原因是php82-intl和php85-intl冲突,一般是多语言支持,那可以先不安装php85-intl,测试无误把PHP8.2卸载后再安装,调整后的安装命令变成:
apk add php85 php85-common php85-ctype php85-curl php85-dom php85-fileinfo php85-fpm php85-iconv php85-mbstring php85-mysqli php85-mysqlnd php85-openssl php85-pdo php85-pdo_mysql php85-pdo_sqlite php85-phar php85-session php85-tokenizer php85-zip 配置PHP8.5
安装完成后,我们需要把之前的一些设置迁移到PHP8.5上面,首先,先让PHP8.5开启启动并运行起来:
rc-update add php-fpm85 default
rc-service php-fpm85 start接下来,更改一下PHP8.5的监听端口:
vim /etc/php85/php-fpm.d/www.conf 在[www]部分,找到监听端口的设置,把监听端口改成:
; 更改 listen 为 Unix socket
listen = /var/run/php-fpm85/php8.5-fpm.sock
; 设置 socket 文件的所有者和组
listen.owner = nginx
listen.group = nginx
listen.mode = 0660修改完成后,创建对应的目录并赋予权限:
mkdir -p /var/run/php-fpm85/
chown root:nginx /var/run/php-fpm85/
chmod 755 /var/run/php-fpm85/补上一点,隐藏返回的请求头中X-Powered-By: PHP/8.5.2这样的版本号的操作:
vim /etc/php85/php.ini用/开启搜索,找到关键词expose_php,然后把
expose_php = On改成
expose_php = OffPHP这边的设置处理完了,接下来要处理Nginx的配置了。具体的做法是,找到原来PHP处理的接口,把之前的fastcgi_pass unix:/var/run/php-fpm82/php8.2-fpm.sock;
改成fastcgi_pass unix:/var/run/php-fpm85/php8.5-fpm.sock;
这样之后,就对接好了。
重启PHP和Nginx
rc-service php-fpm85 restart
rc-service nginx restart重启后看看网站能不能正常工作,没问题之后,可以开始清理残留的PHP8.2。
清理残留的PHP8.2
确认正常工作后,我们就可以卸载PHP8.2了:
apk del 'php82*'卸载完成后,把php85-intl这个包补上:
apk add php85-intl清理PHP8.2残留的文件:
rm -rf /etc/php82
rm -rf /var/run/php-fpm82收工!