nginx基于limit_conn实现连接数并发控制,需先在http块用limit_conn_zone定义共享内存区域(如$binary_remote_addr zone=addr:10m),再在server或location中用limit_conn addr 10限制单ip最多10并发连接,适用于tcp层限流与防慢连接攻击。

利用 Nginx 网关实现基于连接数的 limit_conn 并发控制,核心是通过 limit_conn_zone 定义共享内存区域,并在 server 或 location 块中用 limit_conn 限制每个键(如客户端 IP)允许的最大并发连接数。它作用于 TCP 连接层面,适用于防止慢连接攻击、保护后端资源或做粗粒度限流。
定义连接限制的共享内存区域
必须先用 limit_conn_zone 指令在 http 块中声明一个共享内存区域,用于存储连接计数状态:
-
limit_conn_zone $binary_remote_addr zone=addr:10m;:以客户端二进制 IP 地址为键,分配 10MB 共享内存(约可存储 16 万个独立 IP 的连接状态) - 推荐使用
$binary_remote_addr而非$remote_addr,节省内存且避免字符串哈希开销 - 若需按域名或 URI 限流,也可用
$server_name或$uri,但要注意键值长度和内存占用
在具体位置启用连接限制
在 server 或 location 块中调用 limit_conn 指令,绑定之前定义的 zone 并指定最大连接数:
-
limit_conn addr 10;:限制每个 IP 最多 10 个并发连接(超过则返回 503) - 可叠加多个规则,例如同时限制单 IP 和单域名:
limit_conn addr 10; limit_conn server_name 100; - 注意:该指令对 HTTP/2 多路复用连接也生效——一个 HTTP/2 连接算作 1 个连接,无论其中多少个 stream
配合其他指令提升实用性
limit_conn 单独使用较简单,但常需结合以下配置增强可控性与可观测性:
- 用
limit_conn_log_level error;控制触发限流时的日志级别(默认 warn),避免刷屏 - 用
limit_conn_status 503;自定义返回状态码(默认就是 503) - 搭配
limit_rate可进一步控制被限流连接的响应带宽,缓解资源耗尽风险 - 开启
log_format中的$limit和$limit_key变量,便于在 access log 中记录限流详情
验证与调试要点
上线前建议通过工具模拟并发连接并观察行为:
- 用
ab -n 100 -c 20 http://your-domain/测试,查看是否部分请求返回 503 - 检查 Nginx 错误日志,确认是否有
limiting connections by zone类似记录 - 注意:keepalive 连接会被持续计入,长期空闲连接仍占配额;必要时可通过
keepalive_timeout缩短其生命周期 - 若使用了 CDN 或代理(如 SLB),需确保
$binary_remote_addr实际取到的是真实客户端 IP(通常需配置set_real_ip_from+real_ip_header X-Forwarded-For)










