nginx无传统内存池,其“连接池调优”实为通过upstream keepalive、proxy_http_version 1.1、proxy_set_header connection ""等配置协同优化长连接复用,以减少tcp建连开销、抑制time_wait、降低延迟。

严格来说,Nginx 并没有传统意义上的“内存池”用于管理 upstream 连接——它不靠预分配内存块复用连接对象,而是通过事件驱动模型 + TCP 连接复用机制来降低开销。所谓“内存池调优”,实为围绕 upstream 长连接复用的系统性配置优化,核心目标是减少 TCP 建连/断连频次,从而节省 CPU、避免 TIME_WAIT 堆积、缩短延迟。
为什么 upstream 默认不复用连接?
Nginx 作为反向代理,默认以 HTTP/1.0 协议与后端通信(即使 proxy_http_version 未显式设置,老版本默认仍是 1.0),且不启用连接缓存。这意味着每个请求都会新建一个 TCP 连接,完成响应后立即关闭。高频短连接会带来三重负担:
- 每次建连消耗三次握手 + TLS 握手(若启用 HTTPS)
- 后端频繁进入 TIME_WAIT 状态,占用端口与内核资源
- Nginx worker 进程反复调用 socket()、connect()、close(),增加系统调用开销
关键配置:upstream keepalive 是核心
必须在 upstream 块中显式启用并合理设参,否则连接复用不会生效:
- keepalive N:每个 worker 进程为该 upstream server(IP+端口)维护的空闲长连接最大数量。不是全局总数,而是 per-worker per-server。建议值 32–128,过高易导致后端连接堆积或端口耗尽;过低则复用率不足
- keepalive_requests M:单个长连接最多转发 M 次请求后主动关闭。默认 100,高吞吐场景可设为 500–5000,避免因计数到限而无谓断连
- keepalive_timeout T:空闲连接在池中保留秒数。需小于后端 keepalive timeout(如 Nginx 设 20s,后端至少设 30s),否则连接可能被后端先断开
示例:
server 10.0.2.5:8080;
keepalive 64;
keepalive_requests 1000;
keepalive_timeout 25s;
}
配套 proxy 设置:确保协议与头部正确
仅 upstream 启用 keepalive 不够,还需让 Nginx 主动使用 HTTP/1.1 并清除干扰头:
- proxy_http_version 1.1:强制升级协议,支持持久连接
- proxy_set_header Connection "":清空 Connection 头,防止 Nginx 自动注入 close 或其他中间设备误判
- 无需手动加 Keep-Alive 头,Nginx 会根据 upstream 配置自动协商
对应 location 示例:
location /v1/ {proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
}
验证是否真正复用:别只看配置
配置写完不等于生效,需从三个层面交叉验证:
- 用
ss -tan | grep :8080 | grep ESTAB | wc -l查看当前到后端的稳定连接数,应稳定在 keepalive 值附近(而非随 QPS 线性增长) - 开启 Nginx 日志变量
$upstream_addr,观察日志中是否出现10.0.2.5:8080:keepalive标识 - 抓包检查连续请求的源端口与目标端口对是否复用(SYN 出现频率显著低于请求频率)











