LNMP生产环境下PHP8.1.3升级到8.3

LNMP生产环境下PHP8.1.3升级到8.3

一、背景

LNMP需要升级PHP 8.1.3到PHP8.3,需要在不影响生产环境的前提下,无缝升级。

升级路线总览

并行安装 8.3 → 81端口隔离测试 → 改一行 nginx 配置切换 → 出问题30秒回滚

旧版 PHP 8.1 全程运行不停止,切换只是 nginx -s reload 的瞬间动作,网站无感知。

二、关键步骤速查

1.备份

# 编译参数、站点文件、数据库、PHP目录、nginx配置 全部备份
/usr/local/php/bin/php -i | grep configure > /root/php81_configure.txt #PHP配置文件
tar czf /root/wp_bak_20260814/wp.tar.gz /usr/local/nginx/html #网站备份
mysqldump -uroot -p --all-databases > /root/wp_bak_20260814/db.sql #数据库备份
cp -a /usr/local/php /root/php81_bak #PHP程序备份

三、开始配置PHP8.3.20

1.下载PHP8.3.20

cd /usr/local/src
wget https://www.php.net/distributions/php-8.3.20.tar.gz
tar xzf php-8.3.20.tar.gz && cd php-8.3.20

2.安装所需的依赖

yum groupinstall -y "Development Tools"
yum install -y epel-release
yum install -y gcc gcc-c++ make autoconf bison re2c \
  libxml2-devel bzip2-devel curl-devel libpng-devel libjpeg-turbo-devel \
  freetype-devel gmp-devel openssl-devel sqlite-devel oniguruma-devel \
  libicu-devel libxslt-devel libsodium-devel libwebp-devel \
  readline-devel zlib-devel pcre2-devel

# libzip:CentOS7 自带 0.10 太老,PHP 8 要 ≥1.8(1.10+ 稳妥)
yum remove -y libzip libzip-devel
cd /usr/local/src
curl -LO https://github.com/nih-at/libzip/releases/download/v1.10.1/libzip-1.10.1.tar.gz
tar xzf libzip-1.10.1.tar.gz && cd libzip-1.10.1
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local && make -j1 && make install
echo '/usr/local/lib64' > /etc/ld.so.conf.d/libzip.conf
ldconfig

# oniguruma:若 yum 的 oniguruma-devel 装不上再源码编
curl -LO https://github.com/kkos/oniguruma/releases/download/v6.9.9/onig-6.9.9.tar.gz
tar xzf onig-6.9.9.tar.gz && cd onig-6.9.9
./autogen.sh && ./configure --prefix=/usr/local && make -j1 && make install
ldconfig
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

3.编译 8.3(必须 “-j1″,2G内存开多线程必炸)

./configure \
--prefix=/usr/local/php-8.3.20 \
--with-config-file-path=/usr/local/php-8.3.20/etc \
--enable-fpm --with-fpm-user=www --with-fpm-group=www \
--enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
--with-openssl --with-zlib --with-curl --enable-mbstring \
--enable-gd --with-freetype --with-jpeg \
--enable-intl --enable-opcache --enable-zip \
--enable-bcmath --enable-sockets --enable-soap \
--with-gettext --without-pear --disable-rpath --disable-debug

看到 Thank you for using PHP 后,再执行:

make -j1 && make install

4.复制配置文件(必须)

编译安装后没有默认配置文件,需要手动从源码目录复制:

# 回到 PHP 源码目录
cd /usr/local/src/php-8.3.20

# 复制 php.ini(生产环境用 production)
cp php.ini-production /usr/local/php-8.3.20/etc/php.ini

# 复制 PHP-FPM 配置文件
cp sapi/fpm/php-fpm.conf /usr/local/php-8.3.20/etc/php-fpm.conf
cp sapi/fpm/www.conf /usr/local/php-8.3.20/etc/php-fpm.d/www.conf

5.配置 php.ini 基础参数

vinano 编辑 /usr/local/php-8.3.20/etc/php.ini,修改以下参数(适配 2G 小内存):

date.timezone = Asia/Shanghai
memory_limit = 128M
upload_max_filesize = 20M
post_max_size = 20M
opcache.enable=1
opcache.memory_consumption=64
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000

6.配置 PHP-FPM 进程池(针对 2G 内存优化)

编辑 /usr/local/php-8.3.20/etc/php-fpm.d/www.conf

