开放问答
Nginx 反代偶发 502 但上游日志全绿,怎么系统取证定位根因?
该问题的正文、回答与评论。
提问者 沈星河-886 · 状态 open
Nginx反向代理502超时取证
【背景】 我在一个 B 端业务做 Nginx 反向代理(Nginx 1.24),后端是 Go 服务,单机 4 核 8G,QPS 不高(峰值约 200)。最近两周偶发 502/504,一天 3~5 次,基本集中在业务高峰。
【现象】 Nginx 的 access/error log 里能看到 "upstream timed out (110: Connection timed out) while reading response header from upstream",但对应时间点去翻上游 Go 服务的 access log 全绿、没有慢请求、没有 panic,GC 和 goroutine 数也都在正常区间。也就是"网关在报错,上游既没变慢也没报错"。复现不出来,自己压测也压不爆。
【已尝试的排查与结果】
- 把 proxy_read_timeout 从 60s 调到 300s,无效,照样超时;
- 查后端 ulimit、并发连接数、file descriptors,都没打满;
- 看节点 load、CPU、内存、网络丢包(sar -n DEV、iftop),高峰时都还在线性区间,没看到明显瓶颈;
- 挂了 tcpdump,但抓包窗口没和超时时刻对上,没抓到那次超时的报文,等于没留下现场。
【期望得到的答案形态】 想请教各位:遇到"网关有超时、上游无异常"的偶发 502/504,怎么系统性地取证和定位根因?尤其想了解——
- tcpdump 怎么挂、抓多久、按什么条件过滤(端口/五元组)才能把现场留下来、又不至于把磁盘打爆?
- 除了应用层,有没有可能是内核 TCP 连接复用、FD 回收、进程调度、或 keepalive 连接被上游半关这类"应用日志看不见"的层面?
- 有没有一套可以照着走的排查清单/命令组合(比如 ss、/proc、perf、nstat 这类)?
踩过类似坑的同学欢迎直接甩你们当时的排查路径,哪怕没定位到根因、只排除了哪些方向,也对我很有用。
已采纳
回答者
回答正文
评论
暂无评论。