Nginx 无显式连接池,但通过 upstream 中 keepalive 指令实现每 worker 每后端服务器最多缓存 N 个空闲 keepalive 连接,并需配合 proxy_http_version 1.1、proxy_set_header Connection '' 等确保复用生效。

在 Nginx 的 ngx_http_proxy_module 中,并不存在传统意义上由用户显式配置的“连接池”或“连接复用池”机制。Nginx 本身不维护一个独立的、可配置大小的后端连接池,但它通过底层的 HTTP 连接复用(keepalive)机制 实现了高效、自动的上游连接复用,这是实际生产中提升代理性能的关键技术。
keepalive 指令:启用上游连接复用的核心
Nginx 通过 keepalive 指令(定义在 upstream 块中)控制与后端服务器之间空闲连接的最大数量,这是实现连接复用的物理基础:
-
keepalive N;表示每个 worker 进程最多缓存 N 个空闲 keepalive 连接 到该 upstream 组中的单个后端 server(非 total,而是 per-server per-worker) - 它不会主动建连,只在 proxy 请求完成且响应头含
Connection: keep-alive、后端也支持 HTTP/1.1 或 HTTP/2 时,才尝试将连接放回“复用队列” - 若当前已缓存连接数已达
N,新空闲连接会被直接关闭;若少于N,则保留
配套必须设置:避免连接被意外中断
仅配 keepalive 不够,还需配合以下指令确保复用链路畅通:
-
proxy_http_version 1.1;:强制使用 HTTP/1.1(默认是 1.0),否则无法协商 keepalive -
proxy_set_header Connection '';:清空客户端传来的Connection头,防止因客户端发Connection: close导致 Nginx 主动断开后端连接 -
proxy_set_header Host $host;等标准头建议保持,尤其当后端依赖 Host 判断路由时
连接复用的实际行为逻辑
当一次 proxy 请求完成,Nginx 内部按如下流程决定是否复用连接:
- 检查后端响应是否含
Connection: keep-alive(或 HTTP/2 帧流自然支持复用) - 确认当前到该后端 server 的空闲连接数未达
keepalive N上限 - 确认连接未超时(由
keepalive_timeout控制,默认 60s) - 满足全部条件 → 将连接标记为 idle 并加入复用队列;否则立即关闭
下一次请求到来时,Nginx 会优先从该队列中取出一个可用连接发送请求,跳过 TCP 握手和 TLS 握手(若启用 HTTPS),显著降低延迟。
常见误区与注意事项
容易混淆或忽略的关键点:
-
keepalive不是“连接池大小”,也不是并发连接上限,它只限制空闲连接数;活跃连接不受此值限制 - 不同 upstream server 之间连接不共享,
keepalive 32对两台后端,每台最多缓存 32 个空闲连接(每个 worker) - HTTPS 后端复用同样生效,但需注意 TLS session reuse(由 OpenSSL 层控制,Nginx 默认开启)
- 后端服务自身也要开启 keepalive(如 nginx、tomcat、gunicorn 的 keepalive 相关配置),否则响应头无
Connection: keep-alive,Nginx 不会复用










