跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置 limit_req_status 自定义触发静态限流时的返回码教程

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;
# 全局默认限流超时时返回 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
中覆盖,避免遗漏。

相关文章