通过 keepalive_requests 与 limit_conn 协同配置,可精准控制单个长连接上的请求频次:limit_conn 限制并发连接数,keepalive_requests 限制单连接最大请求数,二者组合实现“连接准入+请求寿命管控”。

通过 keepalive_requests 与 limit_conn 协同配置,可以在 Nginx 中实现对**单个长连接上请求频次的精准控制**,特别适用于 HTTP/1.1 持久连接场景(如 API 网关、内部微服务通信),避免因复用连接导致限流失效。
理解两个指令的核心作用
limit_conn:基于连接标识(如 $binary_remote_addr)限制**并发连接数**,即同一客户端最多能建立多少个 TCP 连接;
keepalive_requests:限制**单个 keepalive 连接最多处理多少个请求后主动关闭**,是连接生命周期的“请求计数器”。
二者不直接叠加限流,但配合使用可形成“连接准入 + 请求寿命管控”的组合策略——先用 limit_conn 控制连接数量,再用 keepalive_requests 防止单连接无限复用,从而让限流更贴近真实请求压力。
典型配置示例(按 IP 限流)
在 http 块中定义连接限制区域:
limit_conn_zone $binary_remote_addr zone=addr:10m;
在 server 或 location 块中启用限制并设置长连接上限:
location /api/ {
limit_conn addr 10; # 同一 IP 最多 10 个并发连接
keepalive_requests 100; # 每个 keepalive 连接最多处理 100 个请求
keepalive_timeout 60s; # 连接空闲 60 秒后关闭(可选)
}这样,即使客户端开启 100 个长连接,Nginx 也只允许其中 10 个存活;而每个存活连接最多承载 100 次请求,超限后自动断开,迫使客户端新建连接——此时又受 limit_conn 约束,形成闭环控制。
关键细节与注意事项
- limit_conn 统计的是当前活跃连接数,不是历史请求数;它不感知请求内容或耗时,仅看 TCP 连接是否处于 ESTABLISHED 状态
- keepalive_requests 是 per-connection 计数器,每次请求处理完毕就 +1,达到阈值立即关闭该连接(返回 HTTP 200 后发 FIN)
- 若客户端未正确复用连接(如每请求都新建短连接),
keepalive_requests几乎不起作用,此时主要靠limit_conn抵御连接洪峰 - 搭配
limit_req可实现更细粒度的 QPS 控制;三者可共存,但需注意触发顺序和日志调试(建议开启error_log info观察限流行为)
验证与调优建议
用 ab 或 wrk 模拟长连接压测:
wrk -t10 -c100 -d30s --http1.1 http://your-api.com/api/
观察 Nginx 的 stub_status 输出或 limit_conn 拒绝日志(limit_conn rejected),确认是否按预期触发限制。调优时优先调整 limit_conn 值匹配业务最大并发连接需求,再根据平均单连接请求量设定 keepalive_requests(如接口平均一个连接处理 50–200 次请求,设为 150 较稳妥)。


















