nginx可通过为不同域名定义独立limit_req_zone并绑定对应server块实现按域名限流;需在http块中用不同zone名(如site_a、site_b)声明,server中用limit_req引用专属zone,并配置burst、nodelay等参数,配合日志与429状态便于调试。

在Nginx中,可以通过limit_req模块对不同域名(即不同server块)分别设置访问频率限制,关键在于为每个域名定义独立的limit_req_zone并绑定到对应server中。
按域名定义独立限流区域
每个域名需使用唯一的变量(如$host或自定义变量)作为键,并在http块中单独声明limit_req_zone。推荐用$host确保各域名互不干扰:
- 在
http块中添加多个限流区域,例如:
limit_req_zone $host zone=site_b:10m rate=10r/s;
注意:虽然都用$host,但因zone名称不同(site_a、site_b),它们是完全隔离的计数器。
在对应server块中启用限流
每个server块内用limit_req指令引用其专属区域,并可配置突发容量和拒绝行为:
- 示例(域名
example-a.com):
server_name example-a.com;
limit_req zone=site_a burst=10 nodelay;
# 其他配置...
}
- 示例(域名
example-b.com):
server_name example-b.com;
limit_req zone=site_b burst=20;
# 其他配置...
}
burst表示允许的瞬时请求数,nodelay让超出速率的请求立即返回503(不排队),适合严格限流场景。
验证与调试技巧
限流生效后可通过日志确认是否命中:
- 在
server或location中添加日志记录:
limit_req_status 429;
这样被限流的请求会在error log中以warn级别记录,并返回HTTP 429状态码,便于监控和排查。
注意事项
避免常见误区:
- 不要在多个
server中复用同一个zone名——这会导致所有域名共用同一计数器; -
$host值来自请求头,若客户端伪造Host头,可改用$server_name(仅匹配配置中的确切域名)提升安全性; - 内存大小(如
10m)需根据预期并发域名数调整,单个zone最小建议5m,过多域名需适当增大。










