可通过Nginx的limit_req模块结合map指令为不同域名设置独立限流策略:先用map将$host映射为$limit_key,再为各key声明独立limit_req_zone,最后在server或location中引用对应zone并配置burst等参数。

可以通过 Nginx 的 limit_req 模块结合 map 指令,按不同域名设置独立的访问频率限制策略。关键在于将域名映射为不同的限流区域标识,再分别配置限流规则。
定义基于域名的限流键值映射
在 http 块中使用 map 指令,把请求的 $host 映射为限流用的键(如域名前缀或自定义标识),避免所有域名共用同一限流区域:
map $host $limit_key {
default $host;
example.com "site_a";
api.example.com "site_b";
admin.test.org "site_c";
}这样可让不同域名走各自的限流逻辑,互不影响;未匹配的域名默认用完整 host,适合快速适配新域名。
声明多个独立的限流区域
每个域名(或分组)对应一个 limit_req_zone,共享内存大小需根据并发量预估(例如 10MB 可支持约 16 万个 key):
limit_req_zone $limit_key zone=site_a:10m rate=5r/s; limit_req_zone $limit_key zone=site_b:10m rate=20r/s; limit_req_zone $limit_key zone=site_c:10m rate=3r/s;
-
rate 支持
r/s或r/m,建议统一用r/s避免歧义 - 同名 zone 不能重复定义,所以必须用不同名称(如
site_a、site_b) - 若多个域名共用相同策略,可映射到同一个 key,复用一个 zone
在 server 块中按需启用限流
在对应虚拟主机的 server 块内,用 limit_req 引用对应 zone,并控制突发请求处理方式:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">limit_req zone=site_a burst=10 nodelay;
location /api/ {
limit_req zone=site_b burst=5 delay=2;
proxy_pass http://backend_api;
}}
-
burst 允许突发请求数,超出后返回 503;搭配
nodelay可立即响应,否则排队等待 - 可在
location级细粒度控制,比如只对 API 路径限流,静态资源除外 - 注意:同一请求可能被多个
limit_req指令匹配(如 server + location),Nginx 会逐级检查并以最内层为准
验证与调试技巧
启用日志记录限流状态,便于排查是否命中、被拒绝或延迟:
log_format limitlog '$remote_addr - $host [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'req_time=$request_time limit_status=$limit_status';
<p>access_log /var/log/nginx/limit_access.log limitlog;-
$limit_status值为-(未限流)、hit(触发限流)、passed(通过但计入统计)、delayed(排队延迟) - 用
ab或wrk模拟压测,观察日志和返回码(429 或 503) - 临时关闭某域名限流?注释掉对应
limit_req行即可,无需重启 Nginx

















