limit_conn_zone 是 nginx 中用于单 ip 全站并发连接限制的核心指令,需在 http 块中定义共享内存区域(如 zone=perip:10m),再通过 limit_conn perip 10 在 server 或 http 块中启用每 ip 最多 10 个并发连接的限制。

在 Nginx 中,limit_conn_zone 是实现单 IP 全站并发连接限制的核心指令。它通过定义一个共享内存区域来统计每个客户端 IP 的当前活跃连接数,并配合 limit_conn 指令在 server 或 location 块中启用限制。
定义 limit_conn_zone(全局配置)
该指令必须放在 http 块中,用于声明一个基于客户端 IP 的连接计数区域:
limit_conn_zone $binary_remote_addr zone=perip:10m;
说明:
-
$binary_remote_addr:比$remote_addr更节省内存的二进制格式客户端 IP,推荐使用; -
zone=perip:10m:定义名为perip的共享内存区,大小为 10MB,足够存储约 16 万个独立 IP 的连接状态; - 该区域是全局的,所有 server 和 location 都可复用。
在全站范围应用限制(server 或 http 级)
要在整个站点生效,最直接的方式是在 server 块或 http 块中添加 limit_conn:
limit_conn perip 10;
说明:
- 表示每个 IP 最多允许 10 个并发连接(包括 HTTP/1.x 的 keepalive 连接、HTTP/2 的多路复用流等);
- 放在
http块中,则对所有虚拟主机生效;放在server块中,则仅对该站点生效; - 注意:Nginx 对每个 TCP 连接计数,不是请求数。例如一个 HTTP/1.1 keepalive 连接持续发起多个请求,只算 1 个连接。
配合 limit_rate 控制带宽(可选增强)
仅限连接数不能防止慢速攻击或大文件下载耗尽资源,建议搭配速率限制:
limit_rate 512k;
说明:
- 对超出连接限制的请求不生效,但对已放行的连接可限制其响应传输速率;
- 可放在
server、location或if块中,灵活控制不同资源的带宽; - 避免与
limit_conn放在同一 location 导致误限——通常建议放在更外层(如 server)统一控制。
验证与调试技巧
启用后可通过以下方式确认是否生效:
- 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,被拒绝连接会记录limiting connections by zone; - 用
ab或wrk模拟多并发请求,观察返回状态码是否出现503 Service Temporarily Unavailable; - 检查共享内存使用情况:
nginx -T 2>/dev/null | grep limit_conn_zone确认配置加载无误; - 注意:本地测试时若走 localhost 或代理,
$binary_remote_addr可能为 127.0.0.1,需用真实外网 IP 或 X-Forwarded-For(需配合set_real_ip_from)。











