nginx反向代理高效复用长连接需主动可控回收:客户端连接通过keepalive_timeout(15–30s)和keepalive_requests(100–1000)协同管理;upstream连接池需合理设置upstream keepalive数、启用reset_timedout_connection,并与后端keepalive_timeout匹配;配合least_conn算法、内核参数调优及worker_connections充足,再通过ss命令与指标验证回收合理性。

要让 Nginx 反向代理真正高效复用长连接,关键不是“尽量留着连接”,而是让连接在合适的时间点被主动、可控地回收——既避免过早断开浪费复用价值,又防止长期空闲拖慢资源周转。
控制客户端到 Nginx 的连接生命周期
这段连接由 Nginx 主动管理,需协同设置两个参数,缺一不可:
- keepalive_timeout:设为 15–30 秒较稳妥。过长(如 60s+)会让空闲连接滞留在 reusable 队列尾部,成为后续高并发时首批被强制清理的对象;过短则复用率下降,建连压力反升
- keepalive_requests:建议设为 100–1000。限制单连接处理请求数,防止单个慢请求或异常响应长期占用连接槽位;QPS 极高时可适度调高,但不宜盲目设到 10000+,否则空闲连接易被后端主动断开
收紧 Nginx 到 upstream 的连接池行为
这是回收机制最易失控的环节,必须精细调控:
- upstream keepalive N:每个 worker 进程最多缓存 N 个空闲连接。推荐值 ≈(预估峰值并发 ÷ worker_processes)× 0.8~1.2。例如并发 4000、4 个 worker,设为 800~1200;设太大易堆积,太小则频繁重建
- reset_timedout_connection on:对超时未活动的 upstream 连接主动发 RST,加速内核状态清理,避免 linger 在 FIN_WAIT2 或 TIME_WAIT 状态
- 确保后端服务自身 keepalive_timeout(如 Tomcat 的 connectionTimeout)略大于 Nginx 的 proxy_read_timeout,防止后端先断而 Nginx 不知情
配合调度策略与内核参数减少被动回收
连接回收常发生在连接池满、Nginx 被迫驱逐时,可通过以下方式降低触发概率:
- 启用 least_conn 负载均衡算法:优先将请求分发给当前活跃连接数最少的后端,避免单点连接积压
- 调优内核参数:net.ipv4.tcp_tw_reuse = 1(允许 TIME_WAIT 套接字用于新 outbound 连接)、net.ipv4.tcp_fin_timeout = 30(加快 FIN_WAIT2 清理)
- 检查 worker_connections 是否足够:总可用连接数 ≥ worker_processes × keepalive × 后端节点数 × 并发系数,否则连接池本身就成了瓶颈
验证回收是否合理
不能只看配置,要用数据判断:
- 用 ss -tnp | grep :
| wc -l 观察 ESTABLISHED 连接数是否稳定在 upstream keepalive 设定值附近,而非剧烈波动 - 对比开启优化前后:TIME_WAIT 数量、P95 延迟变化、后端连接建立耗时
- 检查后端响应头是否含 Connection: keep-alive,确认上游未主动关闭连接











