keepalive_requests 控制单个 Keep-Alive 连接最多处理的请求数,达上限即关闭连接;它与 keepalive_timeout 共同决定连接生命周期,用于平衡复用效率与资源占用,非限并发数。

Nginx 的 keepalive_requests 指令用于控制一个持久连接(Keep-Alive 连接)上最多允许处理多少个 HTTP 请求,达到上限后主动关闭该连接。它不是限制“并发请求数”,而是限制“单个 TCP 连接生命周期内可复用的请求数”。合理设置能平衡资源占用与连接复用效率。
作用原理与典型场景
当客户端开启 Keep-Alive(如浏览器、curl 默认行为),Nginx 在响应头中返回 Connection: keep-alive,并保持 TCP 连接打开,等待后续请求复用。而 keepalive_requests 就是这个连接上允许的最大请求数。例如设为 100,第 100 个请求处理完后,Nginx 会发送 Connection: close 并关闭连接,即使连接尚未超时(keepalive_timeout 未到)。
- 防止长连接被恶意或异常客户端长期占用(如慢速攻击、死循环请求)
- 缓解因连接数过多导致的文件描述符耗尽问题
- 配合上游服务(如 FastCGI、upstream)的连接池策略,避免后端连接僵化
配置位置与生效范围
该指令只能在 http、server 或 location 块中使用,但实际生效依赖于上下文是否启用 Keep-Alive。常见配置方式:
- 全局限制(推荐):http 块中设置,对所有 server 生效
- 按域名隔离:server 块中覆盖全局值,适用于不同业务的连接策略差异
- 按路径细化:location 块中设置,仅对特定接口(如 API)生效(注意:静态文件等高频小请求可适当调高)
示例:
http {
keepalive_requests 1000;
keepalive_timeout 60;
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name example.com;
keepalive_requests 500; # 覆盖全局值
}}
与其他 keepalive 参数的关系
keepalive_requests 必须与 keepalive_timeout 协同使用,二者共同决定连接复用边界:
-
keepalive_timeout 60:空闲 60 秒无新请求则断开 -
keepalive_requests 100:累计处理满 100 个请求则断开(无论是否空闲) - 任一条件满足即关闭连接——取“先到先得”原则
若只设 timeout 不设 requests,连接可能被极低频但长期存活的客户端持续占用;若只设 requests 不设 timeout,连接会在请求用尽后立即关闭,但无法应对空闲连接堆积。
调优建议与常见误区
默认值为 100,多数场景下无需修改,但以下情况建议调整:
- 高并发短连接 API 服务:可适度提高(如 500–2000),减少 TCP 握手开销
- 含长轮询或 SSE 的服务:应降低(如 10–50),避免单连接长时间独占资源
- 与 upstream 配合时:确保
upstream keepalive数量 × 单连接请求上限 ≤ 后端连接池容量,避免连接雪崩 - 误认为它能防 DDOS:不能替代限流(limit_req)或连接数限制(limit_conn),仅是连接生命周期管理手段
可通过 nginx -t 校验语法,用 netstat -an | grep :80 | grep ESTABLISHED | wc -l 或 ss -s 观察连接复用效果,结合 access log 中 $connection_requests 变量分析实际每连接请求数分布。











