错误“connect() failed (110: Connection timed out) while connecting to upstream”表明Nginx在TCP连接建立阶段超时,根本未连上后端;需排查端口连通性、防火墙(如iptables环回策略)、容器网络、系统accept队列溢出(ss -lnt查看Recv-Q)、proxy_connect_timeout与后端listen.backlog匹配性及抓包定位SYN丢弃点。

直接看错误日志里有没有 “connect() failed (110: Connection timed out) while connecting to upstream” 或类似提示。这类 502 不是后端处理慢,而是 Nginx 根本连不上后端——连接阶段就卡住了。
检查上游服务是否真正可连通
别只看服务进程在不在,要验证 TCP 层是否能建连:
- 用
telnet 127.0.0.1 8080或nc -zv 127.0.0.1 8080测试端口是否响应(注意:不是 ping,是端口连通性) - 如果本地能通、Nginx 却连不上,检查是否用了非 loopback 地址(如 192.168.x.x),确认网络路由和防火墙放行
- 若后端是容器或云环境,确认宿主机与容器网络互通,且端口映射正确
排查系统 accept 队列是否溢出
这是高并发下最隐蔽也最常见的连接超时根因:后端虽在运行,但新连接进不去队列,Nginx 等不到 SYN-ACK 就超时返回 502。
- 执行
ss -lnt查看后端监听端口的Recv-Q值;若持续 ≥somaxconn(默认常为 128),说明队列已满 - 查当前系统限制:
sysctl net.core.somaxconn;Spring Boot 默认accept-count=100,取两者最小值即实际队列长度 - 临时调大:
sudo sysctl -w net.core.somaxconn=4096;永久生效写入/etc/sysctl.conf
核对 Nginx 连接超时与后端配置是否匹配
proxy_connect_timeout 控制 Nginx 主动发起连接并等待三次握手完成的时间。它必须小于后端的连接接受能力窗口。
- 检查 Nginx 配置中是否有显式设置:
proxy_connect_timeout 5s;(常见于高可用场景) - 对比后端服务的连接建立耗时:比如 Tomcat 的
connectionTimeout、PHP-FPM 的listen.backlog,确保不比 Nginx 的 connect 超时还短 - 若后端启用了连接池或长连接,确认 Nginx
upstream中启用了keepalive,避免高频重建连接压垮队列
抓包确认连接失败具体位置
当以上都看似正常,但问题仍偶发,用抓包定位真实断点:
- 在 Nginx 机器上运行:
tcpdump -i any port 8080 -w upstream_conn.pcap - 复现一次 502 后停止抓包,用 Wireshark 打开,筛选
tcp.flags.syn == 1 and ip.dst == 后端IP - 观察是否有 SYN 发出但无 SYN-ACK 返回 → 说明被后端丢弃(队列满/防火墙/DROP)
- 若有 SYN-ACK 但后续无 ACK → 可能是中间网络设备干扰或后端内核参数异常


