vi /usr/local/php-8.3.20/etc/php-fpm.d/www.conf

修改以下关键参数(用户跟 nginx用户要一致,具体可以查看nginx的配置文件):

[nginx]
user = nginx
group = nginx
listen = /run/php/php8.3-fpm.sock  #需要把注释去掉
listen.owner = nginx               #需要把注释去掉
listen.group = nginx               #需要把注释去掉
pm = dynamic
pm.max_children = 2      # 2G内存严格控制子进程数
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 200

; 补错误日志,出问题直接看
php_admin_value[error_log] = /var/log/php-fpm/8.3-www-error.log
php_admin_value[memory_limit] = 128M
目录不存在先建:mkdir -p /run/php && chown nginx:nginx /run/php`
日志目录:mkdir -p /var/log/php-fpm && chown nginx:nginx /var/log/php-fpm

7.配置 Systemd 开机自启(CentOS 7)

创建系统服务文件,方便用 systemctl 管理:

vim /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP 8.3.20 FastCGI Process Manager
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/php-8.3.20/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-8.3.20/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

保存后执行:

systemctl daemon-reload
systemctl enable php-fpm
systemctl start php-fpm

检查状态(显示 active (running) 即成功):

systemctl status php-fpm

8.配置全局环境变量

让系统直接识别 php 命令:

echo 'export PATH=/usr/local/php-8.3.20/bin:$PATH' > /etc/profile.d/php83.sh
chmod +x /etc/profile.d/php83.sh
source /etc/profile.d/php83.sh

验证版本:

php -v

9.最后:对接 Nginx(WordPress 必备)

需要在 Nginx 的站点配置文件中,把 PHP 请求转发给刚才配置的 Socket:

# ---------- PHP 处理(对接 PHP 8.3-FPM) ----------
location ~ [^/]\.php(/|$) {
    # 保留你原有的 PATH_INFO 修复逻辑
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;

    # 保留你原有的文件存在性校验(防恶意请求)
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    # 【核心修改】从 9000 端口切为 8.3 独立 sock(不干扰旧 8.1)
    fastcgi_pass unix:/run/php/php8.3-fpm.sock; #改动这个位置
    fastcgi_index index.php;

    # 保留你原有的 SCRIPT_FILENAME 写法(兼容 root 变更)
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

10.重启顺序(无感知切换,不断站)

# 1. 先测 PHP-FPM 语法
/usr/local/php-8.3.20/sbin/php-fpm -t
# 必须看到:NOTICE: configuration file /usr/local/php-8.3.20/etc/php-fpm.conf test is successful

# 2. 停旧的 8.1(如果还在跑)、起 8.3
systemctl stop php-fpm 2>/dev/null || pkill -f php-fpm8.1
systemctl start php-fpm   # 你之前配的 systemd 服务

# 3. 测 nginx 语法
nginx -t
# 看到 ok/is successful

# 4. 重载 nginx(旧请求不中断,新请求走 8.3)
systemctl reload nginx

11.上线后 3 秒验证

浏览器访问 https://z-notes.cn/wp-admin/,能登录=成功

看 sock 是否生成:

ls -l /run/php/php8.3-fpm.sock

看内存(2G 机器正常状态):

free -h

12.回滚(30秒救急)

如果打开网站白屏/502,立刻执行:

# 改回 nginx 站点配置里的 fastcgi_pass
vi /etc/nginx/conf.d/wordpress.conf
# 改回:fastcgi_pass 127.0.0.1:9000;
nginx -s reload
# 网站立刻回到 PHP 8.1,再慢慢查

四、wordpress检查健康情况

image-20260814183648636

1.安装系统级依赖库

yum install -y epel-release
yum install -y ImageMagick ImageMagick-devel libzip-devel zlib-devel

2.安装 exif 扩展

exif 用于读取图片元数据(如手机照片的方向),直接通过 PECL 安装:

cd /usr/local/src/php-8.3.20/ext/exif
/usr/local/php-8.3.20/bin/phpize
./configure --with-php-config=/usr/local/php-8.3.20/bin/php-config

如果发生错误,则尝试用这条

image-20260814184617488

cd /usr/local/src/php-8.3.20/ext/exif
make clean   # 清掉之前失败的编译缓存

# 强制指定 C99 标准重新编译
./configure CFLAGS="-std=gnu99" --with-php-config=/usr/local/php-8.3.20/bin/php-config
make -j1 && make install

看到 Installing shared extensions: /usr/local/php-8.3.20/lib/php/extensions/... 即成功。

3.安装 zip扩展

cd /usr/local/src/php-8.3.20/ext/zip
make clean   # 清缓存

# 执行 phpize 生成 configure 脚本
/usr/local/php-8.3.20/bin/phpize

# 注意这里是 CFLAGS(带G),指定 C99 标准并配置
./configure CFLAGS="-std=gnu99" --with-php-config=/usr/local/php-8.3.20/bin/php-config

# 编译并安装
make -j1 && make install

出现如下,则需要升级软件

image-20260814185405731

这是 CentOS 7 自带的 libzip 0.10.1 太老,不满足 PHP 8.3 要求的 ≥0.11。你之前没把源码编译的 libzip 让系统识别到,按下面 3 步必成(严格复制执行):

cd /usr/local/src
# 如果之前下过就跳过wget
wget https://github.com/nih-at/libzip/archive/refs/tags/v1.10.1.tar.gz -O libzip-1.10.1.tar.gz

如果出现这种情况,这是国内服务器直连 GitHub 被限制/超时导致的。

image-20260814215824490

按以下步骤解决(严格复制执行):

方案一:

cd /usr/local/src

# 如果之前有残留的无效文件,先删除
rm -f libzip-1.10.1.tar.gz

# 使用 gh.llkk.cc 镜像加速下载
wget https://gh.llkk.cc/https://github.com/nih-at/libzip/archive/refs/tags/v1.10.1.tar.gz -O libzip-1.10.1.tar.gz

# 如果上面的镜像也挂了,可以换用 ghproxy.net 镜像
# wget https://ghproxy.net/https://github.com/nih-at/libzip/archive/refs/tags/v1.10.1.tar.gz -O libzip-1.10.1.tar.gz

方案二:

cd /usr/local/src
rm -f libzip-1.10.1.tar.gz

# 下载 Gitee 上的镜像(注意 Gitee 上可能是 tar.xz 格式)
wget https://gitee.com/lyn/llibzip/repository/archive/v1.10.1.tar.xz -O libzip-1.10.1.tar.xz
# 解压 xz 格式
tar xf libzip-1.10.1.tar.xz
# 进入解压后的目录(目录名可能带分支后缀,用 ls 看一下)
ls
# 假设解压出的目录是 llibzip,重命名一下方便后续操作
mv llibzip* libzip-1.10.1

方案三:

如果服务器怎么都下不动:
1.在本机电脑浏览器打开:libzip 1.10.1 下载地址(或去 AtomGit镜像 下载)。
2.下载完成后,用 SFTP 工具(如 Xshell、WinSCP 或宝塔)上传到服务器的 `/usr/local/src/` 目录。

下载成功后,继续执行编译(重点注意)

CentOS 7 默认没有 cmake(只有 cmake2),编译 libzip 1.10.1 会报错,必须先装 cmake3

# 1. 安装 cmake3 和编译依赖
yum install -y cmake3 openssl-devel bzip2 bzip2-devel
ln -sf /usr/bin/cmake3 /usr/bin/cmake

# 2. 回到 libzip 源码目录(如果是 tar.gz 下载的)
cd /usr/local/src
tar xf libzip-1.10.1.tar.gz
cd libzip-1.10.1

# 3. 编译安装(指定安装到 /usr/local,避免和 yum 装的旧版冲突)
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j1 && make install

查找并拷贝 .pc 文件

# 查找 libzip.pc 实际位置
find /usr/local -name "libzip.pc" 2>/dev/null

# 如果找到在 lib 目录下,执行:
cp /usr/local/lib/pkgconfig/libzip.pc /usr/lib64/pkgconfig/

# 如果找到在 lib64 目录下,执行:
cp /usr/local/lib64/pkgconfig/libzip.pc /usr/lib64/pkgconfig/

刷新动态库缓存并设置环境变量

echo "/usr/local/lib64" > /etc/ld.so.conf.d/libzip.conf
echo "/usr/local/lib" >> /etc/ld.so.conf.d/libzip.conf
ldconfig

# 设置 pkg-config 环境变量(让 PHP 的 configure 能找到它)
export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"

验证是否生效

pkg-config --modversion libzip

如果输出 1.10.1,说明系统已经成功识别新版 libzip 了。

继续重新编译 PHP 的 zip 扩展

验证生效后,紧接着执行(注意是在当前窗口执行,保证环境变量生效):

cd /usr/local/src/php-8.3.20/ext/zip
make clean
/usr/local/php-8.3.20/bin/phpize

./configure CFLAGS="-std=gnu99" --with-php-config=/usr/local/php-8.3.20/bin/php-config
make -j1 && make install

看到 Installing shared extensions: ... zip.so 就大功告成了!接着去执行之前的写入 php.ini 和重启服务步骤即可。

3.安装 imagick扩展

cd /usr/local/src/
wget https://pecl.php.net/get/imagick-3.7.0.tgz
tar zxvf imagick-3.7.0.tgz
cd imagick-3.7.0
/usr/local/php-8.3.20/bin/phpize
./configure --with-php-config=/usr/local/php-8.3.20/bin/php-config
make -j1 && make install

完成之后可以看到

image-20260814223759171

4.最后:启用扩展并重启

写入 php.ini

vim /usr/local/php-8.3.20/etc/php.ini

在末尾加上:

extension=exif.so
extension=imagick.so
extension=zip.so

重启服务生效

systemctl restart php-fpm
systemctl reload nginx

验证

/usr/local/php-8.3.20/bin/php -m | grep -E 'exif|imagick|zip'

image-20260814224118557

看到输出这三个词,刷新 WordPress 站点健康页面,提示就会消失。

5.启用opcache操作码缓存

这是 WordPress 站点健康提示启用 OPcache(操作码缓存)。OPcache 是 PHP 8.x 内置的核心加速组件,开启后能将编译好的 PHP 字节码缓存在内存中,减少重复加载和解析,通常能降低 20%-40% 的 PHP 执行时间

image-20260814224350646

5.1.检查并编译安装 OPcache 扩展

先检查一下当前是否已经安装了该扩展:

/usr/local/php-8.3.20/bin/php -m | grep opcache

如果没有任何输出,说明还没装。进入 PHP 源码目录编译它(注意带上之前的 C99 编译规则):

cd /usr/local/src/php-8.3.20/ext/opcache

# 生成 configure
/usr/local/php-8.3.20/bin/phpize

# 配置并编译安装
./configure CFLAGS="-std=gnu99" --with-php-config=/usr/local/php-8.3.20/bin/php-config
make -j1 && make install

5.2.写入 OPcache 配置

用编辑器打开你的 PHP 配置文件:

vim /usr/local/php-8.3.20/etc/php.ini

翻到文件最底部,按 i 进入编辑模式,粘贴以下针对 WordPress 生产环境优化的配置:

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.save_comments=1
opcache.fast_shutdown=1

(注:如果你的服务器内存较小,可以把 memory_consumption 改为 128

5.3.重启服务并验证

# 重启 PHP-FPM 和 Nginx
systemctl restart php-fpm
systemctl reload nginx

# 验证是否生效(看到 On 和 版本号即成功)
/usr/local/php-8.3.20/bin/php -i | grep opcache.enable

看到这个代表生效

image-20260814225121031

5.4.额外提速:开启 JIT(可选)

PHP 8.x 还引入了 JIT(即时编译),能在 OPcache 基础上进一步提速。继续编辑 php.ini,在刚才的 [opcache] 配置下追加:

opcache.jit=1255
opcache.jit_buffer_size=128M

保存后再次重启 systemctl restart php-fpm

5.5.验证方式(针对 Web 站点)

你的 WordPress 是通过 Nginx + PHP-FPM 运行的,FPM 模式下 opcache.enable=1 是开着的,所以 Web 端其实已经生效了

不要用命令行(php -i)去测 Web 的 JIT 状态,请用以下方式验证:

方法 1:用 PHP 代码验证(推荐)

在网站根目录创建一个测试文件(如 jit_check.php),内容如下:

<?php
var_dump(opcache_get_status(false)['jit'] ?? ['jit_disabled']);

访问这个文件(用浏览器打开),如果输出数组中包含 enabled => trueon => true 以及 buffer_size > 0,说明 Web 端 JIT 已经完美开启

(验证完记得删除这个文件)

方法 2:看 PHPInfo

创建一个 phpinfo.php 文件,内容为 <?php phpinfo(); ?>,浏览器访问并搜索 jit,看到 JIT enabled 即可。

 

刷新你的 WordPress 站点健康页面,这条提示就会消失,网站后台操作也会明显变快!

 

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注