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 基础参数
用 vi 或 nano 编辑 /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检查健康情况

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
如果发生错误,则尝试用这条

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
出现如下,则需要升级软件

这是 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 被限制/超时导致的。

按以下步骤解决(严格复制执行):
方案一:
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
完成之后可以看到

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'

看到输出这三个词,刷新 WordPress 站点健康页面,提示就会消失。
5.启用opcache操作码缓存
这是 WordPress 站点健康提示启用 OPcache(操作码缓存)。OPcache 是 PHP 8.x 内置的核心加速组件,开启后能将编译好的 PHP 字节码缓存在内存中,减少重复加载和解析,通常能降低 20%-40% 的 PHP 执行时间。

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
看到这个代表生效

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 => true 和 on => true 以及 buffer_size > 0,说明 Web 端 JIT 已经完美开启。
(验证完记得删除这个文件)
方法 2:看 PHPInfo
创建一个 phpinfo.php 文件,内容为 <?php phpinfo(); ?>,浏览器访问并搜索 jit,看到 JIT enabled 即可。
刷新你的 WordPress 站点健康页面,这条提示就会消失,网站后台操作也会明显变快!
Comments