Nginx中用limit_conn限制单IP视频并发连接需先在http块定义limit_conn_zone $binary_remote_addr zone=addr:10m,再在video location中配置limit_conn addr 3–6并叠加limit_rate限速,确保精准控制TCP连接数且兼顾首屏体验。

在 Nginx 中用 limit_conn 限制单 IP 在视频点播站点的并发连接数,核心是结合 limit_conn_zone 定义共享内存区域,并在 server 或 location 块中启用限制。重点在于:区分“连接”与“请求”,确保限制作用于 TCP 连接层面(尤其对长连接、分片下载、HLS/DASH 流等场景有效),同时避免误伤合法用户(比如多标签页、多设备)。
定义 limit_conn_zone 按 IP 分组
在 http 块中声明共享内存区域,使用 $binary_remote_addr(而非 $remote_addr)节省内存、提高查找效率:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
}说明:
• zone=addr:10m 表示分配 10MB 内存存储连接状态,约可记录 16 万个独立 IP;
• 视频站若需支持更多 IP 或更长保留时间,可适当调大(如 20m);
• 不建议用 $remote_addr,因含端口或代理信息时不稳定,且内存占用高。
在 video location 中应用 limit_conn
将限制精准施加到视频资源路径(如 /video/、/mp4/、/hls/ 等),避免影响首页、接口、图片等非带宽敏感资源:
location ^~ /video/ {
limit_conn addr 3;
# 其他配置:root、expires、add_header 等
}说明:
• limit_conn addr 3 表示每个 IP 最多保持 3 个并发 TCP 连接;
• 对 HLS 场景,一个播放器可能建立 4–6 个连接(m3u8 + 多个 ts 分片并行下载),建议设为 4–6;
• 对 MP4 范围请求(Range),浏览器常复用连接,实际并发连接数远低于请求数,3–5 是较稳妥起点;
• 若使用 CDN 或反向代理(如前端有 LVS/Nginx 负载层),需确认 $binary_remote_addr 是否为真实客户端 IP(必要时配合 real_ip 指令)。
配合 limit_rate 防止单连接占满带宽
limit_conn 控制连接数,但不控制单连接速率。一个连接仍可能持续高速下载,导致带宽被少数用户耗尽。建议叠加限速:
location ^~ /video/ {
limit_conn addr 4;
limit_rate 2m; # 单连接限速 2MB/s
limit_rate_after 10m; # 前 10MB 不限速(跳过首屏缓冲)
}说明:
• limit_rate_after 让首屏快速加载,提升体验;
• limit_rate 值按服务器出口带宽和预期并发用户数反推(例如 1Gbps 带宽 ÷ 4 并发 ≈ 31MB/s,再留余量设为 20–25MB/s);
• 注意单位:Nginx 中 m 表示 MB(即 1024×1024 字节),不是 Mbit。
验证与调试技巧
上线前务必测试效果,避免配置错误导致服务不可用:
- 用
curl -v或wget --spider多开几个终端,模拟同一 IP 的并发请求,观察是否返回503 Service Temporarily Unavailable; - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log | grep limit,确认是否触发限制及原因; - 通过
nginx -t校验语法,reload 后用ss -tn | grep :80 | wc -l粗略观察 ESTABLISHED 连接分布; - 若使用 HTTPS,注意 HTTP/2 多路复用会把多个请求复用在一个连接上,此时
limit_conn仍按连接计数,不受影响——这是优势,不是问题。


















