必须配齐proxy_http_version 1.1、proxy_set_header connection ""和upstream keepalive三项配置,缺一不可;还需合理设置keepalive_timeout(20–45秒)、keepalive_requests(500–1000)并匹配后端承载能力,否则连接无法复用。

要让 Nginx 在大规模后端连接场景下真正复用连接,核心不是堆配置,而是让协议行为、连接池设置和后端响应三者对齐。只加 keepalive 但漏掉其他环节,复用基本无效。
必须配齐的三项基础配置
这三项缺一不可,否则连接永远无法复用:
-
启用 HTTP/1.1 协议:在
location块中写proxy_http_version 1.1;。HTTP/1.0 默认关闭持久连接,不设这一行,后端会直接断连。 -
清空 Connection 请求头:加
proxy_set_header Connection "";。否则 Nginx 可能将客户端发来的Connection: close转发给后端,导致连接被主动关闭。 -
声明 upstream 连接池大小:在
upstream块中写keepalive 32;。它表示每个 worker 进程最多缓存 32 个空闲连接到该后端 IP,不是全局总数——8 个 worker 就是 256 条上限。
合理控制单连接生命周期
只设连接数不够,还要防止连接“老而不死”或“用完即弃”:
-
keepalive_timeout:建议设为 20–45 秒,且必须小于后端的空闲超时(如 Tomcat 的
connectionTimeout),否则 Nginx 想复用,后端已关。 - keepalive_requests:默认 100,高并发下可调至 500–1000。限制单连接处理请求数,避免 Java 应用因长连接积累状态或内存泄漏。
匹配后端承载能力,避免连接堆积
keepalive 数值不能拍脑袋定,要根据后端实际能力反推:
- 若后端单实例最大连接数为 2000,Nginx 有 4 个 worker,按 70% 安全水位计算:
2000 × 0.7 ÷ 4 ≈ 35,设keepalive 32或48更稳妥。 - 后端返回
Connection: close(常见于错误响应、调试开关开启、WAF 干预),Nginx 会立即释放该连接。需检查后端日志和响应头确认是否稳定返回keep-alive。 - 用
least_conn或hash $remote_addr等策略缓解连接倾斜——避免某台后端被“粘住”,其他长期空闲。
验证是否真的复用成功
别只看配置有没有写,要用数据确认效果:
- 在 Nginx 机器上执行:
ss -tan | grep :8080 | grep ESTAB | wc -l,压测中连接数应稳定在worker_processes × keepalive附近,而不是随 QPS 持续上涨。 - 抓包观察连续请求是否复用同一源端口 → 目标端口组合;若每次都是新 SYN,说明根本没复用。
- 后端侧检查
ss -s | grep "TIME_WAIT",复用率高时该值应明显下降。











