nginx server块中limit_rate按连接限速,不支持ip汇总带宽;配合limit_rate_after可实现“先快后慢”;多连接会绕过单连接限速,需结合limit_conn控制并发数。

在 Nginx 的 server 块中限制“单个主机的客户端连接带宽速度”,本质是限制该 server 下每个 TCP 连接的下行响应速率——即每个连接发给客户端的数据流速。Nginx **不支持按 IP 汇总带宽**(比如“这个 IP 总共不准超过 1Mbps”),它只支持按连接限速,这是由其架构决定的。
直接配置 limit_rate 实现每连接限速
将 limit_rate 指令写在目标 server 块内即可,它会作用于该虚拟主机下所有未被子块覆盖的请求:
-
limit_rate 256k;表示每个连接最大发送 256 KB/秒(即 2,097,152 bit/s ≈ 2.1 Mbps) - 单位支持
k(×1024)、m(×1024²),数值为字节/秒,不是 bit/s - 设为
0表示不限速;不配置则默认为0 - 该指令可出现在
http、server、location等上下文中,server级配置最常用且易管理
搭配 limit_rate_after 提升用户体验
单纯限速会让小文件或首屏资源变慢。用 limit_rate_after 可实现“先快后慢”,适合下载类场景:
-
limit_rate_after 5m;表示前 5 MB 数据不限速(快速传输 header、图标、视频关键帧等) -
limit_rate 128k;表示从第 5,000,001 字节开始,以 128 KB/秒持续发送 - 二者必须在同一作用域(如都在
server或同个location内),否则limit_rate_after不生效
注意并发绕过问题与应对思路
一个客户端开多个连接(如多线程下载、浏览器并行请求),就会获得 N 倍限速效果。这不是配置错误,而是 Nginx 的设计事实:
- 例如:设
limit_rate 100k+ 允许 4 并发 → 客户端实测可达 ≈ 400 KB/秒 - 若需控制总带宽,只能结合
limit_conn限制单 IP 连接数(如只允许 1 个连接) - 示例:
limit_conn_zone $binary_remote_addr zone=perip:10m;(在http块) +limit_conn perip 1;(在server块) - 但要注意:
limit_conn控制的是并发连接数,和带宽无直接换算关系;它不能替代限速,只是辅助手段
验证是否生效的实用方法
不要依赖响应头(Nginx 不添加限速相关 header),用命令行实测更可靠:
- 单连接测速:
curl -o /dev/null -s -w '%{speed_download}\n' http://your-domain/file.zip - 模拟多连接:
curl -o /dev/null -s -w '%{speed_download}\n' http://your-domain/file.zip & curl -o /dev/null -s -w '%{speed_download}\n' http://your-domain/file.zip - 注意实测值会有 ±15% 浮动,受系统 buffer、TCP 窗口、客户端接收能力影响,不必追求绝对精准











