nginx反向代理连接回收需主动设计生命周期:客户端侧设keepalive_timeout(15–30s)和keepalive_requests(1000–10000);上游侧启用http/1.1并清空connection头,后端返回keep-alive响应;upstream keepalive值按峰值并发/worker数×1.2设定,配合least_conn调度;内核调优tcp_tw_reuse、tcp_fin_timeout等参数,并开启reset_timedout_connection;避免free_connections耗尽触发lru清理。

要让 Nginx 在反向代理场景下更合理地回收与后端服务器的连接,关键不是“等连接出问题再清理”,而是提前设计好连接的生命周期边界,让空闲连接在可控时间内主动退出,避免堆积、争抢和被动驱逐健康连接。
打通上下游长连接链路
连接回收的前提是连接能真正复用。很多回收异常其实源于链路未打通:
- 客户端到 Nginx:确保 keepalive_timeout(建议 15–30s)和 keepalive_requests(建议 1000–10000)协同设置,避免连接刚复用几次就被强制关闭
- Nginx 到 upstream:必须显式启用 HTTP/1.1 并清空 Connection 头——proxy_http_version 1.1 和 proxy_set_header Connection "" 缺一不可;否则默认走 HTTP/1.0 短连接,upstream.keepalive 完全无效
- 后端服务需返回
Connection: keep-alive响应头(主流框架如 Node.js、Spring Boot 默认支持)
精细控制 upstream 连接池行为
upstream 的 keepalive 不是越大越好,它直接影响每个 worker 进程对后端连接的持有策略:
-
keepalive N 表示每个 worker 最多缓存 N 个空闲连接到该 upstream;总容量 =
worker_processes × N - 推荐初始值按
(预估峰值并发 ÷ worker_processes) × 1.2计算,例如 4 个 worker、峰值 5000 并发,可设为 1500 - keepalive_requests 建议设高(如 10000),防止单连接因请求数超限被过早淘汰;但不宜远超业务实际,否则空闲连接长期滞留
- 搭配 least_conn 调度算法,动态避开连接数已高的后端节点,缓解局部连接积压
协同内核加速 TCP 状态流转
Nginx 不管理 TCP 状态机,但连接能否快速释放,高度依赖内核对 TIME_WAIT、FIN_WAIT2 等状态的处理:
- net.ipv4.tcp_tw_reuse = 1:允许将处于 TIME_WAIT 的 socket 用于新的 outbound 连接(反向代理场景效果显著)
- net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT2 超时时间,加快被动关闭连接的释放
- net.core.somaxconn = 65535 和 net.core.netdev_max_backlog = 5000:防止 SYN 队列溢出,保障新连接顺利进入可复用流程
- 配合 Nginx 的 reset_timedout_connection on,对超时空闲连接主动发 RST,加速内核状态清理
避免被动回收触发机制
Nginx 在 free_connections 耗尽时会调用 ngx_drain_connections(),最多清理 32 个最久未用的 reusable 连接(LRU 策略)。这是性能拐点,应从源头规避:
- 不要盲目调大 keepalive_timeout(如设为 65s+),否则连接会长期挂起在队列尾部,成为首批被清理对象
- 检查 worker_connections 是否足够:需满足
≥ keepalive × upstream server 数 × 并发系数,否则连接池本身成瓶颈 - 监控
nginx_stub_status中的 Active connections 和 Writing 数值,结合ss -ant | grep :port | wc -l观察真实连接分布,验证回收是否频繁发生











