limit_req_status指令用于自定义限流触发时的HTTP状态码,默认503,可设为429、403或444等;支持http/server/location作用域,优先级就近生效,需nginx -t测试后reload生效。

在 Nginx 中,limit_req_status 指令用于自定义触发限流(即请求超过 limit_req 规则)时返回的 HTTP 状态码,默认是 503。要把它改成其他状态码(比如 429 Too Many Requests),只需在对应上下文(如 http、server 或 location 块)中配置该指令即可。
1. 基础语法与作用范围
limit_req_status 是一个简单指令,只接受一个整数参数,表示 HTTP 状态码:
- 必须为合法的三位数字状态码(如 429、403、444 等)
- 不能是 1xx、2xx、3xx 范围内的码(Nginx 会忽略或报错)
- 支持的常见可选值:429(推荐,语义明确)、403(拒绝访问)、444(Nginx 特有,直接关闭连接不发响应体)
- 作用域支持:
http、server、location,优先级遵循 Nginx 配置继承规则(越靠近请求匹配位置,优先级越高)
2. 配置示例(含 limit_req 配合使用)
以下是一个完整可用的限流 + 自定义返回码配置片段:
http {
# 定义共享内存区(key 可按需调整,如 $binary_remote_addr)
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;
<pre class="brush:php;toolbar:false;"># 全局默认限流超时时返回 429
limit_req_status 429;
server {
listen 80;
server_name example.com;
location /api/ {
# 此处可覆盖全局设置,例如对 API 返回 403
limit_req_status 403;
limit_req zone=perip burst=10 nodelay;
proxy_pass http://backend;
}
}}
说明:
- 若某请求触发限流,且落在
/api/下,将返回 403 - 其他匹配
limit_req但未显式设limit_req_status的 location,则用http块中定义的 429 -
nodelay不影响状态码,只控制是否允许突发请求排队
3. 注意事项与常见问题
配置生效前注意以下几点:
- 修改后必须执行
nginx -t测试配置,再nginx -s reload生效 - 状态码仅在真正触发限流时生效;未匹配
limit_req或未超限的请求不受影响 - 若同时配置了
error_page 429 /429.html,需确保自定义页面存在且路径可访问,否则可能返回空响应或默认错误页 - 使用
444时不会发送任何响应(包括响应头),客户端通常看到连接被重置,适合严格风控场景
4. 验证是否生效
可通过快速并发请求验证返回码是否已变更:
- 用
curl -I http://example.com/api/test查看响应头中的HTTP/1.1 XXX - 配合
ab或wrk工具压测,观察高频请求下返回的状态码分布 - Nginx 日志中不会直接记录限流状态码,但可通过
$status变量在log_format中体现(需确保日志格式包含该字段)
不复杂但容易忽略的是作用域继承关系——建议统一在 http 块设默认值,再按需在 location 中覆盖,避免遗漏。










