使用limit_conn_zone可限制单个IP并发连接数:在http块中配置limit_conn_zone $binary_remote_addr zone=addr:10m定义共享内存区,在server或location中用limit_conn addr N启用,N为每IP最大并发数。

使用 limit_conn_zone 可以有效控制单个 IP 地址在 Nginx 中建立的并发连接数,防止资源被恶意或异常请求耗尽。关键在于正确配置共享内存区域、绑定到 server 或 location 块,并配合 limit_conn 指令生效。
定义连接限制的共享内存区域
在 http 块中使用 limit_conn_zone 指令声明一个基于客户端 IP 的限流区域:
limit_conn_zone $binary_remote_addr zone=addr:10m;
说明:
- $binary_remote_addr 是客户端 IP 的二进制格式,比 $remote_addr 更节省内存;
- zone=addr:10m 表示创建名为 addr 的共享内存区,大小为 10MB,足够存储约 16 万个 IP 记录;
- 内存大小需根据预估的独立 IP 数量调整,不足会导致限流失效(Nginx 日志中会出现 limit_conn: cannot add connection)。
在具体作用域启用连接限制
仅定义 zone 不会生效,必须在 server 或 location 块中用 limit_conn 引用该 zone:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location /api/ {
limit_conn addr 10; # 每个 IP 最多 10 个并发连接
proxy_pass http://backend;
}
}
注意:
- limit_conn addr 10 表示每个匹配 $binary_remote_addr 的 IP,最多允许 10 个同时打开的连接;
- 连接数统计的是当前活跃的 TCP 连接(如长连接、HTTP/1.1 keepalive、WebSocket),不是请求数;
- 若放在 server 块,则对整个虚拟主机生效;放在 location 中则只限制该路径。
配合其他限流机制更精准控制
单独用 limit_conn 无法区分请求类型或用户身份,建议组合使用:
- 对登录接口或上传路径等高消耗接口单独设更低的并发上限(如
limit_conn addr 3); - 结合
limit_req控制单位时间内的请求数(防刷),避免连接数未超但请求频次过高; - 若需按用户 ID(如从 header 或 token 解析)限流,可自定义变量(如
$http_x_user_id)作为limit_conn_zone的 key,但要注意 header 可伪造,需服务端校验。
验证与排错要点
上线后可通过以下方式确认是否生效:
- 查看 Nginx 错误日志:被拒绝的连接会记录
503 Service Temporarily Unavailable及limiting connections by zone; - 用
netstat -an | grep :80 | grep ESTABLISHED | grep实时观察某 IP 的连接数;| wc -l - 注意:HTTPS 下若 Nginx 做 TLS 终止,
$binary_remote_addr是真实客户端 IP;若前面有 LVS 或 CDN,需通过$http_x_forwarded_for并配置set_real_ip_from才能获取真实 IP。










