Nginx 通过解耦 PHP-FPM 实现多版本环境动态切换:按域名/路径绑定独立 FPM 实例、用 map 模块运行时路由、upstream 实现负载与热切换、结合 CI/CD 注入环境标识。
Nginx 本身不直接管理 PHP 版本或环境,但通过与 PHP-FPM 的解耦设计,可以灵活实现多套 PHP 环境(如不同版本、不同配置、不同项目隔离)的动态切换。核心在于:Nginx 负责路由分发,PHP-FPM 负责执行;切换本质是让不同请求走不同的 PHP-FPM 实例。
这是最常用、最清晰的方式。每个站点(或子路径)对应一个专属的 PHP-FPM pool,监听不同端口或 Unix Socket:
php8.2-fpm 监听 /run/php/laravel.sock,Nginx 中写:fastcgi_pass unix:/run/php/laravel.sock;
php7.4-fpm 监听 /run/php/wordpress.sock,Nginx 中写:fastcgi_pass unix:/run/php/wordpress.sock;
php8.1-fpm、php8.3-fpm),只需确保各自 www.conf 中的 listen 和 pm.* 参数互不冲突适合需要根据请求头、参数或 Cookie 动态决定 PHP 环境的场景(例如灰度发布、A/B 测试):
http 块中定义映射关系:
map $http_x_php_version $upstream_php {default unix:/run/php/php8.2-fpm.sock;
"8.1" unix:/run/php/php8.1-fpm.sock;
"7.4" unix:/run/php/php7.4-fpm.sock;
}
location ~ .php$ 中使用:fastcgi_pass $upstream_php;
X-PHP-Version: 8.1,即可命中对应 FPM 实例把 PHP-FPM 当作后端服务来管理,便于统一控制、健康检查和热切换:
upstream php_backend {server unix:/run/php/php8.2-fpm.sock max_fails=3 fail_timeout=30s;
server unix:/run/php/php8.3-fpm.sock backup;
}
fastcgi_pass php_backend;
nginx -s reload)可秒级生效,无需重启整个 Nginx真实生产中,常结合 CI/CD 或容器化流程,在部署时自动注入环境上下文:
PHP_VERSION 环境变量,启动对应镜像的 PHP-FPM 容器index.php)中读取 $_SERVER['PHP_FPM_LISTEN'] 或自定义 header,用于日志打标或功能开关