在Nginx中,对特定server块统一限速最直接方式是使用limit_rate指令,按连接独立生效,支持单位k/m/b及变量动态设置,并可配合limit_rate_after实现“先快后慢”。

在 Nginx 中,对特定虚拟主机(即某个 server 块)下的所有请求统一限制单个连接的下行下载速度,最直接有效的方式就是把 limit_rate 指令写在该 server 块内。它按每个 TCP 连接独立生效,不累计、不共享,也不依赖额外模块。
直接在 server 块中设置固定限速值
这是最常用也最清晰的做法。只要放在目标 server 里,该域名下所有响应(除被子作用域显式覆盖外)都会受此速率约束。
-
limit_rate 500k;表示每个连接最多发送 500 KiB/秒(即 512,000 字节/秒) - 单位支持
k(KiB)、m(MiB)、b(字节),例如:100k、2m、512000b -
limit_rate 0;表示禁用限速(注意:不是“不限制”,而是关闭该指令效果)
示例配置:
server {
listen 80;
server_name download.example.com;
limit_rate 300k; # 所有请求默认限速 300 KB/s
location / {
root /var/www/downloads;
index index.html;
}
location /fast/ {
limit_rate 0; # 此路径下完全不限速
alias /var/www/fast-assets/;
}
}配合 limit_rate_after 实现“先快后慢”
适合大文件下载场景:前 N 字节快速传输,提升用户感知;超出后再启用限速。
- 必须和
limit_rate在同一作用域(如都在server或都在location内) -
limit_rate_after 2m;表示前 2 MiB 不限速 - 超出后立即按
limit_rate设定值开始限速
示例:
server {
listen 443 ssl;
server_name files.example.com;
limit_rate_after 1m; # 前 1 MB 不限速
limit_rate 100k; # 超过后限为 100 KB/s
location / {
alias /var/www/files/;
}
}使用变量实现动态限速
从 Nginx 1.7.7 起支持变量,可结合 map 指令按条件差异化控制速率。
常见用法包括:
- 根据 User-Agent 区分移动端/桌面端
- 根据 URL 参数(如
?tier=vip)调整速率 - 根据 IP 段或请求头做白名单提速
示例(按 URL 参数动态限速):
map $arg_tier $dynamic_rate {
default 200k;
"vip" 2m;
"test" 500k;
}
server {
listen 80;
server_name api.example.com;
limit_rate $dynamic_rate;
location /download/ {
alias /var/www/data/;
}
}注意事项
-
limit_rate只作用于响应体(response body),不影响响应头、重定向或错误页内容 - 它是每连接限速,不是全站总带宽限制。一个客户端开 3 个并发连接,总速可达 3×设定值
- 若同时用了
limit_conn或limit_req,三者互不干扰,可叠加使用 - 不建议在
http块全局设置limit_rate,否则所有虚拟主机都会被统一限制,失去灵活性
不复杂但容易忽略。


















