要对特定接口维度做全局并发连接数管控,核心是选对limit_conn_zone的key变量并确保其唯一稳定标识目标接口:用$uri或$request_uri实现接口级限流;多路径聚合用map映射统一逻辑分组;多租户场景可组合$server_name:$uri双维度控制;需注意内存开销、HTTP/2特性及keepalive影响。

要对特定接口维度做全局并发连接数管控,核心是选对 limit_conn_zone 的 key 变量,并确保该变量能唯一、稳定标识目标接口。
用 $uri 或 $request_uri 作为 key 实现接口级限流
这是最直接的方式。比如限制 /api/payment 接口最多同时接受 50 个 TCP 连接:
- 在
http{}块中定义区域:limit_conn_zone $uri zone=by_uri:10m; - 在对应 location 中启用:
location = /api/payment { limit_conn by_uri 50; } -
$uri是标准化后的路径(不含参数),适合路径固定、语义明确的接口;$request_uri含 query string,若需区分带参请求(如不同订单号)可考虑它,但要注意键爆炸风险
用自定义 map 变量精准聚合多路径到同一接口逻辑
真实业务中,一个接口可能有多个 URL 形式(如 /v1/order、/v2/order、/api/orders),这时硬写多个 location 不可持续。
- 先在
http{}中建立映射:map $uri $api_group {<br> ~^/v[12]/order$ "order";<br> ~^/api/orders$ "order";<br> default ""; } - 再定义 zone:
limit_conn_zone $api_group zone=api_order:10m; - 在 server 或 location 中统一启用:
limit_conn api_order 100;—— 此时所有匹配的路径共用 100 连接配额
结合 $server_name + $uri 支持多租户+接口双维度控制
当 Nginx 托管多个域名且各租户有独立接口策略时,可组合使用:
- 定义复合 key:
limit_conn_zone "$server_name:$uri" zone=tenant_api:10m; - 这样
tenant-a.example.com:/api/report和tenant-b.example.com:/api/report就互不影响 - 注意内存开销:每个唯一组合占约 64 字节,10MB 区域最多存约 16 万个键值对,高租户+多接口场景需评估 size 是否足够
关键注意事项
这些配置生效的前提和细节不能忽略:
-
limit_conn_zone必须放在http{}块,不能嵌套在 server 或 location 内 - key 中避免使用
$args、$query_string等动态性强的变量,极易撑爆共享内存 - HTTP/2 下一个连接承载多个 stream,仍只计为 1 个连接;keepalive 空闲连接持续占配额,建议搭配
keepalive_timeout 15; - 触发限流默认返回 503,可用
limit_conn_status 429;更准确表达“Too Many Requests”

















