nginx 限制 /api/ 接口并发总数需用 limit_conn 模块,在 http 块定义 zone(如 $binary_remote_addr zone=api_conn:10m),location 中配置 limit_conn api_conn 5 实现 per-ip 限连;http/2 和代理场景需分别注意连接复用与真实 ip 识别。

在 Nginx 中限制特定接口(如 /api/)的并发处理总数,核心是用 limit_conn 模块配合精准定义的共享内存区,并将规则作用于对应 location 块。它限制的是该路径下当前活跃的 TCP 连接数,不是请求数,也不依赖后端是否响应完成——连接建立即计数。
定义面向接口的共享内存区
必须在 http 块中定义,不能放在 server 或 location 内:
- 使用
$binary_remote_addr作为 key,确保按客户端 IP 统计,内存更紧凑; - zone 名称建议体现用途,例如
api_conn; - 大小按预期 IP 数量预估:10MB 约支持 16 万~32 万个独立 IP 的连接状态,高并发场景可设为
20m避免cannot add connection错误。
示例配置:
http {limit_conn_zone $binary_remote_addr zone=api_conn:10m;
}
在目标 location 中启用并发总数限制
把 limit_conn 指令写在具体接口的 location 块内,直接生效:
-
limit_conn api_conn 5表示该接口下,每个 IP 最多维持 5 个并发连接; - 若需限制整个接口路径的全局并发总数(而非 per-IP),需换 key —— 但 Nginx 原生不支持“所有 IP 合计总数”这种模式;实际可通过
$uri或固定字符串(如"api")构造统一 key 实现变通; - 注意:HTTP/2 下一个连接可承载多个流,限连接数比限请求更严格;HTTP/1.1 下浏览器默认复用连接,单 IP 多标签页易触发限制,建议最小值不低于 3。
示例(限制每个 IP 最多 5 个并发连接):
location /api/ {limit_conn api_conn 5;
}
增强控制与可观测性
让限制行为更明确、问题更易定位:
- 返回语义清晰的状态码:
limit_conn_status 429;(替代默认 503); - 避免日志刷屏:
limit_conn_log_level error;,只在真正超限时记录; - 搭配带宽控制防止单连接耗尽资源:
limit_rate 200k;,或允许初始快速传输:limit_rate_after 5m; limit_rate 100k;。
代理环境下的真实 IP 识别
如果 Nginx 前有 CDN、负载均衡器或 WAF,$binary_remote_addr 会变成代理 IP:
- 确认已编译并启用
http_realip_module; - 配置
set_real_ip_from指定可信上游网段; - 改用
$realip_remote_addr作为 key:limit_conn_zone $realip_remote_addr zone=api_conn:10m;。











