最清晰隔离的子域名限速方案是在各server块中配置专属限流:一、http块用$host键定义独立zone(如api-example-com);二、对应server块引用专属zone并设burst/nodelay;三、统一返回429并记录限速日志;四、可选在location块中按路径细化限速。

直接在对应子域名的 server 块中配置限速,是最清晰、最隔离的做法。核心是为每个子域名定义专属限流区域,并绑定到其 server 块内,避免互相干扰。
一、在 http 块中定义子域名专属限流区
限流必须基于可区分的键,推荐用 $host(即完整 Host 头,含子域名),并为每个子域名起独立 zone 名:
-
limit_req_zone $host zone=api-example-com:10m rate=20r/s;(专用于 api.example.com) -
limit_req_zone $host zone=admin-example-com:10m rate=5r/s;(专用于 admin.example.com) -
limit_req_zone $host zone=www-example-com:10m rate=100r/s;(专用于 www.example.com)
注意:虽然都用 $host,但因 zone 名不同,计数器完全独立,不会混用。
二、在对应 server 块中启用限速
每个子域名必须有明确的 server_name,并在其中引用自己的 zone:
- 对
api.example.com:
server_name api.example.com;
limit_req zone=api-example-com burst=30 nodelay;
# 其他配置...
}
- 对
admin.example.com:
server_name admin.example.com;
limit_req zone=admin-example-com burst=10;
# 其他配置...
}
burst 控制瞬时突发容量,nodelay 表示超速请求不排队、立即返回 503,适合 API 类子域名;管理后台类可省略 nodelay,允许少量排队缓冲。
三、配合日志与状态码便于验证
限速触发时默认返回 503,但更推荐统一返回 429(Too Many Requests),方便前端识别:
- 在对应
server块中添加:limit_req_status 429; - 添加自定义日志格式,标记限速行为:
access_log /var/log/nginx/api-rate-limit.log limit_log;
这样每条日志会记录当前子域名、请求、状态码及所用限流参数,排查时一目了然。
四、可选:按路径细化限速(如仅限 API 接口)
若只需对子域名下的某类路径限速(比如只限 /v1/ 接口),把 limit_req 移到 location 块中即可:
limit_req zone=api-example-com burst=20 nodelay;
proxy_pass http://backend;
}
此时该限速只作用于 api.example.com/v1/xxx,静态资源或根路径不受影响。










