真正提升网关回源性能需构建覆盖协议层、连接池、socket层和源站配合的上游连接复用机制;必须同时配置proxy_http_version 1.1、proxy_set_header Connection ""和upstream keepalive N,并协同调整keepalive_requests、keepalive_timeout及proxy_socket_keepalive参数。

要真正提升网关回源性能,关键不是调大 keepalive_timeout,而是构建一套协同生效的上游连接复用机制。它必须覆盖协议层、连接池、socket 层和源站配合四个环节,缺一不可。
必须配齐的三项基础配置
只写 keepalive 32 不会起作用。以下三者必须同时存在:
-
启用 HTTP/1.1 协议转发:在
location块中添加proxy_http_version 1.1;。HTTP/1.0 默认不支持长连接,Nginx 不会尝试复用。 -
清空 Connection 请求头:添加
proxy_set_header Connection "";。否则 Nginx 可能继承客户端传来的Connection: close,导致后端主动断连。 -
声明 upstream 空闲连接池大小:在
upstream块内设置keepalive N;(例如keepalive 64;),表示每个 worker 进程为该后端缓存最多 N 个空闲连接。
合理设置 keepalive 与生命周期参数
这三个参数需协同调整,不能孤立设定:
-
keepalive N:建议值 = 后端单实例稳定承载并发数 × 0.6~0.8。例如 Tomcat
maxConnections=200,则设为 120~160;若后端较轻量,32–64 是稳妥起点。 - keepalive_requests M:单连接最大请求数,默认 100。建议设为 1000~5000,避免因计数耗尽而提前断连;过高可能加剧后端连接压力,需结合监控观察。
-
keepalive_timeout T:空闲连接在 Nginx 池中保留时长(秒)。必须小于源站的
keepalive_timeout(如源站设 75s,Nginx 设 60s 或 55s),生产推荐 30–60s。
补充 socket 层保活防静默中断
中间设备(防火墙、云 LB)常默认 60s 清理空闲连接,导致连接“无声断开”。仅靠 HTTP keep-alive 无法感知:
- 添加
proxy_socket_keepalive on 60s 5s 3;:空闲 60 秒后开始探测,每 5 秒发一次 TCP keepalive 包,连续 3 次无响应则关闭连接。 - 该指令作用于 upstream 连接池中的每个 socket,与 HTTP 头无关,专治“连接还在但已失效”的问题。
- 确认源站服务本身支持并维持长连接,如 Spring Boot 的
server.tomcat.connection-timeout应 ≥ 75s。
验证是否真正生效的实操方法
不能只看配置是否加载成功,要从系统行为和网络状态判断:
- 执行
ss -tnp | grep :源站端口 | grep ESTAB | wc -l,观察连接数是否稳定在keepalive设定值附近,而非随 QPS 剧烈波动。 - 在源站 access log 中启用
$connection_requests变量,查看同一连接处理的请求数是否持续 >1。 - 抓包检查回源请求是否复用相同源端口和目的端口组合,且响应头中不含
Connection: close。


















