PHP8.2.10 编译升级 PHP8.2.35 完整实操文档(修复PHP2Shell高危漏洞)

AI摘要
【知识分享】该文档记录PHP从8.2.10编译升级至8.2.35的完整实操流程,涵盖升级背景、环境信息、备份、编译参数复用、源码下载、编译安装、FPM二进制手动部署、配置测试、服务重启与版本验证等步骤,并总结make install未覆盖php-fpm等踩坑经验,属技术运维类知识分享。

PHP8.2.10 编译升级 PHP8.2.35 完整实操文档(修复PHP2Shell高危漏洞)

一、升级背景

服务器原有编译版本:PHP 8.2.10

存在高危漏洞:PHP2Shell(CVE-2026-109618 / CVE-2026-109619)远程代码执行漏洞

修复目标版本:PHP 8.2.35(8.2分支最终安全修复版)

升级方式:原地编译覆盖升级(不新增环境、不改动Nginx配置、不改动FPM配置)

二、环境信息

  • PHP安装路径:/usr/local/php82

  • 运行用户:www

  • 运行模式:PHP-FPM 监听 127.0.0.1:9000

  • 管理方式:systemctl 托管 php-fpm.service

  • Web服务:Nginx

三、升级前备份(关键兜底)

升级前备份整套旧PHP环境,出问题可秒回滚

cp -r /usr/local/php82 /usr/local/php82.bak.8.2.10

四、获取旧版本完整编译参数(重中之重)

避免升级后模块缺失、参数不一致、服务异常

/usr/local/php82/bin/php-config --configure-options

将输出的完整 configure 参数保存,后续新版本编译必须完全一致。

五、下载新版源码并解压

cd /usr/local/src
wget https://www.php.net/distributions/php-8.2.35.tar.gz
tar -zxvf php-8.2.35.tar.gz
cd php-8.2.35

六、编译配置(完全复用旧参数)

粘贴前面获取的完整 configure 命令,示例格式:

./configure \
--prefix=/usr/local/php82 \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-fpm \
--enable-cli \
--enable-cgi \
--with-openssl \
--with-curl \
--with-zip \
--with-gd \
--with-jpeg \
--with-png \
--with-freetype \
--enable-mbstring \
--enable-intl \
--enable-bcmath \
--enable-pdo \
--with-pdo-mysql \
--with-mysqli \
--enable-sockets \
--enable-opcache \
--with-readline \
--without-pear

七、编译 & 安装

make -j$(nproc)
make install

八、本次升级遇到的核心问题 & 解决方案(重点记录)

问题现象

make 编译成功,但 make install 未正常覆盖 php-fpm 主程序

报错:/usr/local/php82/sbin/php-fpm: No such file or directory

导致 systemctl 无法启动 php-fpm

原因

PHP源码编译后,fpm 二进制文件路径不在根目录sbin,而是在:sapi/fpm/php-fpm

部分环境 make install 不会自动覆盖,导致新版程序未部署。

手动修复方案(本次成功方案)

# 进入源码目录手动拷贝新版php-fpm到正式目录
cp sapi/fpm/php-fpm /usr/local/php82/sbin/
chmod +x /usr/local/php82/sbin/php-fpm

九、验证新版程序

/usr/local/php82/sbin/php-fpm -v

输出 PHP 8.2.35 即为编译成功。

十、测试FPM配置是否正常

/usr/local/php82/sbin/php-fpm -t

显示:test is successful 代表配置无问题

十一、重启服务并校验运行状态

systemctl restart php-fpm
systemctl status php-fpm

十二、校验端口监听 & 运行程序版本

ss -tulnp | grep 9000

确认 9000 端口由 php-fpm 监听

ls -l /proc/对应PID/exe

确认运行的是 /usr/local/php82/sbin/php-fpm 新版程序

额外通过进程命令核查运行状态,区分主进程与工作进程,确认无多余旧进程残留:

ps aux | grep php-fpm

正常输出说明:

  • 唯一一条带 master process:PHP-FPM主进程(root用户运行,核心管控进程)

  • 多条带 pool www:PHP-FPM工作子进程(www用户运行,负责处理业务请求)

  • 无多余master主进程,代表无新旧版本进程冲突、升级干净

十三、网页端验证版本(必须清缓存)

1. 新建或访问 info.php

2. 浏览器 Ctrl+F5 强制刷新 / 无痕窗口打开

3. 页面显示 PHP 8.2.35 升级完成,漏洞修复

十四、本次踩坑总结(可永久参考)

  • PHP升级后网页显示旧版 = fpm进程未重启或浏览器缓存

  • 重启报错找不到文件 =make install 未覆盖 fpm 二进制,需手动拷贝 sapi/fpm/php-fpm

  • 升级必须沿用旧configure参数,否则扩展、模块全部异常

  • 升级前必须备份整套PHP目录,方便秒回滚

十五、漏洞修复结论

当前服务器 PHP 已升级至 8.2.35,已彻底修复:

CVE-2026-109618 / CVE-2026-109619 PHP2Shell 远程代码执行高危漏洞

业务运行正常、Nginx对接正常、FPM进程稳定。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

老项目怎么办? ai把 laravel5.6 直接升级laravel 13 心虚

3天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!