关键要通过 netstat -s 定位丢包/丢连接在协议栈哪一层:tcp timeouts 上升表明 syn 拦截或路由问题;estabresets 突增多因 nginx 主动关闭或客户端异常断连;udp receive buffer errors 增长则反映内核丢包,需调大 rmem_default 或优化日志采集。

排查 Nginx 丢弃连接的深层原因,不能只看 Nginx 日志或连接数,关键要定位丢包/丢连接发生在协议栈哪一层。netstat -s 提供的是内核网络协议栈各层的累计统计,对诊断 Nginx 类应用的连接异常(如 SYN 被静默丢、请求未达 worker、UDP 数据被截断)非常直接有效。
重点关注 TCP 层的 timeouts 和 estabresets
执行 netstat -s | grep -A 3 "Tcp:",不要只盯着 retransmits:
- timeouts 持续上升:说明连接建立(SYN_SENT)或数据传输阶段反复超时,常见于防火墙拦截 SYN 包、路由不可达、或中间设备限速/丢弃,不是 Nginx 自身问题,但会导致客户端感知为“连接失败”
- estabresets 突增:表示已建立连接被主动重置,大概率是 Nginx worker 主动 close(如超时、后端不可用、limit_conn 触发),也可能是客户端异常断连,需结合 Nginx error_log 中 “client closed connection” 或 “upstream prematurely closed” 判断
- retransmits 高 ≠ 本机丢包:它反映的是对端响应慢或路径中段丢包,需在对端同步运行 netstat -s 或抓包比对,单边高值不能归责于本地 Nginx
检查 UDP 相关指标(若 Nginx 启用 UDP 代理或日志转发)
运行 netstat -s -u 或 netstat -s | grep -A 5 "Udp:":
- receive buffer errors 增长:UDP 接收缓冲区满,内核丢弃新到包。即使 Nginx 不直收 UDP,也可能影响 syslog-ng、Fluentd 等日志组件,导致 Nginx 访问日志缺失。可临时调大 net.core.rmem_default 或优化日志采集节奏
- packet receive errors 高:UDP 校验失败或目标端口无监听。若 Nginx 配置了 proxy_pass udp://,需确认上游服务确实在 listen;若为监控上报(如 StatsD),检查端口是否被其他进程占用
- packets to unknown port received:说明有外部流量打到本机一个没程序监听的 UDP 端口,内核静默丢弃——这本身不伤 Nginx,但可能暴露配置疏漏或扫描行为
关联 Nginx 实际连接状态交叉验证
netstat -s 是内核视角,Nginx stub_status 是应用视角,两者偏差揭示瓶颈位置:
- 若 ss -tn state established '( dport = :80 or dport = :443 )' | wc -l 远大于 stub_status 中的 “Active connections”,说明连接已建好,但 Nginx 未及时读取请求(reading 状态堆积),常见于 worker_processes 不足、worker_connections 设置过低、或后端响应极慢阻塞 event loop
- 若大量连接卡在 syn-recv 状态,且 netstat -s 中 timeouts 同步上涨,基本可判定是 SYN 队列溢出(net.ipv4.tcp_max_syn_backlog 不足)或 SYN Cookie 被禁用,而非 Nginx 配置问题
- 大量 time-wait 本身正常,但若伴随 netstat -s 中 “Embryonic RST dropped” 增多,可能说明客户端频繁短连+立即断开,需检查 keepalive_timeout 设置是否合理
注意 netstat -s 的统计特性与陷阱
这个命令输出的是自启动以来的累计值,不是实时速率:
- 单次执行看到某个字段非零,不等于“此刻正在丢包”。必须间隔几秒重复执行,观察 receive buffer errors 或 timeouts 是否稳定增长(例如每秒 +5 以上才值得干预)
- 该统计仅覆盖协议栈软件层,和网卡硬件层无关。如果 ifconfig 或 ethtool 显示 Rx-DRP=0,但 netstat -s 里丢包计数飙升,说明问题一定出在内核网络子系统(如 conntrack 表满、iptables DROP 规则、socket 缓冲区限制),而不是物理链路或驱动
- 容器环境中,netstat -s 查的是宿主机内核统计。若容器网络用的是 host 网络模式,结果直接可用;若为 bridge 或 CNI 插件,需进入容器命名空间执行 ip netns exec 才能获取准确容器侧视图











