核心是调优upstream keepalive连接池:设N为128–256(单IP),匹配后端并发能力;配proxy_http_version 1.1、proxy_set_header Connection '';启用proxy_socket_keepalive防静默断连;keepalive_requests设1000–10000,keepalive_timeout设30–45s且严格小于源站超时。

要压榨集群网关回源的带宽红利,核心不是堆带宽或升带宽单价,而是让每条 TCP 连接跑得更满、复用得更久、断得更少——这正是 keepalive 连接池调优的发力点。带宽利用率低,往往不是物理链路空闲,而是大量请求在反复握手、慢启动、重传中把有效传输时间吃掉了。
精准设置 upstream keepalive 数值,匹配后端吞吐能力
keepalive N 不是越大越好,它代表每个 worker 进程为单个 upstream server(IP+端口)缓存的空闲连接上限。设小了,池子一空就建连;设大了,可能挤占后端连接资源,甚至触发端口耗尽或 TIME_WAIT 暴涨。
- 建议起步值设为后端单实例稳定并发连接数的 60%~80%:例如后端 Tomcat maxConnections=200,这里设 120~160
- 若 DNS 解析出多个 IP(如 origin.example.com → 10.0.1.10, 10.0.1.11),每个 IP 独立维护一个池子,总空闲连接数 = N × IP 数
- 高并发 CDN 回源场景可设为 128–256,但超过 512 需同步检查系统级 fd 限制(ulimit -n)和后端连接池水位
延长单连接生命周期,提升复用密度
一条 TCP 连接一旦建立,后续请求直接发送,省下 1.5 RTT 握手 + TLS 开销 + 慢启动窗口重建。要让它多服务几次,就得靠 keepalive_requests 和 keepalive_timeout 协同控制。
- keepalive_requests 建议设为 1000–3000(HTTP/1.1 RPC)、5000–10000(gRPC/HTTP/2),前提是后端 maxKeepAliveRequests 或 idle_timeout ≥ 对应值
- keepalive_timeout 推荐 30–45s:必须严格小于后端空闲超时(如后端设 75s,Nginx 最多设 60s),高频回源场景取下限更稳妥
- 禁用 keepalive_disable msie6 等过时指令,避免误判现代客户端协议能力
防静默断连:用 proxy_socket_keepalive 主动探活
中间防火墙、云 LB、NAT 设备常在 60–90 秒静默丢弃空闲连接,不发 RST。Nginx 若未察觉,仍往该 socket 发请求,就会触发 connection reset by peer 或 502/504。
- 启用 proxy_socket_keepalive on 60s 5s 3:空闲 60 秒后开始探测,每 5 秒发一次 TCP keepalive 包,连续 3 次无响应即关闭 socket
- 该机制与 HTTP 层 Connection: keep-alive 无关,是内核级保活,解决“连接看起来还在,其实已断”的问题
- 需确认后端服务本身支持并维持长连接(如 Tomcat 的 keepAliveTimeout > Nginx 的 keepalive_timeout)
确保协议与头部协同生效
即使 upstream 配好了 keepalive,若协议或头部不匹配,连接照样被主动断开,池子形同虚设。
- location 中必须加 proxy_http_version 1.1;,HTTP/1.0 不支持持久连接
- 必须加 proxy_set_header Connection '';,清除客户端可能带的 Connection: close,防止 Nginx 自动注入关闭头
- 检查源站响应是否稳定返回 Connection: keep-alive;若被 WAF、CDN 中间层删掉或改写,复用会失效
- 源站若支持 HTTP/2,可升级为 proxy_http_version 2.0;,配合 TLS 配置,进一步降低多路复用延迟


















