Nginx无法原生按百分比限制单客户端带宽,需用limit_rate设绝对速率上限(如512k),再配合limit_conn_zone和limit_conn控制每IP并发数,实现总带宽占用封顶;支持map动态限速,但无实时百分比计算能力。

在 Nginx 中,location 块本身不能直接限制“单台客户端的带宽占用率”,但可以通过 limit_rate 和 limit_conn(配合 limit_conn_zone)组合实现对单个客户端连接的带宽与并发数控制。关键在于:Nginx 没有原生“按百分比限制带宽”的指令,只能设置**绝对速率上限(字节/秒)**;所谓“占用率”需结合服务器总带宽手动换算。
1. 使用 limit_rate 限制单个响应的传输速率
limit_rate 是最直接的方式,它作用于每个请求的响应阶段,限制该连接向客户端发送数据的速度:
- 放在
location、server或http块中均可,推荐按需置于具体 location 下 - 单位是字节/秒(如
limit_rate 512k;表示 512 KB/s) - 支持变量(如
$limit_rate),可用于动态控制
示例(限制图片下载限速 1MB/s):
location ~ \.(jpg|jpeg|png|gif)$ {
limit_rate 1m;
}2. 结合 limit_conn 实现“每 IP 并发连接数 + 单连接限速”双重控制
仅靠 limit_rate 无法防止一个客户端开多个连接“绕过限速”。需用 limit_conn 控制同一 IP 的并发连接数:
- 先在
http块定义共享内存区(基于 $binary_remote_addr 精确识别客户端) - 再在
location中启用连接数限制,并叠加limit_rate
配置示例:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
<pre class='brush:php;toolbar:false;'>server {
location /download/ {
limit_conn perip 2; # 同一 IP 最多 2 个并发连接
limit_rate 512k; # 每个连接限速 512KB/s
}
}}
这样,单个客户端最多占用 2 × 512KB/s = 1MB/s 带宽,相当于对总出口带宽做了可预期的“占用率封顶”。
3. 动态限速:根据请求参数或头信息差异化限速
可通过 map 指令定义限速变量,实现更灵活策略,比如对未登录用户限速更低:
http {
map $http_authorization $rate_limit {
"" 256k; # 无认证头 → 256KB/s
default 2m; # 其他情况 → 2MB/s
}
<pre class='brush:php;toolbar:false;'>server {
location /api/ {
limit_rate $rate_limit;
}
}}
4. 注意事项与常见误区
-
limit_rate作用于响应体传输阶段,不影响请求头、静态文件缓存命中后的快速返回 - 限速值建议以 KB 或 MB 为单位(如
512k、2m),避免写成524288这类易错数字 - 若需“按服务器总带宽百分比”动态限速,需外部脚本更新变量,Nginx 本身不支持实时百分比计算
- HTTPS 下仍有效,但限速发生在 SSL 加密后,不影响加密开销
不复杂但容易忽略:真正起作用的是 limit_rate + limit_conn 的组合,而不是 location 本身具备带宽感知能力。


















