limit_req_status用于自定义限流触发时返回的HTTP状态码,默认503,需配合limit_req在http/server/location中配置,支持429、403、444等,不可在limit_req_zone中设置,不支持变量,需用curl或日志验证。

在 Nginx 中,limit_req_status 指令用于自定义限流触发后返回的 HTTP 状态码,默认是 503 Service Temporarily Unavailable。它必须配合 limit_req(或 limit_req_zone)使用,且只能在 http、server 或 location 块中配置。
如何设置 limit_req_status
只需在启用限流的上下文中添加该指令即可,例如:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
<p>server {
location /api/ {
limit_req zone=perip burst=10 nodelay;
limit_req_status 429; # 触发限流时返回 429 Too Many Requests
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
}
}
这样当请求超出速率限制时,Nginx 不再返回默认的 503,而是返回 429,更符合 RESTful 接口对限流的语义表达。
支持的状态码范围
limit_req_status 接受任意标准 HTTP 状态码,常见选择包括:
- 429 Too Many Requests:最推荐,语义明确,客户端易于识别和重试
- 403 Forbidden:适用于将超限视为权限拒绝的场景(如配额耗尽)
- 444:Nginx 特有状态码,表示“关闭连接不返回响应体”,适合静默丢弃
- 503:默认值,保留也可,但不如 429 语义精准
注意事项与常见问题
以下几点容易出错,需特别留意:
- 不能写在 limit_req_zone 定义处:该指令只在实际应用限流的 location/server 中生效
- 不会影响日志中的 $status 变量:Nginx 日志仍会记录真实返回的状态码(即你设置的值)
-
与 error_page 配合使用需谨慎:如果同时配置了
error_page 429 /rate-limited.html,会触发自定义错误页;若不需要页面,建议避免匹配 429 的 error_page -
不支持动态变量:状态码必须是静态数字,不能写成
limit_req_status $custom_code
验证是否生效
可通过 curl 快速测试:
curl -I http://your-domain/api/test
连续快速请求多次后,观察响应头中的 HTTP/1.1 行是否变为你设定的状态码(如 HTTP/1.1 429 Too Many Requests)。也可配合 log_format 在 access log 中打印 $status 辅助确认。


















