要真正复用nginx与后端的tcp连接,必须同时配置proxy_http_version 1.1、proxy_set_header connection ''和upstream keepalive三项,缺一不可;还需合理设置keepalive_timeout(20–45秒)和keepalive_requests(500–2000),并验证连接数是否稳定在worker_processes×keepalive附近。

要让 Nginx 真正复用与后端服务的 TCP 连接,关键不是只加一行 keepalive 32,而是让协议、请求头和连接池三者对齐。缺任何一环,长连接都形同虚设,连接数仍会随 QPS 持续上涨。
必须配齐的三项基础配置
这三项是 upstream keepalive 生效的前提,任意缺失都会导致连接无法复用:
-
启用 HTTP/1.1 协议:在
location或server块中添加proxy_http_version 1.1;。HTTP/1.0 不支持持久连接,不设此项,后端收到请求后默认断连。 -
清空 Connection 请求头:加上
proxy_set_header Connection '';。否则 Nginx 可能将客户端传来的Connection: close转发给后端,触发主动关闭。 -
声明连接池大小:在
upstream块内设置keepalive 32;(建议值 16–64)。它表示每个 worker 进程最多缓存多少个空闲连接到该后端,不是全局总数。
合理控制单连接生命周期
只设连接数不够,还需限制单连接“活多久”和“干多少活”,避免连接堆积或过早释放:
-
keepalive_timeout:建议设为 20–45 秒,且必须小于后端服务的空闲超时(如 Tomcat 的
connectionTimeout)。若 Nginx 想复用,后端已关,复用就失败。 - keepalive_requests:默认 100 易引发高频建连;高并发 API 场景建议设为 500–1000;React 类前端可设至 2000,覆盖一次完整页面交互链路。
连接池大小不能脱离后端实际承载力
数值需结合后端能力反推,还要排除常见干扰:
- 若后端单实例最大连接数为 2000,Nginx 有 4 个 worker,按 70% 安全水位反推:
2000 × 0.7 ÷ 4 ≈ 35,keepalive设 32 或 48 更稳妥。 - 后端返回
Connection: close(常见于错误响应、调试开关开启、WAF 干预),Nginx 会立即释放该连接,无法复用。需检查后端日志与响应头。 - 健康检查若过于频繁且未用 HTTP/1.1 +
match配置,会意外耗尽空闲连接;负载策略建议用least_conn或hash $remote_addr,缓解连接倾斜。
用数据确认是否真正生效
别只看配置有没有写,要用观测手段验证效果:
- 在 Nginx 机器上执行:
ss -tan | grep :8080 | grep ESTAB | wc -l,压测中连接数应稳定在worker_processes × keepalive附近,而非随 QPS 持续上涨。 - 抓包观察连续请求是否复用同一源端口 → 目标端口组合;若每次都是新 SYN,说明没复用。
- 检查后端
TIME_WAIT数量是否明显下降(如ss -s | grep -i time)。











