要让 Nginx upstream 连接池真正复用长连接,必须协同配置 keepalive(按后端能力×0.6~0.8÷worker数设定)、keepalive_requests(500~5000)、keepalive_timeout(比后端idle timeout小5~10秒),并在location中显式设置proxy_http_version 1.1和proxy_set_header Connection '',且keepalive指令须严格置于upstream块内。
要让 Nginx 的 upstream 连接池真正复用长连接、降低建连开销和后端压力,不能只写一行 keepalive 32。必须协议、头部、连接池三者对齐,参数协同调优,并结合后端实际能力设置。
它表示每个 worker 进程为该 upstream 中每台后端服务器最多缓存的空闲长连接数,不是总连接上限,也不等于并发数。
maxConnections=200,4 个 worker → 推荐设 keepalive 32 或 48
keepalive 96
仅配置 keepalive 不起作用。以下三项缺一不可:
keepalive_requests 1000;:单个空闲连接最多转发 1000 次请求后关闭,默认 100 太保守,API 场景推荐 500~5000keepalive_timeout 30s;:空闲连接在池中保留时间,必须比后端 idle timeout 小 5~10 秒(如 Tomcat connectionTimeout=60s,Nginx 设 30~45s)proxy_http_version 1.1; 和 proxy_set_header Connection "";:必须放在 location 块中,否则 Nginx 仍用 HTTP/1.0 短连接发请求keepalive 指令只能出现在 upstream { } 块内,且必须在 http 块下定义。
server 10.0.1.10:8080 keepalive 64; —— keepalive 必须独立成行server 或 location 内 → 启动报错 unknown directive "keepalive"
upstream api_backend { server 10.0.1.10:8080; server 10.0.1.11:8080; keepalive 48;} 配置完不等于跑通,需实测确认连接复用状态:
ss -tan | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期范围,而非持续增长或剧烈波动TIME_WAIT 数量下降、P95 延迟降低、建连耗时减少Connection: keep-alive;若返回 close 或缺失,说明中间有设备干扰或后端未配合