可通过limit_conn_zone定义以$uri为key的共享内存区域,再在location中用limit_conn启用接口维度并发连接数限制;推荐用$uri(标准化路径)而非$request_uri(含参数),避免key爆炸;zone须置于http块内,如limit_conn_zone $uri zone=by_uri:10m;location中用^~前缀匹配路径并绑定同名zone,如location ^~ /api/report/ { limit_conn by_uri 5; };还可配置limit_conn_log_level error、limit_conn_status 429、keepalive_timeout 15等增强可观测性与资源利用。

可以通过 limit_conn_zone 定义以接口路径为 key 的共享内存区域,再配合 limit_conn 在对应 location 中启用限制,实现按接口维度的并发连接数管控。
使用 $uri 或 $request_uri 作为 key 实现接口粒度控制
接口维度的核心是把“请求路径”作为区分依据。Nginx 提供了两个常用变量:
-
$uri:标准化后的路径(不含参数),如
/api/order/create,适合对路径结构一致的接口统一限流 -
$request_uri:原始请求 URI(含 query string),如
/api/user?id=123,慎用——因参数变化会导致 key 爆炸,快速耗尽共享内存
推荐优先使用 $uri,避免因 URL 参数不同被识别为多个接口。
在 http 块中定义接口维度的 zone
必须放在 http{} 块内,例如:
这表示:为每个唯一 $uri 值分配计数器,10MB 内存可容纳约 16 万个不同路径(按每个 key 约 64 字节估算)。若业务接口总数远小于此,该配置安全可靠。
注意:$uri 是 Nginx 内置变量,无需额外 set;不建议用 $args 或组合变量(如 $uri$args),极易引发内存溢出。
在 location 块中绑定并启用限制
针对具体接口路径启用管控,例如限制所有 /api/report/ 下的接口最多 5 个并发连接:
limit_conn by_uri 5;
}
说明:
-
^~前缀确保前缀匹配优先于正则,提升性能 - 此处
by_uri必须与limit_conn_zone中定义的 zone 名称完全一致 - 数值
5表示该路径下任意时刻最多维持 5 个 TCP 连接(HTTP/2 单连接多 stream 仍计为 1)
结合真实场景的增强配置
单靠 limit_conn 可能不够直观或易维护,建议补充以下参数:
- limit_conn_log_level error;:将触发限流的日志级别升至 error,便于从日志中快速定位受控接口
- limit_conn_status 429;:返回标准限流状态码 429 Too Many Requests,比默认 503 更符合语义,前端也更易识别处理
- keepalive_timeout 15;:缩短空闲连接保持时间,防止大量 idle 连接长期占用配额
这些指令可放在同一 location 块内,不影响主逻辑,但显著提升可观测性与资源利用率。










