nginx的limit_conn模块用于限制每个客户端的并发tcp连接数,通过limit_conn_zone定义共享内存区域并指定key(如$binary_remote_addr),再在server或location中用limit_conn启用,所有匹配的限制取最小值,拒绝连接默认返回503。

Nginx 的 limit_conn 模块用于限制每个客户端(按 IP 或其他 key)可建立的并发连接数,适用于防刷、保护后端资源等场景。它不控制请求数(那是 limit_req 的职责),而是控制 TCP 连接数量,对长连接(如 WebSocket、HTTP/2 流)尤其关键。
定义连接限制区域(zone)
必须先在 http 块中用 limit_conn_zone 定义共享内存区域,指定限制依据和内存大小:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 以客户端二进制 IP 地址为 key,分配 10MB 共享内存
# 可存储约 16 万个独立 IP 的连接计数(估算值)
}
常用 key:
• $binary_remote_addr:精确到 IPv4/IPv6 客户端地址(推荐,比 $remote_addr 更省内存)
• $server_name:按虚拟主机名限连(较少用)
• 自定义变量(需确保其值稳定、低基数)
在 server 或 location 中启用限制
在需要限连的位置(如 server 或 location /api/)使用 limit_conn 指令:
server {
listen 80;
server_name example.com;
limit_conn addr 10; # 每个 IP 最多 10 个并发连接
# 若同时配置了 limit_conn zone=addr 5 和 zone=server 100,则取更严格的 5
}
注意:
• 同一请求匹配多个 limit_conn 时,**所有限制都生效,取最小值**
• 若放在 location 中,只对该路径生效;放在 server 中则作用于整个虚拟主机
• 不支持嵌套或条件判断,需靠 location 匹配逻辑控制范围
配合状态码与日志观察效果
被拒绝的连接默认返回 503 Service Temporarily Unavailable,可通过 limit_conn_status 修改:
limit_conn_status 429;
# 返回 429 Too Many Requests,更符合限流语义
启用日志记录被限连事件(需开启 debug 日志级别或自定义 log_format):
• 添加 log_format 包含 $limit 和 $limit_rate 变量(非必需)
• 实际调试建议临时开启 error_log /path/error.log debug;,搜索 “limiting connections” 关键字
常见注意事项
• limit_conn 统计的是当前活跃的连接数(即已建立、未关闭的 TCP 连接),不是请求数也不是每秒请求数
• 对于启用了 keepalive 的 HTTP/1.1 客户端,一个连接可复用多次,因此 10 连接 ≠ 10 请求
• Nginx worker 进程间共享 zone 数据,无需额外同步配置
• 内存不足时 zone 会自动淘汰旧条目,但应根据预估客户端数合理设置 zone 大小(10m ≈ 16 万 IP)
• 若用 CDN 或反向代理,$binary_remote_addr 将是代理 IP,此时应改用 $http_x_forwarded_for 并确保可信(需配合 set_real_ip_from)











