nginx 的 limit_rate 不支持按路径直接限速,需在 location 块中配置,配合 limit_rate_after 实现大文件先高速后限速;支持按路径、文件类型、动态参数(如 $arg_speed)三种限速方式,并需注意 proxy_pass 场景下的配置位置及并发控制需另用 limit_conn。

Nginx 的 limit_rate 本身不支持按路径直接限速,它只能在 location 块中生效,但需配合 limit_rate_after 才能实现更合理的“大文件下载限速”体验——即先高速传输开头部分(如前 1MB),再启用限速,避免小文件也被拖慢。
一、基础路径限速:在 location 中直接配置
对特定路径(如 /download/)下的所有响应统一限速:
- 在 server 或 http 块中定义 location,匹配目标路径;
- 设置
limit_rate 200k;表示最大 200KB/s; - 可选加
limit_rate_after 1m;表示前 1MB 不限速,之后才启用限速。
示例配置:
location /download/ {
limit_rate_after 1m;
limit_rate 200k;
}
注意:limit_rate 单位是字节/秒,k 表示 KB(1024 字节),m 表示 MB(1024×1024 字节)。
二、区分文件类型限速:用正则匹配后缀
若只想限制 ZIP、ISO 等大文件,不干扰图片或 JS/CSS:
- 用正则 location 匹配常见下载后缀;
- 避免与静态资源 location 冲突,建议放在更具体的匹配块中;
- 可结合
try_files或alias确保真实文件存在。
示例:
location ~* \.(zip|rar|iso|exe|dmg|tar\.gz)$ {
limit_rate_after 2m;
limit_rate 512k;
}
三、动态限速:结合 $arg_ 参数或 IP 分级
可通过变量实现简单策略,例如允许带 ?speed=unlimited 的请求跳过限速:
- 使用
map定义限速值变量; - 根据 URL 参数、请求头或 IP 地址映射不同速率;
- 在 location 中引用该变量作为
limit_rate值。
示例(按参数切换):
map $arg_speed $my_limit_rate {
unlimited "0";
default "300k";
}
<p>server {
location /download/ {
limit_rate $my_limit_rate;
limit_rate_after 1m;
}
}</p>当访问 /download/file.zip?speed=unlimited 时,限速被关闭(0 表示不限)。
四、验证与调试要点
配置后务必测试效果,避免误伤正常流量:
- 重启 Nginx 后用
wget -S或curl -I检查响应头是否含X-Content-Type-Options等无关字段不影响限速; - 用
curl -v <url> > /dev/null</url>观察实际下载速度; - 注意:限速作用于单个连接,不控制并发数;如需限制并发,请搭配
limit_conn; - 如果使用了 proxy_pass,限速需放在 proxy 所在的 location,且确保后端未覆盖响应头或分块传输异常。










