轮询模式本身不造成网络分片或丢包,它只是应用层请求调度逻辑;所谓“轮询下的网络分片丢包”是混淆了nginx调度与网络层传输两个层面的问题,排查须先确认是否真丢包、再分层定位丢包环节。

轮询模式本身不造成网络分片或丢包,它只是请求调度逻辑。所谓“轮询下的网络分片丢包”,实际是把两个不同层面的问题混在一起了:Nginx的应用层请求分发和网络层IP分片与传输可靠性无关。排查方向必须先拆开——先确认是不是真丢了包,再看丢在哪个环节。
先验证是否真存在丢包,而不是轮询导致的错觉
浏览器刷新、curl重复请求看到“偶尔超时”或“某台后端没日志”,不等于网络丢包。常见干扰包括:
- 后端服务响应慢(比如数据库卡住),Nginx默认60秒超时,用户感知为“请求失败”,实则是业务延迟而非丢包
- 客户端或中间网络设备(如防火墙、运营商网关)主动中断长连接,表现为TCP RST,容易误判为丢包
- 浏览器复用Keep-Alive连接,连续请求可能落在同一台后端,打破轮询“均匀感”,让人怀疑分发异常
分层定位丢包发生位置
按 OSI 模型从下往上查:
-
物理/链路层:登录每台后端服务器,运行
ping -s 1472 <nginx-ip></nginx-ip>(含IP头28字节,凑满1500 MTU),逐步增大包大小测试是否开始丢包;同时检查netstat -s | grep -i "fragments"看是否有分片重组失败 -
网络层:在 Nginx 机器上抓包:
tcpdump -i any host <backend-ip> and port 80 -w debug.pcap</backend-ip>,用 Wireshark 打开,过滤icmp || tcp.flags.reset == 1,确认是否有 ICMP “Fragmentation needed” 或 TCP 重传激增 -
传输层:检查 Nginx 和后端之间是否存在不对称路径(如某方向走专线、另一方向走公网),导致 MSS 协商失败,触发分片;用
ss -i查看连接的mss值是否一致
轮询配置本身需排除的干扰点
虽然轮询不引发丢包,但不当配置会放大问题表现:
- 未设置
proxy_next_upstream error timeout http_502 http_503 http_504;,导致单次失败就返回错误,掩盖了后端真实可用性 - 健康检查缺失,故障节点仍参与轮询,请求发过去后 TCP SYN 被拒绝(RST),看起来像“发出去没回音”
- 后端服务监听在
127.0.0.1而非0.0.0.0,Nginx 可连通但仅限本机回环,跨机器访问必然失败
快速自检清单
执行以下命令,5分钟内可初步圈定范围:
- 在 Nginx 机上:
ping -c 4 <backend1-ip> && ping -c 4 <backend2-ip></backend2-ip></backend1-ip>—— 看基础连通性 - 在 Nginx 机上:
telnet <backend1-ip> 80</backend1-ip>—— 验证端口可达且无防火墙拦截 - 在每台后端上:
netstat -tnlp | grep :80—— 确认监听地址和进程正常 - 查看 Nginx error.log 中是否高频出现
connect() failed (111: Connection refused)或Connection timed out











