需在http块中定义limit_conn_zone区域并用limit_conn在server或location中启用,如limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10; 可配合limit_rate限速及日志调试。

要配置 limit_conn_zone 在共享内存中建立单客户端并发连接数限制,核心是定义一个基于客户端标识(如 IP)的连接计数区域,并将其绑定到具体作用域(如 server 或 location)上生效。
定义 limit_conn_zone 区域
在 http 块中使用 limit_conn_zone 指令声明共享内存区域,指定键(key)、大小(zone)和内存名称:
- 键通常用
$binary_remote_addr(压缩后的客户端 IP,更省内存)或$remote_addr - zone 名称(如
addr)用于后续引用,大小(如10m)决定能存储多少个独立客户端的状态 - 示例:
limit_conn_zone $binary_remote_addr zone=addr:10m;
在作用域中启用 limit_conn 限制
仅定义 zone 不会生效,需在 server、location 或 http 块中使用 limit_conn 指令启用实际限制:
-
limit_conn addr 10;表示每个唯一客户端最多维持 10 个并发连接 - 若放在
server块,则对整个虚拟主机生效;放在location则只限制该路径下的连接 - 注意:该限制针对的是 TCP 连接数(非请求数),适用于长连接场景(如 WebSocket、HTTP/2 流复用)
配合 limit_rate 控制带宽(可选但推荐)
单纯限制连接数可能不足以防资源耗尽,建议搭配 limit_rate 控制单连接传输速率:
- 例如:
limit_rate 512k;限制每个连接最大带宽为 512 KB/s - 可结合
limit_rate_after实现“先快后限”,提升首屏体验
验证与调试要点
配置生效后可通过日志和响应头确认行为:
- Nginx 日志中出现
503 Service Temporarily Unavailable表示连接被拒绝 - 启用
limit_conn_log_level warn;可记录触发限流的详细信息 - 注意:同一 NAT 后多个用户共享一个
$binary_remote_addr,可能误伤,此时可考虑结合$cookie_或$request_id等更精细标识(需客户端配合)


















