通过map提取api版本映射到预定义zone名,配合多个limit_req_zone按版本设置不同速率,再在location中用zone=$rate_zone动态调用,实现差异化限流。

直接用 limit_req 对不同 API 版本(如 /v1/、/v2/)做差异化限流,关键不是写多个 location,而是让 Nginx 能“自动识别版本并选对限流桶”。核心靠 map + 多个 limit_req_zone + 动态 zone= 组合实现。
用 map 提取版本标识并映射到 zone 名
Nginx 不允许在 limit_req zone= 里直接写正则或条件表达式,但可以用 map 预先把请求路径转成一个字符串变量,这个变量值就是你提前定义好的 zone 名。
- 匹配路径前缀(推荐用
$uri,不含 query string,更稳定):
~^/v1/ "v1_zone";
~^/v2/ "v2_zone";
default "default_zone";
}
- 若版本通过 header(如
X-API-Version: v2)或参数(如?version=v2)传递,也可统一映射:
"v2" "v2_zone";
"v1" "v1_zone";
default "default_zone";
}
为每个版本定义独立的 limit\_req\_zone
每个 zone 对应一个版本的令牌桶,key 建议统一用 $binary_remote_addr(节省内存),rate 按版本能力设置:
limit_req_zone $binary_remote_addr zone=v2_zone:10m rate=50r/s;
limit_req_zone $binary_remote_addr zone=default_zone:10m rate=5r/s;
-
v1_zone:保守策略,10 QPS,适合未充分验证的新接口 -
v2_zone:放宽至 50 QPS,体现性能升级或灰度放量 -
default_zone:兜底策略,严控未识别路径(如/legacy/或拼写错误)
在 location 中启用动态限流
只需在一个通用 location 里引用 $rate_zone,Nginx 会自动按当前请求匹配到的 zone 名去查对应桶:
limit_req zone=$rate_zone burst=30 nodelay;
proxy_pass http://backend;
}
-
burst=30:允许短时突发,建议设为 rate 的 2–3 倍 -
nodelay:超限立即返回 503,避免排队拖慢响应;如需缓冲削峰,可去掉该参数 - 不建议在同一个 location 内叠加多个
limit_req,Nginx 只认最后一个
验证与常见避坑点
上线后快速确认是否生效:
- 触发限流时返回
503 Service Temporarily Unavailable,表示配置已加载且命中 - 若某版本始终不限流,检查
error_log ... notice日志,看是否因$rate_zone为空(map 未匹配)导致 zone 未生效 - 所有
limit_req_zone必须定义在http块顶层,不能嵌套在server或location内 - 避免 key 冲突:不要用纯
$uri作所有版本共用 key,否则/v1/users和/v2/users会挤进同一个桶
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











