核心是为每个PHP版本配置独立FPM进程池,Nginx按域名精准转发.php请求至对应socket或端口,实现版本隔离。需安装多版本FPM、启用服务、确认监听地址、在各server块中单独设置fastcgi_pass,并验证CLI与Web端版本一致。

让不同项目用上各自匹配的 PHP 版本,核心就一条:每个 PHP 版本跑一个独立的 PHP-FPM 进程池,Nginx(或 Apache)按域名或站点配置,把 .php 请求精准转发过去。不混用、不共用、不冲突,各跑各的。
安装多个 PHP-FPM 实例
先确保系统能同时装多个版本,推荐用稳定源(如 Ubuntu 的 ondrej/php PPA 或 CentOS 的 remi 仓库),避免手动编译带来的维护负担。
- 执行
sudo apt install php7.4-fpm php8.1-fpm php8.2-fpm(Ubuntu/Debian)或yum install php74-php-fpm php81-php-fpm(CentOS/RHEL) - 安装后,每个版本的 FPM 服务默认是禁用状态,需单独启用:
sudo systemctl enable php7.4-fpm && sudo systemctl start php7.4-fpm - 验证是否运行:
sudo systemctl is-active php7.4-fpm应返回active;再用ps aux | grep php-fpm看到多个 master 进程,说明已并存
确认每个 FPM 的监听地址
Nginx 要靠这个地址把请求送过去,必须明确知道每个版本用的是 socket 还是 TCP 端口,路径或端口不能重复。
- 查看配置文件,常见位置:
/etc/php/7.4/fpm/pool.d/www.conf,找listen =行 - 典型值有两类:
unix:/run/php/php7.4-fpm.sock(推荐,高效且安全)或127.0.0.1:9001(端口模式,适合调试或 socket 权限受限时) - 务必检查权限:socket 文件属主应为 web 用户(如
www-data或nginx),组同理;TCP 模式则需确认端口未被占用、防火墙放行
Nginx 按站点绑定对应 PHP-FPM
这是最关键的一步——不是全局改 PHP,而是每个 server 块里单独指定 fastcgi_pass。
立即学习“PHP免费学习笔记(深入)”;
- 在站点配置的
location ~ \.php$块内,写明目标地址,例如:fastcgi_pass unix:/run/php/php7.4-fpm.sock;或fastcgi_pass 127.0.0.1:9002; - 同一台机器上多个站点可分别指向不同版本:
old-site.com → php7.4-fpm.sock,api.site.com → 127.0.0.1:9003 - 改完配置别忘了重载:
sudo nginx -t && sudo systemctl reload nginx;如果 FPM 服务没启,会报 502 错误
验证与日常维护要点
光配完不行,得确认 CLI 和 Web 下都真实生效,还要防住几个高频翻车点。
- CLI 版本和 Web 版本可能不一致——用
which php和php -v查命令行;Web 端放个index.php写<?php phpinfo(); ?>浏览器访问看“PHP Version”字段 - 常见问题:502 错误多因 FPM 未运行、socket 路径错、权限不对;503 则常是 SELinux(CentOS)或 AppArmor(Ubuntu)拦截了 Nginx 访问 socket
- 建议每个 FPM 配置里加一句
php_admin_value[error_log] = /var/log/php7.4-fpm-error.log,出问题时日志不串,排查快得多



















