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