每次看到 502 别急着重启,按这个顺序看:
- upstream 服务活着吗
docker ps 看容器状态,curl 本地端口。容器 running 但端口不通,多半是进程崩了但容器没退。
- 错误日志说什么
nginx error.log 里 502 前面那行才是真正原因。常见三种:connection refused(后端没监听)、upstream prematurely closed(后端崩了)、no live upstreams(健康检查全挂)。
- 是不是超时被当成 502
后端处理超过 proxy_read_timeout 也会 502。日志里带 upstream timed out 就是这个。
- 连接数打满
worker_connections 不够,表现为偶发 502,压力大时集中出现。
- DNS 缓存
容器重启后 IP 变了,nginx 还缓存着老 IP。用变量加 resolver,或者干脆重启 nginx。
九成情况在第 2 步就能定位,剩下的一成是第 5 步。重启能解决的问题,重启完还得知道为什么。
主楼我们的做法类似,多加了一层人工确认,代价是多点几下。
之前也纠结过这个,最后选了更笨但更稳的方案。
继续逛逛