nginx中需组合limit_rate与limit_conn才能有效实现下载限速和连接数限制:前者控制单连接速率(如limit_rate 300k),后者限制单ip并发连接数(如limit_conn perip 2),并配合limit_rate_after实现首段免限速。

在 Nginx 中,用 location 块实现下载限速和连接数限制,关键在于组合使用 limit_rate(单连接下行限速)与 limit_conn(单 IP 并发连接数控制),二者必须配合部署才真正有效——只限速不管连接数,用户开多个线程就能绕过;只限连接不控速率,单个连接仍可吃满带宽。
一、对特定路径做下载限速(limit_rate)
limit_rate 必须写在 location 块内,单位是字节/秒,支持 k(千字节)、m(兆字节)后缀:
-
limit_rate 512k;表示每个连接最大 ≈500 KiB/s(即 524,288 字节/秒) -
limit_rate_after 2m;必须与limit_rate同时出现,表示前 2MB 立即发送,之后才启用限速 - 只作用于响应体(如文件内容),HTTP 头部不受影响;gzip 开启时,限的是压缩后流量
- 常见写法:
location ^~ /download/ {
limit_rate_after 5m;
limit_rate 300k;
}
二、限制同一 IP 的并发连接数(limit_conn)
单靠 limit_rate 无法防多线程下载,必须叠加连接数限制。需先定义共享内存区,再在 location 中引用:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 在
http块中添加:
limit_conn_zone $binary_remote_addr zone=perip:10m;
(用客户端二进制 IP 地址做键,分配 10MB 内存存储计数) - 在目标
location中启用:
location ^~ /download/ {
limit_rate_after 5m;
limit_rate 300k;
limit_conn perip 2;
}
表示:每个 IP 最多维持 2 个并发连接访问该路径 - 注意:
limit_conn统计的是已建立的 TCP 连接,不是请求数;若后端处理慢,连接积压会导致新请求排队或超时
三、按文件类型精细化限速(正则 location)
如果只想限制大文件(如 ZIP、MP4),避免影响普通网页资源,可用正则匹配:
- location ~ \.(zip|iso|mp4|mkv|tar\.gz)$ {
limit_rate_after 10m;
limit_rate 1m;
limit_conn perip 1;
} - 注意转义点号和特殊字符(如
\.gz),避免误匹配 - 该规则优先级高于前缀匹配,但低于 exact 匹配;建议放在配置靠后位置,避免被其他 location 覆盖
四、验证是否生效的实用方法
不要依赖日志或主观感觉,用命令实测最可靠:
- 用
curl测单连接速度:
curl -o /dev/null -s -w '%{speed_download}\n' https://example.com/download/big.zip - 开两个终端同时下载,观察第二个是否被拒绝或明显变慢(验证
limit_conn) - 检查 Nginx 错误日志是否有
limiting connections by zone记录(需配置limit_conn_log_level notice;) - 确认未启用
sendfile on,否则首包可能突增;如必须开启,建议加tcp_nodelay on;缓解










