PHP 7.4 升级到 8.1 在 Nginx 环境下,核心配置改动集中在 Nginx 的 fastcgi_pass socket 路径指向和 PHP-FPM 服务监听配置,同时需确保扩展包版本匹配。
先说结论:升级成功的关键在于同步更新 Nginx 配置文件中的 PHP-FPM socket 路径,并彻底清理旧版本扩展以避免依赖冲突。
- 适合:CentOS 7/8 及 Ubuntu 20.04/22.04 等主流 Linux 发行版的生产环境平滑升级。
- 先看:备份现有 Nginx 配置与 PHP 扩展列表,确认业务代码兼容 PHP 8.1 语法特性。
- 验收:通过 phpinfo() 页面验证版本号,检查 Nginx 错误日志无 502 Bad Gateway 报错。
命令速用版
以下命令用于快速检查当前 PHP 版本状态及重启相关服务,操作前请确认已有 sudo 权限。
检查当前 PHP 命令行版本:
php -v
重启 PHP-FPM 服务(以 php8.1-fpm 为例):
systemctl restart php8.1-fpm
重载 Nginx 配置:
nginx -s reload
为什么会这样
Nginx 与 PHP 通过 FastCGI 协议通信,不同 PHP 版本默认的 FPM 监听 socket 文件路径通常不同。
PHP 7.4 的 socket 路径可能为/var/run/php/php7.4-fpm.sock,而 PHP 8.1 可能变更为/php8.1-fpm.sock 或通过 alternatives 管理的通用路径。若 Nginx 配置仍指向旧路径,会导致 502 错误。此外,PHP 8.1 移除了部分旧扩展接口,直接覆盖安装可能引发依赖缺失。
分步处理
按顺序执行以下步骤,确保环境隔离与配置同步。
1. 备份现有配置与扩展列表
记录当前已安装的 PHP 扩展包名,以便在新版本中复装。Ubuntu 用户可使用 dpkg -l|grep php 备份列表,CentOS 用户可记录 yum list installed php* 输出。
2. 安装 PHP 8.1 及对应扩展
CentOS 需启用 Remi 仓库并启用 remi-php81 模块,Ubuntu 需添加 ondrej/php 源。安装时务必包含 php8.1-fpm 及业务所需的扩展如 mysql、gd、curl 等。
3. 修改 Nginx 配置文件
找到 server 块中 location ~ \.php$ 段落,修改 fastcgi_pass 指令。若原配置为 unix:/var/run/php/php7.4-fpm.sock,需改为新版本的 socket 路径,例如 unix:/var/run/php/php8.1-fpm.sock。
4. 检查 PHP-FPM 监听配置
查看/etc/php/8.1/fpm/pool.d/www.conf 或/etc/php-fpm.d/www.conf,确认 listen 指令路径与 Nginx 配置一致。若权限不足,需调整 listen.owner 和 listen.group 为 nginx 或 www-data。
5. 停止旧版本并启动新版本
停止 php7.4-fpm 服务,启动 php8.1-fpm 服务。建议先保留旧版本服务以便快速回滚,确认无误后再卸载旧包。
怎么验证是否生效
通过 Web 页面和命令行双重验证,确保请求由新版本处理。
命令行验证:终端执行 php -v,输出应显示 PHP 8.1.x。
Web 验证:在网站根目录创建 info.php 文件,内容为<?php phpinfo(); ?>,浏览器访问该文件,查看顶部版本号。
日志检查:查看 Nginx 错误日志/var/log/nginx/error.log,确认无 upstream 连接拒绝或权限 denied 报错。
常见坑
升级过程中容易忽略权限与代码兼容性细节,导致服务不可用。
Socket 文件权限:新安装的 PHP-FPM 生成的 socket 文件可能归属 root,导致 Nginx 用户无权访问,需确保 socket 文件对 Nginx 用户可读写的。
废弃函数报错:PHP 8.1 严格移除了 each()、create_function() 等函数,代码中若存在调用会直接 Fatal Error,升级前需静态扫描代码。
扩展版本不匹配:旧版扩展如 php-pecl-apcu-bc 不兼容 PHP 8.1,必须在升级前卸载,否则 yum/apt 依赖检查会失败。
常见问题
Nginx 报 502 Bad Gateway 怎么办?
通常是 fastcgi_pass 指向的 socket 文件不存在或权限不足。
检查 Nginx 配置中的 fastcgi_pass 路径是否与 PHP-FPM 配置中的 listen 路径完全一致,并查看 socket 文件权限是否允许 Nginx 用户访问。
如何同时保留 PHP 7.4 和 8.1?
可以通过安装多版本并配置不同的 FPM 端口或 Socket 路径实现共存。
分别为两个版本配置独立的 pool 文件,监听不同 socket 或端口,在 Nginx 不同 server 块中指向不同的 fastcgi_pass 地址。
升级后 Composer 依赖报错如何处理?
部分 Composer 包可能尚未支持 PHP 8.1,需更新包版本或调整 composer.json 约束。
执行 composer check-platform-reqs 检查兼容性,将不支持的包升级至支持 PHP 8.1 的最新版本。
参考来源
CentOS 7 + Nginx 环境下,用 yum 安装并配置 PHP 8.1 的完整避坑指南
ubuntu 20.04 升级 php7.4 到 php8.0 nginx
PHP 7 项目升级 PHP8 完整指南:注意事项 + 详细流程 (避坑必看)