Nginx 报 502 和 504 都是网关错误,但原因不同:502 是 upstream 返回了无效响应或连不上,504 是 upstream 超时没响应。
先看 Nginx 错误日志
tail -f /var/log/nginx/error.log
常见的几类:
connect() failed (111: Connection refused):后端没起来,或端口不对connect() to unix socket failed (11: Resource temporarily unavailable):FPM 进程满upstream timed out (110: Connection timed out):后端处理太慢no live upstreams:所有后端都被健康检查摘了
排查顺序
- 后端服务活着吗?
systemctl status php-fpm/ps aux | grep java - 端口通吗?
telnet 127.0.0.1 9000或curl localhost:8080 - 后端日志有没有报错?PHP 看 php-fpm.log,Java 看应用日志
- 是不是慢请求堆积?看 FPM slow log 或应用线程池
- Nginx 超时配置是否合理?
proxy_read_timeout、fastcgi_read_timeout
504 的处理
如果是偶发慢请求,调大超时只能缓解。根治要优化后端:加缓存、异步化、拆分慢接口。把 proxy_read_timeout 从 60s 调到 300s 只是让用户多等 4 分钟,体验更差。
502 的处理
如果是 FPM 进程满,参考上一篇调 pm.max_children,同时排查慢脚本。如果是后端挂了,先恢复服务,再看崩溃原因。
记住:Nginx 只是转发,502/504 的根因基本都在后端。

Comments 4 条评论
504 调大超时只是让用户多等而已
no live upstreams 那次我也懵了
socket 路径写错排查了好久
根因基本都在后端,说得对