nginx 不支持按 ip 总带宽限速,仅能通过成对的 limit_rate 和 limit_rate_after 限制单连接速率;前者设限速值(单位字节/秒,k=kib,m=mib),后者设免限速阈值(如前5mb不限速);二者须同在 server 或 location 块中生效,且作用域决定控制范围。

nginx 本身不支持“按 IP 总带宽”限速,limit_rate 只能限制单个 TCP 连接的下行速率,不是所有连接加起来的总速率。一个 IP 开 3 个下载线程,实际速度就是 limit_rate × 3。真正起作用的只有 limit_rate 和必须配套的 limit_rate_after,二者必须写在同一作用域(server 或 location),缺一不可。
限速指令必须成对出现
limit_rate_after 单独写无效,必须和 limit_rate 同时存在才生效:
-
limit_rate_after 5m:前 5MB 数据立即发送,不卡顿(适合视频头、安装包校验段) -
limit_rate 200k:从第 5MB 开始,每个连接恒定限速 ≈200 KiB/s(即 204,800 字节/秒) - 单位是字节/秒,
k表示 KiB(×1024),m表示 MiB(×1024²),不是 bit - 若文件小于
limit_rate_after值(如设了 5m,但文件只有 3MB),则全程不限速
作用域决定限速范围
把指令放在不同层级,控制粒度不同:
-
整个虚拟主机:写在
server块里,该域名下所有响应都受控(可被子块覆盖) -
某类文件:用正则 location,例如
location ~ \.(zip|iso|tar\.gz)$ { limit_rate 300k; limit_rate_after 2m; } -
某个路径前缀:例如
location ^~ /download/ { limit_rate 1m; limit_rate_after 10m; } - 不支持 if 块内单独启用,但可配合 map 实现变量限速(如按参数或 cookie 区分)
常见干扰与绕过情况
配置写了却“没效果”,多数是机制误判或环境影响:
- HTTP/2 多路复用下,一个连接承载多个请求,
limit_rate仍只管这个连接的总出流,但用户感知变弱 - 开启
gzip on后,限的是压缩后流量,不是原始文件大小 - 客户端用
Range请求断点续传,每个 range 视为独立子请求,limit_rate_after对每个 range 单独计数 - 启用
sendfile on时,Linux 内核可能首包突增;建议加tcp_nodelay on或依赖limit_rate_after缓解
验证是否真生效
别看配置,实测最准:
- 用
curl -o /dev/null -s -w '%{speed_download}\n' http://x/file.zip查看实时 KB/s - 用
wget -v观察传输速率和耗时变化 - Nginx 日志不记录限速动作,但
$request_time明显拉长、$bytes_sent增长趋缓即为生效 - 注意实测值有 ±15% 浮动,受 socket buffer、TCP window、客户端接收能力影响,别拿 iPerf 对标











