Nginx 502错误服务器排查
打开网站看到醒目的 502 Bad Gateway,往往让人一头雾水。
别急,这个错误本质上就是 Nginx 作为反向代理时,没能从后端服务器(比如 PHP-FPM、Node.js 或 Java 应用)拿到有效响应。
下面我按操作顺序带你一步步排查,无论是用命令行还是宝塔面板,都能照着做。
排查前的准备工作
先在服务器上打开终端,或者进入宝塔面板的 SSH 终端。
确保你拥有 sudo 权限。
如果使用面板,大部分服务状态可以直接在面板左侧“服务”或“软件商店”里查看,但命令行会更准确。
第一步:检查后端服务是否在运行
502 最常见的原因是后端服务挂了。
先看看你的后端是什么:
- 如果是 PHP 站点,一般是 php-fpm 服务。执行:
sudo systemctl status php-fpm (CentOS 7+)或 sudo systemctl status php7.4-fpm(按版本改)
- 如果是 Node.js / Python / Java,检查对应进程:
ps aux | grep node或sudo systemctl status your-app-name
如果服务显示 inactive (dead),启动它:sudo systemctl start php-fpm。
然后立即刷新页面,可能就好了。
第二步:紧盯日志,找到具体错误
光看状态很模糊,日志才是关键。
- Nginx 错误日志:默认位置
/var/log/nginx/error.log,用tail -n 50 /var/log/nginx/error.log看最后 50 行。 - PHP-FPM 错误日志:常见路径
/var/log/php-fpm/error.log或/var/log/php7.4-fpm.log,同样tail查看。
常见错误有:
connect() to unix:/var/run/php-fpm.sock failed—— 说明 Nginx 连不上 PHP-FPM 的 socket。检查 socket 路径是否一致,或者重启 php-fpm 重新生成。Primary script unknown—— 通常是 fastcgi 配置中SCRIPT_FILENAME写错了路径。upstream timed out—— 后端响应太慢,需要增加超时时间。
第三步:检查端口和监听状态
如果是 TCP 方式连接后端(比如 Nginx 代理 127.0.0.1:9000),确认端口在监听:
sudo netstat -tlnp | grep 9000
如果没输出,说明 php-fpm 没监听该端口,去 /etc/php-fpm.d/www.conf 检查 listen = 127.0.0.1:9000 是否正确,并重启。
如果你用的是宝塔,可以在面板“软件商店”对应软件的“配置”里直接编辑。
第四步:资源耗尽也是元凶
有时候服务明明在运行,但 502 间歇出现。
查看系统资源:
- 内存:
free -h,看看是否 swap 占用过多。 - 进程数:
ps aux | wc -l,如果进程数接近ulimit -u限制,说明进程资源耗尽。 - PHP-FPM 子进程数:查看
pm.max_children设置,如果并发请求超过这个数,新请求会直接被拒绝,返回 502。适当调大(比如从 50 调到 80),同时监控内存,避免 OOM。
避坑指南
- 重启服务后立刻再看一次状态,确认重启成功。有时候 systemctl 提示启动成功,但实际因为配置错误又退出了。
- 修改配置后一定要 reload 而不是 restart:
sudo systemctl reload php-fpm或nginx -s reload。restart 会导致瞬间中断。 - selinux 或 apparmor 可能阻止 Nginx 连接后端,临时关闭测试:
setenforce 0,如果问题消失再配置策略。 - 如果你用的是宝塔面板内置的 Nginx 防火墙,有时会误封,进面板“安全”里检查。
高频问题解答
Q: 重启所有服务后还是 502?
A: 检查日志提到的具体错误地址。最常见的是 php-fpm socket 路径不匹配,或 fastcgi_pass 写的是 TCP 但服务监听的是 Unix socket。
Q: 502 和 504 有什么区别?
A: 502 表示后端完全没响应(拒绝连接或主动关闭),504 表示后端响应了但时间太长,超时后 Nginx 自己中断了。
Q: 间歇性 502 怎么排查?
A: 用 watch -n 2 'date; curl -I http://localhost' 不断请求,同时在另一个窗口看 tail -f /var/log/nginx/error.log,抓住异常时刻的日志。
如何确认问题已解决
刷新网站,页面正常加载就是最直接的验证。
更稳妥的做法是:
- 用 curl 测试:
curl -I http://你的域名,返回状态码 200。 - 检查日志最后几行没有新的错误。
- 再模拟高并发(100 个并发请求):
ab -n 200 -c 10 http://你的域名/,确保所有请求都成功。
Nginx 502 错误通常不是玄学,只要按日志线索顺藤摸瓜,再配合状态检查和配置调整,绝大多数都能在 10 分钟内解决。
下次遇到,先别急着重启服务器,按本文步骤走一遍,你也能稳如老手。