limit_conn_zone用于定义连接数限制的共享内存区域,需配合limit_conn使用;以$binary_remote_addr为键可按IP限流,zone大小决定可跟踪客户端数量,1MB约支持1.6万个key。

在 Nginx 的 http 块中使用 limit_conn_zone,是为了定义连接数限制的共享内存区域,它是实现并发连接控制的基础配置。
limit_conn_zone 的基本语法和作用
该指令用于声明一个内存区域,用来存储客户端标识(如 IP 地址)及其对应的当前连接数。它本身不生效,必须配合 limit_conn 指令在 server 或 location 块中使用才起作用。
典型写法如下:
limit_conn_zone $binary_remote_addr zone=addr:10m;
说明:
– $binary_remote_addr 是键(key),表示客户端真实 IP 的二进制格式,比 $remote_addr 更节省内存;
– zone=addr:10m 表示创建名为 addr 的共享内存区,大小为 10MB,足够存储约 16 万个 IP 的连接状态。
选择合适的键值很关键
键值决定了“谁”被限流。常用选项包括:
-
$binary_remote_addr:按客户端 IP 限流,最常用,适合防止单 IP 过度占用连接; -
$server_name:按请求的域名限流,适用于多租户或泛域名场景; -
$request_uri或$args:按 URL 或参数限流,需谨慎,因可能生成大量 key 导致内存耗尽; - 组合键如
$binary_remote_addr$uri:需用 map 指令预处理,避免直接拼接出错。
内存大小设置要合理
zone 大小直接影响可跟踪的客户端数量:
- 每个 key 占用约 64 字节(含连接计数、超时等元数据);
- 1MB 内存约支持 1.6 万个独立 key;
- 若设为
zone=addr:5m,最多跟踪约 8 万个不同 IP; - 过小会导致 key 频繁淘汰,限流失效;过大则浪费内存,且重启后状态清空,无持久化。
注意与 limit_conn 的配合使用
limit_conn_zone 只是“建表”,真正限制靠 limit_conn。例如:
server {
limit_conn addr 10;
}
表示每个 IP 最多建立 10 个并发连接。若同时配置多个 limit_conn,会取其中最小值。另外,它只限制 accept 后的连接数,不控制请求速率(那是 limit_req 的职责)。










