502 Bad Gateway主因是PHP-FPM未返回合法响应,需查Nginx error.log定位卡点;确认PHP-FPM运行状态、fastcgi_pass与listen一致、PATH_INFO传递正确,并排查进程耗尽、超时、缓冲区或SELinux拦截等问题。

502 Bad Gateway 不是 PHP 代码报错,而是 Nginx 已把请求转给 PHP-FPM,但没收到合法响应——问题一定出在 PHP-FPM 这一端或它与 Nginx 的协作链路上。
看 Nginx error.log 找第一线索
别猜,直接查日志。Nginx 的 /var/log/nginx/error.log 会明确告诉你卡在哪一步:
- 出现
connect() failed (111: Connection refused)→ PHP-FPM 根本没在监听,或地址/端口不匹配 - 出现
upstream timed out (110: Connection timed out)→ PHP-FPM 接收了请求,但处理太久、被 Nginx 主动断开 - 出现
recv() failed (104: Connection reset by peer)→ PHP-FPM 进程崩溃退出,比如执行到一半 segfault 或内存耗尽 - 出现
no live upstreams while connecting to upstream→ fastcgi_pass 指向的 socket 文件不存在,或权限不对(如 nginx 用户无法读取/var/run/php-fpm.sock)
确认 PHP-FPM 是否真在跑、能不能连
用最简方式验证 PHP-FPM 状态和连接通路:
- 运行
systemctl status php-fpm,确保状态是active (running);若为inactive (dead),立刻systemctl start php-fpm - 查 PHP-FPM 实际监听地址:
grep "^listen =" /etc/php-fpm.d/www.conf,常见值是/var/run/php-fpm.sock或127.0.0.1:9000 - 对照 Nginx 配置里的
fastcgi_pass:必须完全一致,包括路径、socket 权限(ls -l /var/run/php-fpm.sock看属主是否为nginx或www-data) - 手动测试连接(仅限 TCP 模式):
curl -v http://127.0.0.1:9000应该返回 Connection refused(说明端口监听正常),而不是 Connection refused due to firewall(说明防火墙拦了)
检查 PHP-FPM 进程是否被挤爆或主动退出
偶发 502 很大概率是并发压垮了 PHP-FPM,而不是配置写错:
通过IB网关在Interactive Brokers上投资股票/ETF,使用与okx交易相同的人机确认环节,适用于用户请求检查时
立即学习“PHP免费学习笔记(深入)”;
- 用
systemctl show php-fpm | grep ActiveState和ps aux | grep php-fpm确认 worker 进程数是否接近pm.max_children上限 - 查 PHP-FPM 自己的日志:
tail -f /var/log/php-fpm/www-error.log,重点找unable to fork(系统进程数限制)、child exited on signal Segmentation fault(PHP 扩展崩溃)、failed to set rlimit(资源限制太严) - 临时加监控:运行
watch -n1 'ss -s | grep "tcp:"'看 ESTABLISHED 连接是否持续堆积;journalctl -u php-fpm -n 50 -f实时盯住启动/退出事件 - 不要盲目调大
pm.max_children——先用top -c看单个 php-fpm 进程实际内存占用,再算总内存余量;否则可能引发 OOM killer 杀进程,反而更频繁 502
ThinkPHP 等框架 PATH_INFO 解析失败是隐藏雷区
尤其部署 ThinkPHP 5.x/6.x 时,Nginx 默认不传 PATH_INFO,PHP-FPM 收到空路由后直接 exit,Nginx 就判定“上游无响应”返回 502:
- 检查 Nginx 配置中
location ~ \.php(.*)?$块里有没有fastcgi_param PATH_INFO $1——注意$1必须来自正则捕获组,如果写成location ~ \.php$,$1永远为空 - 更稳妥的做法是弃用 PATH_INFO,改用
try_files方式:location / { try_files $uri $uri/ /index.php?$query_string; },让框架从$_SERVER['QUERY_STRING']解析路由 - 验证是否生效:在 PHP 中打印
var_dump($_SERVER['PATH_INFO'] ?? 'MISSING', $_SERVER['QUERY_STRING'] ?? 'EMPTY');,上线前务必实测
真正棘手的 502 往往不是配置漏了一行,而是 PHP-FPM worker 在处理某个慢 SQL 或大文件上传时被系统 kill,或者 SELinux 拦截了 socket 访问——这些不会直接报错,只会静默断连。所以日志要交叉比对,error.log + www-error.log + dmesg -T | tail(看 OOM 记录)缺一不可。


















