PHP 7.4 升级到 8.1 在 Nginx 环境下需要改哪些配置?

文章导读
PHP 7.4 升级到 8.1 在 Nginx 环境下,核心配置改动集中在 Nginx 的 fastcgi_pass socket 路径指向和 PHP-FPM 服务监听配置,同时需确保扩展包版本匹配。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

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。

PHP 7.4 升级到 8.1 在 Nginx 环境下需要改哪些配置?

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 完整指南:注意事项 + 详细流程 (避坑必看)