limit_conn_zone 通过限制每ip并发连接数间接保护带宽,需配合limit_rate控制单连接速率,并用real_ip模块识别真实ip,共享内存区建议10m起。

limit_conn_zone 本身不直接保障带宽,它只限制并发连接数;但通过控制连接数量,能间接防止带宽被少数 IP 占满,为带宽资源提供底层保护。
按 IP 限制并发连接,避免单点耗尽连接池
每个 TCP 连接即使空闲(如 keepalive)也会占用服务器连接资源和部分带宽缓冲区。若不限制,恶意或异常客户端可建立数百个长连接,导致:
- 新用户无法建立连接(accept 队列满、worker_connections 耗尽)
- 内核 socket buffer 和 Nginx 连接结构体内存持续增长
- 大文件下载类请求长期独占连接,间接挤压其他请求带宽
配置示例:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
}
server {
limit_conn perip 8; # 每个真实 IP 最多 8 个并发连接
}
配合 limit_rate 实现带宽分配可控
仅限连接数不能约束单连接的传输速率。必须叠加 limit_rate,才能真正保障带宽不被个别连接霸占:
- limit_rate 作用于已通过 limit_conn 的连接,对响应体传输速率做硬性限制
- 建议设在 server 块,统一管控所有路径,避免 location 冲突
- 典型值:limit_rate 256k;(每连接上限 256KB/s),可根据业务调整
注意:limit_rate 不影响连接计数,也不触发 503,仅降低传输速度。
区分真实客户端 IP,防止代理穿透失效
若服务前置了 CDN 或反向代理,$binary_remote_addr 默认是代理 IP,会导致限流失效:
- 需启用 real_ip 模块,用 set_real_ip_from 指定可信代理网段
- 再通过 real_ip_header X-Forwarded-For 或 X-Real-IP 获取原始 IP
- 否则所有用户会被识别为同一个 IP(如 10.0.0.1),限流失去意义
合理设置共享内存大小,避免 key 淘汰失准
zone 大小决定能跟踪多少独立客户端:
- 10MB zone ≈ 支持 16 万个不同 IP 的连接状态(每个约 64 字节)
- 太小(如 1MB)会导致旧 IP 状态被频繁覆盖,限流不准
- 太大无益——Nginx 重启后状态清空,不持久化
- 高并发站点建议从 10m 起步,根据 access.log 中 uniq IP 数动态调优











