核心思路是让连接“多干活、少新建”,通过nginx两端keepalive(客户端侧与upstream侧)复用tcp连接,大幅降低短连接频率,从而从源头压制time_wait生成;再配合tcp_tw_reuse=1等内核参数实现端口快速复用与释放。

核心思路是让连接“多干活、少新建”,从源头减少短连接数量,从而直接压制 TIME_WAIT 的产生量。keepalive 本身不消除 TIME_WAIT,但能大幅降低其生成频率。
明确 keepalive 的作用边界
keepalive 是 HTTP 层的复用机制,它让单个 TCP 连接承载多个 HTTP 请求。只要客户端(如浏览器)和 Nginx 之间、Nginx 和后端服务(如 Tomcat)之间都启用了 keepalive,就能避免每请求都新建+关闭 TCP 连接。这意味着:一个连接生命周期内处理几十甚至上百个请求,只产生 1 次 TIME_WAIT(在连接最终关闭时),而不是每个请求都产生 1 次。
Nginx 到客户端的 keepalive 配置
这部分控制浏览器与 Nginx 之间的长连接,是减少前端发起短连接的关键:
- keepalive_timeout 65s; —— 设置连接空闲 65 秒后关闭。比默认 75 秒更激进一点,兼顾复用率与资源释放速度;设为 0 则完全禁用,不推荐
- keepalive_requests 1000; —— 单个长连接最多处理 1000 个请求。达到即断开,防止连接长期占用资源;默认 100 偏低,调高可进一步摊薄 TIME_WAIT 密度
- 确保客户端请求头带 Connection: keep-alive(HTTP/1.1 默认行为,一般无需额外设置)
Nginx 到后端服务的 keepalive 配置
这部分决定 Nginx 是否复用与上游(如 Java 应用、Python 服务)的连接,对缓解本机端口耗尽尤为关键:
- 在 upstream 块中添加:keepalive 200; —— 表示为该 upstream 维护最多 200 个空闲长连接(注意:这不是并发上限,而是连接池大小)
- 在 location 或 server 块中配置代理参数:
- proxy_http_version 1.1;
- proxy_set_header Connection ''; —— 清空客户端传来的 Connection 头,避免干扰后端判断
- proxy_set_header Host $host;(保持原有逻辑)
- 后端服务自身也需支持 keepalive(如 Tomcat 的 connector 中 keepAliveTimeout > 0,maxKeepAliveRequests 合理设置)
配合内核参数形成闭环
keepalive 解决“建得少”,内核参数解决“关得快、复用快”:
- net.ipv4.tcp_tw_reuse = 1 —— 允许 TIME_WAIT 端口被新连接复用(仅对客户端有效,Nginx 作为反向代理时正是客户端角色)
- net.ipv4.tcp_timestamps = 1 —— tcp_tw_reuse 的强制前提,现代内核通常默认开启,但建议显式写入 /etc/sysctl.conf
- net.ipv4.ip_local_port_range = 1024 65535 —— 扩大可用临时端口范围,为复用提供更大空间
- net.ipv4.tcp_fin_timeout = 30 —— 加速 FIN_WAIT_2 阶段释放,间接缓解 TIME_WAIT 积压节奏
执行 sysctl -p 生效后,再配合 keepalive,才能真正把端口枯竭风险压到最低。











