应根据后端服务协议选择:HTTP服务(如php -S)用proxy_pass,FastCGI服务(如PHP-FPM)必须用fastcgi_pass;混用会导致502错误。

PHP 8.5.5 本身不参与反向代理——它只是被代理的目标之一,或者根本不在代理链路上。Nginx 的 proxy_pass 转发的是 HTTP 服务(如 Node.js、Go 或 PHP 内置服务器),而 PHP-FPM 是 FastCGI 协议服务,必须用 fastcgi_pass,不能混用。
proxy_pass 和 fastcgi_pass 到底该用哪个?
关键看后端是不是 HTTP 服务:
- 如果你启动的是
php -S 127.0.0.1:8000 router.php(PHP 内置服务器),它是 HTTP 服务 → 必须用proxy_pass http://127.0.0.1:8000/ - 如果你用的是 PHP-FPM(默认监听
127.0.0.1:9000或 Unix socket),它不是 HTTP 服务 → 只能用fastcgi_pass 127.0.0.1:9000,proxy_pass http://127.0.0.1:9000一定报 502 - PHP 8.5.5 版本号对 Nginx 配置无影响,但需确保 PHP-FPM 实际运行的是该版本(检查
php-fpm -v或ps aux | grep php-fpm)
proxy_pass 末尾斜杠写错,立刻 502 或路径错乱
proxy_pass 后的 URL 末尾斜杠决定路径重写规则,这是最常踩的坑:
-
location /api/ { proxy_pass http://127.0.0.1:3000; }→ 请求/api/users会转发成http://127.0.0.1:3000/api/users(多了一层/api) -
location /api/ { proxy_pass http://127.0.0.1:3000/; }→ 请求/api/users被重写为http://127.0.0.1:3000/users(正确) - 注意:
proxy_pass不能带 URI 路径(如http://127.0.0.1:3000/v1),否则会被忽略;要改路径必须用rewrite+break
WebSocket 支持必须显式加两行
如果后端是支持 WebSocket 的服务(如 Laravel Echo Server、Swoole HTTP 服务),只配 proxy_pass 不够:
立即学习“PHP免费学习笔记(深入)”;
- 缺
proxy_http_version 1.1→ 连接直接关闭 - 缺
proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection "upgrade"→ WebSocket 握手失败,降级为长轮询或直接 400 - 这三行必须和
proxy_pass在同一个location块里,顺序无关,但不能漏
PHP 版本信息怎么透传到响应头?
Nginx 默认不暴露 PHP 版本,需手动注入:
- 最可靠:在 PHP 入口脚本开头加
header('X-PHP-Version: ' . PHP_VERSION);(适用于所有部署方式) - 仅限 FastCGI:在 Nginx 的
location ~ \.php$块里加fastcgi_param PHP_VERSION "8.5.5";,PHP 中通过$_SERVER['PHP_VERSION']读取 - 不要依赖
add_header硬编码,版本升级时容易漏改配置
真正难的不是写几行配置,而是分清「谁在处理请求」:Nginx 是入口网关,PHP-FPM 是 FastCGI worker,php -S 是简易 HTTP server——它们协议不同、端口不同、配置指令也完全不同。混淆这三层,再抄十遍配置也没用。



















