limit_rate_after指令实现“先快后慢”下载:前N字节不限速,超阈值后按limit_rate限速,需与limit_rate配合使用,支持Range请求和变量动态控制。

Nginx 的 limit_rate_after 指令正是为这种“先快后慢”的下载策略设计的:它允许客户端在下载开始阶段以全速传输,达到指定字节数后再启用限速。这既提升了小文件或首屏资源的响应体验,又避免了大文件长期占用带宽。
理解 limit_rate_after 的工作逻辑
该指令必须与 limit_rate 配合使用,单独设置无效。Nginx 会为每个请求维护一个已发送字节数计数器:
- 当已发送字节数 ≤
limit_rate_after值时,不限速(实际速率由 upstream 或网络决定) - 一旦超过该阈值,立即按
limit_rate设定的字节数/秒执行限速 - 限速作用于单个连接的整个响应体,不跨请求、不跨连接累积
典型配置示例(适用于静态文件服务)
以下配置将使所有 .zip 和 .iso 文件前 5MB 全速下载,之后限速为 512KB/s:
location ~ \.(zip|iso)$ {
root /data/files;
limit_rate_after 5m; # 注意:单位支持 m(MB)、k(KB)、g(GB)
limit_rate 512k;
}
说明:
-
5m表示 5 兆字节(5 × 1024 × 1024 = 5,242,880 字节),不是 5MB 精确值但足够实用 - 若文件总大小 ≤ 5m,则全程无限制;若为 100MB,则前 5MB 快,后 95MB 以 512KB/s 流式下发
- 该策略对 Range 请求(断点续传)同样生效,Nginx 从当前 offset 开始计算已发送量
结合 $sent_http_content_length 实现更精细控制
若希望仅对大文件启用限速(比如 >10MB 才触发),可配合 map 和变量判断:
map $sent_http_content_length $limit_rate_value {
~^[1-9][0-9]{7,} 256k; # 大于等于 10MB(10^7 字节)时设为 256KB/s
default 0; # 其他情况不限速(limit_rate 0 表示关闭限速)
}
<p>server {
location ~ .pdf$ {
root /data/docs;
limit_rate_after 2m;
limit_rate $limit_rate_value;
}
}</p>注意:$sent_http_content_length 是响应头中的 Content-Length 值,在日志或 map 中可用,但不能用于 if 判断(因发生在 header 发送后)。
调试与验证要点
实际部署时建议开启 access_log 并记录关键变量,便于确认是否命中限速逻辑:
- 添加日志格式:
log_format rate_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $limit_rate $limit_rate_after'; - 用
wget --no-cache -O /dev/null http://example.com/big.zip测试,并观察传输速率变化(前段快、后段明显变慢) - 注意浏览器开发者工具中 Network 面板的“Transfer Size”可能受压缩/缓存干扰,建议用命令行工具验证原始流速

















