Nginx报502 Bad Gateway排查思路
时间:2026-11-15 07:40 作者:emer 分类: 无
502 Bad Gateway 是 Nginx 反向代理时最常见的报错:Nginx 自己能响应,但它转发给后端(通常是 PHP-FPM 或上游服务)拿不到有效回应,于是返回 502。注意它和 504 不同:504 是后端超时,502 是连接被拒、进程挂掉或返回了非法响应。按下面顺序排查,绝大多数都能定位。
一、先看两个关键日志
# Nginx 错误日志,先看这里
tail -100 /var/log/nginx/error.log
# PHP-FPM 日志
tail -100 /var/log/php-fpm/error.log
Nginx error.log 会直接写出原因,比如 connect refused、upstream prematurely closed、recv() failed,对应不同病根。
二、检查 PHP-FPM 是否在运行
systemctl status php-fpm
# 或按版本名 php74-fpm
ps aux | grep php-fpm
进程没起来,Nginx 连不上端口或 socket,就是 502。先把它启动:
systemctl start php-fpm
systemctl enable php-fpm
三、检查监听端口或 Socket 是否匹配
Nginx 配置里 fastcgi_pass 要和 FPM 监听一致。常见两种:
# 方式一:TCP 端口
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 方式二:Unix Socket
fastcgi_pass unix:/run/php-fpm/www.sock;
对照 FPM 的 www.conf:
listen = 127.0.0.1:9000
; 或
listen = /run/php-fpm/www.sock
两边不一致,Nginx 连不上就 502。
四、FPM 进程池耗尽或崩溃
并发高、php-fpm 子进程被打满,新请求接不住。看 www.conf 的 pm 参数:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.max_requests = 500
# 查看当前 FPM 进程数
ts=$(ps -C php-fpm -o pid= | wc -l); echo $ts
内存不足时 FPM 会被 OOM 杀掉,dmesg 里找 out of memory。
五、脚本本身导致的问题
- PHP 段错误、内存超限(memory_limit)、执行超时,FPM worker 崩溃,连接被中断,Nginx 报 upstream prematurely closed。
- 文件权限:Nginx 读不到 PHP 文件、或 FPM 无执行权限,也会 502。
- SCRIPT_FILENAME 路径写错,FPM 找不到脚本。
六、常见坑
- 改完 FPM 配置只 reload Nginx,忘了重启 php-fpm,参数不生效。
- socket 文件属主和 Nginx 用户不一致,权限拒绝。
- SELinux 或防火墙拦了 9000 端口。
- 多版本 PHP(7.4/8.0)同时装,起的不是 Nginx 指向的那个 FPM。
- 把 502 和 504 混为一谈:502 先查进程和连接,504 先查超时和慢查询。
- 容器部署时 FPM 和 Nginx 不在同一网络,主机名解析失败。
- 只重启服务不看日志,反复重启却找不到根因。
总结
502 的排查主线:先看 error.log 定原因 → 确认 FPM 在跑 → 核对 fastcgi_pass 与 listen 是否一致 → 看进程池是否打满或被 OOM → 检查脚本权限与内存。定位到具体一行日志,基本就能一次修好。
遇到问题加QQ23979811 协助处理