根本解法是让nginx主动复用后端连接,必须在upstream块中配置keepalive(如120)、keepalive_requests和keepalive_timeout,并配合proxy_http_version 1.1与proxy_set_header connection '',同时确保后端keepalive超时大于nginx设置,方可切断time_wait源头。

根本解法是让 Nginx 主动复用后端连接,而不是每次请求都新建再关闭——这直接切断 TIME_WAIT 源头。
必须开启 upstream keepalive 连接池
Nginx 默认对每个请求都新建 TCP 连接到后端,即使 HTTP/1.1 本身支持长连接,upstream 层也不自动复用。不配 keepalive,就等于把高频短连接“钉死”在系统里。
- 在 upstream 块中添加 keepalive 120(数值按后端单实例并发能力 × 0.7 设置)
- 确保后端服务(如 Tomcat、Node.js)也开启了 keepalive,并且其超时值 > Nginx 的 keepalive_timeout
- 若后端是 Kubernetes Service 或云 SLB,需确认它不主动中断空闲连接(有些负载均衡器默认 60 秒断连)
配套 HTTP 协议层配置不可省略
只写 keepalive 不生效,HTTP 头和协议版本必须对齐:
- proxy_http_version 1.1 —— 必须显式声明,HTTP/1.0 不识别 keep-alive
- proxy_set_header Connection '' —— 清除客户端可能带的 Connection: close,防止 Nginx 被误导
- proxy_set_header Host $host 和 proxy_set_header X-Real-IP $remote_addr 等基础头保留,不影响复用但保障业务正确性
验证是否真正复用成功
别只看配置文件,要从连接状态确认效果:
- 压测期间执行 ss -tnp | grep :后端端口 | grep ESTAB | wc -l,数量应稳定在 keepalive 设定值附近,而非随 QPS 暴涨
- 对比开启前后 ss -tan state time-wait | wc -l,理想下降幅度应在 70% 以上
- 检查后端 access log 中 connection 字段或响应头,确认返回的是 Connection: keep-alive
内核参数作为辅助兜底
即使启用了 keepalive,突发流量或后端抖动仍可能触发短连接,所以需同步加固系统层:
- 启用 net.ipv4.tcp_timestamps = 1 和 net.ipv4.tcp_tw_reuse = 1(二者必须共存)
- 扩大端口范围:net.ipv4.ip_local_port_range = 1024 65535
- 提升哈希桶容量:net.ipv4.tcp_max_tw_buckets = 200000
- 禁用 tcp_tw_recycle(设为 0),该参数在任何有 NAT 或代理的环境都会引发连接失败











