Nginx 的 limit_rate 是连接级静态限速,需通过 map 指令结合文件后缀、用户身份或 limit_rate_after 实现动态差异化限速,且须配合 auth_request 等模块保障安全性。

Nginx 的 limit_rate 本身是连接级的静态限速指令,不能直接按文件类型或用户等级动态调整。但可以通过组合 map、limit_rate_after、变量和条件判断(如 if 配合 set)实现差异化限速效果。
基于文件后缀区分限速
利用 map 指令将请求 URI 后缀映射为不同速率值,再赋给 limit_rate:
map $request_uri $limit_rate_value {
~\.(zip|rar|iso|dmg|tar\.gz)$ 512k;
~\.(mp4|mkv|avi)$ 1m;
default 0; # 不限速
}
server {
location /download/ {
limit_rate $limit_rate_value;
# 其他配置...
}
}
注意:map 匹配的是完整 $request_uri,建议配合 $uri 或正则提取更可靠;若需忽略查询参数,可用 $uri 替代 $request_uri。
根据用户身份(如 Cookie 或 Header)分级限速
通过检查 Cookie(例如 user_level=premium)或自定义请求头(如 X-User-Level: vip),用 map 动态设定速率:
map $cookie_user_level $user_rate {
"premium" 2m;
"basic" 512k;
default 128k;
}
# 或用 header:
# map $http_x_user_level $user_rate {
# "vip" 3m;
# "free" 256k;
# default 128k;
# }
<p>server {
location /files/ {
limit_rate $user_rate;</p><h1>推荐搭配 limit_rate_after,允许快速响应头部后再限速</h1><pre class='brush:php;toolbar:false;'> limit_rate_after 1m;
}}
该方式依赖客户端传入可信标识,生产环境建议结合后端鉴权(如 JWT 校验)+ Nginx 的 auth_request 模块做前置校验,避免伪造 Cookie/Head 导致策略失效。
结合下载进度智能限速(提升体验)
使用 limit_rate_after 允许初始高速传输(如前 1MB),再启用限速,兼顾首屏加载与带宽控制:
-
limit_rate_after 1m;:前 1MB 不限速,之后按limit_rate执行 - 可与上述
map变量联用,例如limit_rate_after $user_initial_burst; - 对大文件下载友好,减少用户感知卡顿
注意事项与限制
limit_rate 是 per-connection 限速,不跨请求累计;它无法替代流量整形(如 token bucket),也不支持突发带宽控制。关键点包括:
- 不能在
if块中直接使用limit_rate(语法错误),必须通过map提前计算变量 - 变量值必须是合法速率单位(
k、m、b/s等),空值或非法值会导致限速失效(等效于 0) - 若需更精细控制(如按 IP+用户等级双重限速),应考虑
limit_conn+ 自定义 key,或接入 OpenResty/Lua 实现逻辑

















