Nginx中基于域名的虚拟主机本身不支持并发数限制,但可通过limit_conn、limit_req模块结合map指令实现按域名的连接数或请求速率限制,并支持白名单豁免和调试验证。

在 Nginx 中,**基于域名的虚拟主机本身不直接提供“并发数限制”功能**,但你可以通过 limit_conn、limit_req 等模块,结合 map 或 server 块作用域,实现按域名(即按 server_name)维度的连接数或请求数限制。
1. 使用 limit_conn 按域名限制并发连接数
核心思路:用 map 将不同域名映射到不同的 key,再在 limit_conn_zone 中定义共享内存区域,最后在 server 块中应用限制。
- 在
http块中定义映射和连接限制区:
<!-- 示例:按域名区分连接限制 -->
map $host $per_host_key {
default $host;
}
limit_conn_zone $per_host_key zone=perhost:10m;
- 在对应
server块中启用限制(例如最多 50 个并发连接):
<!-- 在 server {} 内 -->
limit_conn perhost 50;
⚠️ 注意:$host 是客户端请求头中的 Host 字段,受信任代理需配合 underscores_in_headers on 和 proxy_set_header Host 正确传递;若使用 IP 直连或 Host 缺失,可能 fallback 到 default 或空值,建议加日志验证。
2. 使用 limit_req 按域名限流(更常用)
相比连接数,对 HTTP 请求频率(QPS)的限制更常见且实用。同样借助 map 实现域名粒度控制:
- 定义请求限制区(支持 burst 和 nodelay):
limit_req_zone $per_host_key zone=req_perhost:10m rate=10r/s;
- 在 server 块中启用(允许突发 20 个请求,超限返回 503):
limit_req zone=req_perhost burst=20 nodelay;
✅ 优势:能有效缓解爬虫、暴力探测、刷接口等场景;配合 limit_req_status 429 可返回标准限流响应码。
3. 区分内外网或特定域名放宽限制
可通过嵌套 map 或条件判断,为白名单域名(如管理后台、内部 API)跳过限制:
- 定义白名单标识:
map $host $limit_key {
~^admin\.example\.com$ ""; # 空字符串 → 不限流
default $host;
}
limit_req_zone $limit_key zone=smart_limit:10m rate=5r/s;
- 在 server 中使用该 zone:
limit_req zone=smart_limit burst=10;
? 提示:空字符串 key 不会写入 zone,因此对该域名实际无限制效果。
4. 验证与调试技巧
上线前务必验证规则是否生效:
- 用
nginx -t检查语法; - 查看 error.log 中是否有
limiting requests日志(需开启error_log /path/info); - 用
ab或wrk模拟多域名并发请求,观察响应状态码和延迟变化; - 通过
stub_status或第三方模块(如 nginx-module-vts)监控各域名实时连接/请求数据。
不复杂但容易忽略的是:限制逻辑依赖变量取值时机,$host 在 rewrite 阶段后才稳定,避免在 if 或早期阶段误用未初始化变量。

















