keepalive_requests 限制每条长连接处理请求数(如25),达限后主动关闭,迫使新请求轮询复用其他连接或新建连接,从而提升轮询均匀性、防连接老化与内存积压;需配合 keepalive、keepalive_timeout 及 HTTP/1.1 长连接配置生效。

在 Nginx 轮询(round-robin)负载均衡中,keepalive_requests 不是控制轮询逻辑本身,而是约束「每个后端连接」的复用寿命——它让 Nginx 在一条已建立的长连接上只处理指定数量的请求,之后主动关闭该连接,迫使后续请求转向其他可用连接或新建连接。这间接影响了轮询的分布节奏和连接资源的释放效率。
keepalive_requests 如何作用于轮询后端连接
该指令仅对 upstream 块中启用 keepalive 的长连接生效,与轮询算法协同工作:
- 每条从 Nginx 复用到某个后端节点的 TCP 连接,都独立维护一个计数器
- 每次成功完成一次
proxy_pass请求,对应连接的计数器 +1 - 达到设定值(如
keepalive_requests 30)后,Nginx 在响应发送完毕后立即关闭该连接,不等待空闲超时 - 新请求仍按轮询顺序分发,但会优先复用池中未达限的连接;若所有连接都已满额,则新建连接并重置计数器
典型配置示例(配合轮询)
以下配置启用轮询,并限制每个长连接最多服务 25 个请求:
upstream backend {
# 默认即为轮询,无需显式声明
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
<pre class="brush:php;toolbar:false;"># 启用连接池,最多保持 32 条空闲长连接
keepalive 32;
# 每条长连接最多处理 25 个请求后关闭
keepalive_requests 25;}
server { location /api/ { proxy_pass https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e; proxy_http_version 1.1; proxy_set_header Connection "keep-alive";
其他必要代理头...
}
}
为什么这对轮询场景重要
单纯轮询不解决连接老化问题;keepalive_requests 补齐了关键一环:
- 防止单个后端连接长期驻留、积累内存(如 request buffer、SSL session 缓存),避免 Worker 进程 RSS 内存缓慢爬升
- 加快异常连接退出:后端偶发延迟或 GC 卡顿时,低阈值(如 10–20)可减少“卡住”的连接滞留时间
- 提升连接轮转均匀性:强制断连后,新请求更可能落到负载较轻的节点,尤其在后端响应时间差异较大时
- 避免连接复用失衡:默认 100 容易导致部分连接被高频复用,而其他连接闲置;设为 20–50 可促使连接更频繁轮换
必须搭配的关键配置
keepalive_requests 单独使用效果有限,需与以下设置协同:
-
keepalive_timeout:建议设为预期单连接处理完设定请求数所需时间的 1.5–2 倍(例如 QPS=20,keepalive_requests 30→ 平均耗时约 1.5s,timeout 设为 3–4s) -
proxy_http_version 1.1和proxy_set_header Connection "keep-alive":确保上游连接启用 HTTP/1.1 长连接 -
keepalive(在 upstream 块内):定义连接池大小,否则keepalive_requests无连接可复用



















