nginx复用后端连接需协议、头部、连接池三者严格对齐:必须配置proxy_http_version 1.1、proxy_set_header connection ""、upstream keepalive n;并合理设置keepalive_timeout、keepalive_requests,适配后端承载能力,必要时启用proxy_socket_keepalive防静默断连。

要让 Nginx 真正复用到后端的连接,关键不是只加 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,覆盖一次完整页面交互链路。
适配后端承载能力
keepalive 数值不是越大越好,需结合后端实际连接池上限反推:
- 若后端单实例最大连接数为 2000,Nginx 有 4 个 worker,按 70% 安全水位计算:
2000 × 0.7 ÷ 4 ≈ 35,keepalive 设 32 或 48 更稳妥。 - 后端返回
Connection: close(常见于错误响应、调试开关开启、WAF 干预),Nginx 会立即释放该连接,无法复用。需检查后端日志与响应头。 - Go 默认
MaxIdleConnsPerHost=2,Nginx 即使设了 100 也连不上;Node.js http.Server 默认不限,但过大设置可能耗尽文件描述符,触发EMFILE。
防静默断连:启用 socket 层保活
CDN 回源或跨公网场景下,中间设备(如防火墙、WAF、LB)可能悄无声息地切断空闲连接,而 Nginx 无法感知。此时需底层探测:
- 添加
proxy_socket_keepalive on 60s 5s 3;:空闲 60 秒后开始探测,每 5 秒发一次心跳,连续 3 次无响应则关闭 socket。 - 该指令作用于 upstream 连接池中的每个 socket,与 HTTP 的
Connection: keep-alive无关,专治“连接还在但实际已断”的问题。











