Nginx中用limit_req限制单个API速率,需通过limit_req_zone按URI或参数定义接口级限流区域,并在对应location块中用limit_req绑定zone,支持burst和delay控制突发请求,可结合map按App ID或Token实现客户端维度分流,再通过日志与响应头验证效果。

在 Nginx 中用 limit_req 限制单个 API 接口的访问速率,核心是结合 limit_req_zone 定义限流规则,并在 location 块中精准应用。关键不在全局限制,而在于“按接口路径区分”和“按客户端标识分流”。
定义基于 URI 或参数的限流区域
限流要作用于特定接口,需让 limit_req_zone 的键(key)能唯一标识该接口。常用方式:
- 用
$request_uri区分完整路径(含查询参数),适合严格按 URL 限流,例如/api/v1/users和/api/v1/orders独立计数 - 用
$uri只匹配路径部分(忽略 query string),适合同一接口不同参数共用配额 - 组合使用:如
limit_req_zone $uri zone=api_users:10m rate=5r/s;专门约束/api/v1/users路径
在 location 中绑定限流策略
找到目标 API 的 location 块,在其中添加 limit_req 指令,指定对应 zone,并可控制突发请求行为:
-
limit_req zone=api_users burst=10 nodelay;:允许最多 10 个请求排队,超量直接 503;加nodelay表示不延迟,超出即刻拒绝 -
limit_req zone=api_users burst=5 delay=3;:允许 3 个请求延迟执行(平滑处理),其余排队或拒绝 - 若只希望限流但不拒绝(如降级为 429),可配合
error_page 429 = @rate_limited;自定义响应
按客户端做更精细控制(可选)
如果还需区分调用方(比如不同 App ID 或用户 Token),可在 key 中加入变量:
- 提取请求头中的
X-App-ID:map $http_x_app_id $app_key { default $http_x_app_id; "" $binary_remote_addr; },再用$uri$app_key构建复合 key - 对带 token 的接口,用
$arg_token或正则从 header 提取,避免所有客户端共享同一配额 - 注意:key 值不能为空,建议用
map设置 fallback(如回退到 IP)
验证与调试技巧
上线前务必测试效果,常见检查点:
- 用
curl -I多次请求目标接口,观察响应头是否出现X-RateLimit-Limit/X-RateLimit-Remaining(需配合add_header手动输出) - 查看 Nginx error log,搜索
limiting requests关键字,确认是否触发限流 - 临时开启
limit_req_log_level warn;,把限流事件记到 access log 方便分析 - 注意:
limit_req对静态文件、重定向、内部跳转默认不生效,确保 location 匹配准确


















