«

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。

五、脚本本身导致的问题

六、常见坑

  1. 改完 FPM 配置只 reload Nginx,忘了重启 php-fpm,参数不生效。
  2. socket 文件属主和 Nginx 用户不一致,权限拒绝。
  3. SELinux 或防火墙拦了 9000 端口。
  4. 多版本 PHP(7.4/8.0)同时装,起的不是 Nginx 指向的那个 FPM。
  5. 把 502 和 504 混为一谈:502 先查进程和连接,504 先查超时和慢查询。
  6. 容器部署时 FPM 和 Nginx 不在同一网络,主机名解析失败。
  7. 只重启服务不看日志,反复重启却找不到根因。

总结

502 的排查主线:先看 error.log 定原因 → 确认 FPM 在跑 → 核对 fastcgi_pass 与 listen 是否一致 → 看进程池是否打满或被 OOM → 检查脚本权限与内存。定位到具体一行日志,基本就能一次修好。

遇到问题加QQ23979811 协助处理

标签: PHP-FPM Nginx 反向代理 502 Bad Gateway 报错排查