Nginx 后面接负载均衡,502/504 到底该先查哪里?

线上出现 502 Bad Gateway 或 504 Gateway Timeout 时,很多团队第一反应是重启 Nginx,或者把所有 timeout 都调大。这个做法通常只能短暂缓解,不能定位真正故障点。

在云服务器环境里,请求链路往往不是"用户直连 Nginx"这么简单,而是:浏览器或 App → CDN/WAF → 云负载均衡 → Nginx 反向代理 → 应用进程 → 数据库/缓存/第三方接口。502 和 504 的根因可能出现在任何一层。

这篇文章给一套生产可执行的排障顺序:先判断错误由哪一层返回,再看连接、超时、应用日志和资源瓶颈,最后再决定是否调整 Nginx、负载均衡或应用配置。

一、先区分 502 和 504

502 更像"上游返回了坏响应"或"上游连接失败"。常见原因包括:应用进程没启动、端口不通、Unix Socket 权限错误、后端主动断开、Nginx 配置指向错误端口。

504 更像"网关等太久没等到上游响应"。常见原因包括:应用执行时间过长、数据库慢查询、第三方接口卡住、负载均衡 idle timeout 小于应用处理时间、Nginx proxy_read_timeout 过短。

先看状态码含义,可以避免把 504 当成 Nginx 本身故障,也避免把 502 当成单纯的超时问题。

二、第一步:确认错误是谁返回的

先用 curl 看响应头。不同层返回的 Server、Via、X-Cache、X-Amzn-Trace-Id、X-Request-Id 等头信息不同。

bash 复制代码
curl -I https://example.com/api/health
curl -v https://example.com/api/slow 2>&1 | tee /tmp/curl-debug.log

如果响应头显示来自 CDN 或 WAF,要去查 CDN/WAF 访问日志;如果来自负载均衡,要查负载均衡目标组健康状态和访问日志;如果来自 Nginx,要查 Nginx error.log 和 upstream 连接情况。

三、第二步:看 Nginx error.log

Nginx 的 error.log 往往直接给出方向。

bash 复制代码
sudo tail -n 200 /var/log/nginx/error.log
sudo grep -E "upstream|timed out|connect\(\)|recv\(\)" /var/log/nginx/error.log | tail -n 50

典型关键字可以这样判断:

  • connect() failed:Nginx 连不上上游,优先查应用端口、监听地址、安全组、防火墙;
    • upstream timed out:上游响应慢,优先查应用耗时、数据库、第三方接口;
    • upstream prematurely closed connection:上游进程提前断开,优先查应用崩溃、超时退出或内存 OOM;
    • no live upstreams:upstream 配置的后端都不可用,优先查健康检查和 upstream 配置。

四、第三步:确认上游应用是否真的可达

在 Nginx 所在机器上直接访问上游,比从外网访问更能定位问题。

bash 复制代码
curl -I http://127.0.0.1:8080/health
curl -I http://10.0.1.23:8080/health
ss -lntp | grep 8080
systemctl status your-app
journalctl -u your-app -n 100 --no-pager

如果本机访问上游都失败,就不要继续调 Nginx timeout,先修应用进程、端口监听或网络策略。

五、第四步:检查 timeout 链是否一致

很多 504 是 timeout 链配置不一致导致的。例如云负载均衡 idle timeout 是 60 秒,Nginx proxy_read_timeout 是 120 秒,应用接口实际要跑 90 秒。此时用户可能先被负载均衡断开,而 Nginx 和应用还在等待。

常见 Nginx 配置示例:

nginx 复制代码
location /api/ {
    proxy_pass http://backend;
        proxy_connect_timeout 5s;
            proxy_send_timeout 30s;
                proxy_read_timeout 60s;
                    proxy_next_upstream error timeout http_502 http_503 http_504;
                    }
                    ~~~
这里不是建议把所有 timeout 都调很大。更合理的做法是按业务接口分类:健康检查和普通 API 要短;导出、AI 推理、批处理等长任务要异步化,或单独走更长超时的路由。

## 六、第五步:排查资源瓶颈

如果 error.log 指向 upstream timed out,要继续看应用服务器资源。

~~~bash
top
free -h
df -h
iostat -xz 1
sar -n TCP,ETCP 1 5

CPU 跑满、内存不足、磁盘 IO 高、连接数耗尽、数据库慢查询,都会表现为 Nginx 等不到上游响应。

七、生产排障顺序

  1. 看用户报错时间和范围:全站、单接口、单地区、单机房;
    1. 用 curl -I 判断返回层级;
    1. 查 Nginx access.log 和 error.log;
    1. 在 Nginx 机器上直连上游应用;
    1. 查应用日志、系统资源、数据库慢查询;
    1. 对齐 CDN、负载均衡、Nginx、应用的 timeout;
    1. 修复后补监控:5xx 比例、 upstream_response_time、request_time、目标组健康状态。

八、建议加上的日志格式

Nginx 默认日志不一定够用,建议加入 upstream 相关字段。

nginx 复制代码
log_format main_ext "$remote_addr $request $status "
                    "rt=$request_time urt=$upstream_response_time "
                                        "uct=$upstream_connect_time uht=$upstream_header_time "
                                                            "ua=$upstream_addr";
                                                            access_log /var/log/nginx/access.log main_ext;
                                                            ~~~
有了 request_time 和 upstream_response_time,才能判断是客户端慢、Nginx 慢、上游慢,还是某个后端实例异常。

## 九、结论

502/504 不要先重启,也不要先盲目调大 timeout。正确顺序是:确认返回层级、读 error.log、直连上游、看应用和资源、对齐 timeout、补日志和监控。

如果你的线上服务经常出现 502/504,建议先把链路图、日志字段和超时矩阵补齐。排障不是靠经验猜,而是靠证据把故障层级逐步缩小。

参考资料:NGINX 官方文档、AWS Elastic Load Balancing 504 错误文档、Amazon CloudFront 504 文档、Linux man pages。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/921acf3ec2a34e099c2e116c74d4d823.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b2f180294b94466780b1d5cfabc294ec.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c7e3fe9461134e9fa18d3a06560591c4.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cf528ee7d473464294af7f1c591425a5.png#pic_center)
相关推荐
刘某的Cloud2 小时前
Galera Cluster部署 mariadb 节点down机,log sequence number恢复
linux·运维·数据库·负载均衡·mariadb·集群·高可用
小此方2 小时前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
二宝哥3 小时前
CentOS 7.9 离线安装 Nginx 并配置openssl1.1.1
linux·nginx·centos
程序员老陆4 小时前
说一说FFmpeg6在Linux平台的编译
linux·运维·服务器·ffmpeg
玫幽倩4 小时前
2026黄河流域公安院校-电子物证单项赛(程序逆向分析+服务器取证)
运维·服务器·python·电子取证·逆向·程序分析·服务器取证
赵民勇5 小时前
systemd-cgtop命令详解
linux·运维
Zhu7585 小时前
在docker环境部署frp
运维·docker·容器
运维行者_5 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
March.s6 小时前
Nginx 服务器反向代理实战指南
服务器·nginx·github