Nginx 中 limit_req 触发限流默认返回 503,可通过 http 或 server 块中配置 limit_req_status 429 自定义为 429,但该指令不可写在 location 内,且所有限流点共用同一状态码。

在 Nginx 中,limit_req 模块默认在触发限流时返回 503 Service Temporarily Unavailable 状态码。若需自定义该状态码(例如改为 429 Too Many Requests),可通过 limit_req_status 指令实现,但需注意其使用前提和限制。
必须配合 limit_req_zone 使用
limit_req_status 是全局或 http 块级指令,**不能写在 location 内**,且只对启用了 limit_req 的请求生效。它作用于整个 server 或 upstream,影响所有使用该限流规则的 location。
- 在
http或server块中设置:
limit_req_status 429; - 确保已正确定义
limit_req_zone并在 location 中引用:
limit_req zone=mylimit burst=10 nodelay; - 重启或重载 Nginx 后,超限请求将统一返回 429
不支持 per-location 独立状态码
Nginx 官方目前不提供 per-location 级别的限流状态码覆盖。即无法为某个特定 location 设置 429,另一个设置 403 —— 所有 limit_req 触发点共用同一个 limit_req_status 值。
- 若需差异化响应,可考虑用
error_page+ 自定义错误页间接模拟:
error_page 503 = @rate_limited;
location @rate_limited { return 429 "Too many requests.\n"; } - 此方式本质仍是返回 503,再由 error_page 捕获并转交,响应体和状态码均可自定义
验证与调试建议
修改后务必验证实际响应头,避免因缓存或客户端重试逻辑造成误判。
- 用 curl 测试限流行为:
curl -I http://your-domain/api(连续快速请求多次) - 检查响应头中的 Status 行是否为预期值(如
HTTP/1.1 429) - 确认 Nginx 版本 ≥ 1.7.6(
limit_req_status自此版本引入)
不复杂但容易忽略:状态码修改仅作用于 limit_req 主动拒绝,不改变其他模块(如 auth_request、deny)的返回码。


















