使用 $server_name 为 key 的 limit_conn_zone 可实现按域名站点限制并发连接数,如 limit_conn_zone $server_name zone=perserver:10m 和 limit_conn perserver 200,超限返回503。

直接用 limit_conn 配合 limit_conn_zone,以 $server_name 为 key 定义连接区域,就能实现对单个虚拟主机(即某个域名站点)的总并发连接数限制。这是最稳妥、最贴近“按站点分配资源”的做法。
核心配置:按 server_name 建立共享连接区
在 http 块中定义连接限制区域,key 使用内置变量 $server_name:
limit_conn_zone $server_name zone=perserver:10m;
说明:
– $server_name 表示当前匹配到的 server 块中配置的 server_name 值(如 www.example.com)
– zone=perserver:10m 表示开辟一个名为 perserver、大小为 10MB 的共享内存区,足够存储数万个不同域名的连接状态
– 此区域必须定义在 http 级,不能放在 server 或 location 内
在目标 server 块中启用限制
在需要限流的虚拟主机配置块中,加入 limit_conn 指令:
limit_conn perserver 200;
说明:
– 这表示该 server(比如 server_name api.example.com)最多允许 200 个并发连接同时存在
– 所有匹配该 server 的请求(无论路径、方法、是否带 SSL),只要完成请求头读取并进入处理流程,就算作一个连接计入统计
– 超过 200 时,Nginx 直接返回 503 Service Temporarily Unavailable
注意 key 的实际取值逻辑
$server_name 取值依赖于匹配顺序和配置方式,需确保其唯一性与预期一致:
- 若
server块中只写一个server_name example.com,则 key 就是example.com - 若写多个,如
server_name example.com www.example.com,Nginx 默认使用第一个作为$server_name值 - 若需更灵活控制(例如泛域名或 host 头映射),可改用
map构造自定义 key,例如:
default $host;
~^www\.(.+)$ $1;
}
limit_conn_zone $vhost_key zone=byvhost:10m;
与其他限流维度协同使用
单靠虚拟主机维度可能不够,建议组合使用:
- 防止单 IP 滥用:加
limit_conn_zone $binary_remote_addr zone=perip:10m;+limit_conn perip 10; - 避免请求堆积:配合
limit_req_zone $server_name zone=reqperserver:10m rate=10r/s;控制请求速率 - 区分动静态资源:在
location ~ \.(js|css|png)$中关闭或放宽连接限制,减少静态资源占用










