nginx 本身不提供原生 tcp 丢包计数器,需结合 stub_status 连接变量、error.log 错误信号(如 upstream timed out、connection reset by peer)及系统指标(netstat -s 重传统计、ss -i retrans、ethtool 网卡丢包)交叉分析,定位丢包发生环节。

直接看 TCP 丢包,Nginx 本身不提供原生的“丢包计数器”,它不是网络层设备,无法捕获链路层或内核收发队列丢弃的数据包。真正要定位 TCP 丢包,得结合系统级指标和 Nginx 可观测变量交叉分析——重点不是让 Nginx “统计丢包”,而是用它的日志、连接状态与错误信号,反向推断丢包发生的环节和诱因。
关注 Nginx 连接级关键变量
Nginx 的 $connection、$connections_active、$connections_reading、$connections_writing、$connections_waiting 等内置变量,可通过 stub_status 模块暴露为实时指标。它们虽不等于丢包数,但异常波动能提示问题方向:
- connections_active 持续高位 + waiting 长期为 0:说明连接积压在读写阶段,可能后端响应慢或网络延迟高,容易触发 TCP 重传甚至超时断连
- connections_writing 突增且长时间不降:Nginx 正在大量向客户端发送响应,若此时服务器带宽打满或网卡中断处理不及时,内核可能丢弃发送队列中的包(如 tx_dropped 上升)
- stub_status 中 connections_active 忽然归零又暴涨:可能是大量连接被内核强制重置(RST),常见于防火墙拦截、SYN flood 防护触发或中间设备异常
从 error.log 挖掘丢包相关错误信号
丢包本身不会直接记为“xxx packet dropped”,但会引发一系列可记录的失败行为。重点关注以下几类日志条目:
- “upstream timed out”:后端无响应,可能因中间链路丢包导致 SYN/ACK 或数据包未达,Nginx 等待超时后关闭连接
- “client closed connection while waiting for upstream”:客户端主动断开,常因前端网络不稳定(如移动网络切换、WIFI 断续)造成 ACK 丢失,TCP 重传失败后浏览器放弃
- “recv() failed (110: Connection timed out)” 或 “(104: Connection reset by peer)”:前者指向读超时,后者多为对端异常终止,二者都与底层丢包/乱序高度相关
- 大量 “*n connect() failed (111: Connection refused)”:虽是连接拒绝,但如果集中在某台 upstream,也可能是该节点因丢包导致健康检查失败而被摘除
配合系统指标做闭环验证
仅靠 Nginx 日志和变量不够,必须联动操作系统层面数据才能确认是否真发生丢包:
- 用 ss -i 查单个连接的 retrans(重传次数)、rto(重传超时)、qloss(队列丢包)字段
- 用 netstat -s | grep -A 5 -B 5 "segments retransm" 统计全系统 TCP 重传总量
- 检查网卡收发队列:ethtool -S eth0 | grep -E "(drop|buffer|overrun)",重点关注 rx_missed_errors、tx_aborted_errors
- 对比同一时段 Nginx 的 upstream_response_time 分位值与 upstream_connect_time,若 connect_time 延迟激增但 response_time 正常,大概率是建连阶段丢包(SYN 包丢失)
针对 TCP 代理场景的特别注意点
如果你启用了 stream 模块做四层代理(如数据库、Redis、自定义 TCP 服务),需额外关注:
- stream 块中必须配置 proxy_timeout 和 proxy_responses,否则长连接空闲时易被中间设备(如云厂商 SLB、防火墙)静默断连
- 启用健康检查时,check interval 不宜过短(建议 ≥3s),避免探测包密集发送加剧链路压力
- stream 日志默认不开启,需显式添加 access_log /var/log/nginx/stream_access.log 并使用 $status、$upstream_addr、$bytes_sent 等变量,便于比对收发字节数差异
- 确保 tcp_nodelay on 和 tcp_nopush on 在 stream 块中合理启用,减少小包粘连与延迟











