Nginx中用limit_rate指令限制单连接下载带宽,需配合limit_rate_after实现首段不限速,并结合limit_conn防多线程并发;支持按路径、文件类型或动态变量差异化限速,单位为k/m,验证可用curl测速。

在 Nginx 的 location 块中限制单个客户端连接的下载带宽,核心是使用 limit_rate 指令——它作用于每个 TCP 连接的响应体发送阶段,直接控制该连接的数据流出速度。
这不是按 IP 总带宽限速,而是“一个连接一个限”,所以开多个下载线程(如迅雷、curl -O -C - 多线程)时,每条连接各自受控,需配合 limit_conn 才能真正防并发挤占。
✅ 正确配置方式:在匹配目标资源的 location 中设置
1. 按路径限速(推荐,高效且易维护)
适用于统一管理的下载目录,比如 /download/ 下所有文件:
location ^~ /download/ {
alias /var/www/files/;
limit_rate_after 2m; # 前 2MB 不限速(提升首段体验)
limit_rate 512k; # 超过后稳定限为 512KB/s(≈4Mbps)
}-
^~确保前缀匹配优先于正则,避免被泛匹配覆盖 -
limit_rate_after必须写在limit_rate之前,且两者必须同在同一个location块内
2. 按文件类型限速(更精细)
只对真正吃带宽的大文件限速,放过图片、JS、CSS 等小资源:
location ~* \.(zip|iso|dmg|mp4|mkv|tar\.gz|rar)$ {
limit_rate_after 5m;
limit_rate 300k;
}- 注意转义点号:
\. -
~*表示不区分大小写匹配 - 避免放在
location / { ... }这类兜底块之后,否则可能不生效
3. 动态差异化限速(白名单或参数驱动)
用 map 在 http 块顶层定义变量,再在 location 中引用:
http {
map $remote_addr $dl_rate {
default "300k";
192.168.1.100 ""; # 内网运维IP不限速
2001:db8::1 "";
}
map $arg_speed $dl_rate_param {
default "300k";
"unlimited" ""; # ?speed=unlimited 跳过限速
"fast" "1m";
}
server {
location ^~ /download/ {
limit_rate_after 1m;
limit_rate $dl_rate;
limit_rate $dl_rate_param; # 可叠加,后者优先(变量覆盖)
}
}
}- 空字符串
""表示不限速(即limit_rate ""等效于limit_rate 0) - 多个
map可组合,但limit_rate只能有一个值,建议用单一变量承接逻辑
⚠️ 关键注意事项
-
limit_rate单位支持k(KB/s)、m(MB/s),例如512k = 524288 字节/秒 - 它不控制请求频率或连接总数,仅管单连接流速;要防多线程刷取,必须加
limit_conn:limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 2; # 每个 IP 最多 2 个并发下载连接
- 若用了
proxy_pass,limit_rate要放在location块里(不是 upstream 或 proxy 后端),否则无效 -
sendfile on在某些 Linux 内核下可能弱化限速效果,可加tcp_nodelay on;辅助稳定流控
? 如何验证是否生效?
用 curl 测速最直观:
curl -o /dev/null -s -w 'Speed: %{speed_download} KB/s\n' https://example.com/download/big.zip正常应看到速率稳定在设定值附近(如 Speed: 512.3 KB/s),且大文件前几 MB 明显更快(limit_rate_after 生效)。


















