要在Nginx中真正提升后端长连接复用效率,关键不是加一行keepalive,而是让upstream连接池、HTTP协议行为、后端服务响应三者对齐;必须配齐proxy_http_version 1.1、proxy_set_header Connection ''和upstream keepalive三项配置,缺一不可,否则复用失效。

要在 Nginx 中真正提升后端长连接复用效率,关键不是加一行 keepalive,而是让 upstream 连接池、HTTP 协议行为、后端服务响应三者对齐。配置错一个环节,复用就会失效。
必须配齐的三项基础配置
upstream keepalive 不是独立生效的指令,它依赖三个配套设置协同工作:
-
显式启用 HTTP/1.1:在
location块中写proxy_http_version 1.1;。HTTP/1.0 默认不支持持久连接,不设这行,keepalive 形同虚设。 -
清空 Connection 请求头:加
proxy_set_header Connection "";。否则 Nginx 可能把客户端传来的Connection: close转发给后端,导致后端主动断连。 -
upstream 块内声明 keepalive 数值:例如
keepalive 32;,表示每个 worker 进程最多缓存 32 个空闲连接到该 upstream。注意这不是全局总数,8 个 worker 就是 256 条连接上限。
合理设置 keepalive 相关超时与请求数
只设连接数不够,还要控制单连接生命周期,避免连接“老而不死”或“用完即弃”:
-
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 会立即释放该连接,无法复用。需检查后端日志和响应头。 - 使用
least_conn或hash $remote_addr等负载策略,缓解因复用导致的连接倾斜——某台后端被“粘住”,其他空闲。
验证是否真的复用成功
别只看配置,要用数据确认效果:
- 在 Nginx 机器上执行:
ss -tan | grep :8080 | grep ESTAB | wc -l,压测中连接数应稳定在worker_processes × keepalive附近,而不是随 QPS 持续上涨。 - 抓包观察连续请求是否复用同一源端口 → 目标端口组合;若每次都是新 SYN,说明没复用。
- 开启 Nginx debug 日志(
error_log logs/error.log debug;),搜索reuse connection或create connection关键词,确认复用行为频次。


















