limit_rate默认作用于每个连接而非每个IP,要实现按IP限速需结合limit_conn_zone与limit_conn限制并发数,并配合limit_rate控制单连接速率。

在 Nginx 中,limit_rate 指令可用于限制单个连接的响应传输速率,但它**默认作用于每个连接(connection),而非每个 IP 地址**。若想实现“按 IP 限速下载”,需结合 limit_conn 或更合适的 limit_req 模块逻辑,并注意其实际生效范围和常见误区。
理解 limit_rate 的作用范围
limit_rate 是在响应阶段对当前 TCP 连接输出数据的速度做节流,单位是字节/秒(如 limit_rate 100k; 表示最多 100KB/s)。它不区分客户端 IP,只要该连接匹配了配置位置(location、server 等),就会生效。一个 IP 可能建立多个连接,每个连接都独立受限——这不等于“该 IP 总速率被限制”。
真正按 IP 限速下载的常用方式
要约束某个 IP 在单位时间内的总下载带宽,推荐以下组合方案:
- 使用
limit_conn配合limit_conn_zone控制并发连接数,再配合limit_rate降低单连接速度,间接压制整体带宽 - 对大文件下载路径(如
/download/)单独配置,避免影响其他接口 - 利用
geo或map指令动态设置不同 IP 的limit_rate值(适合分级限速)
示例:为下载路径按 IP 限速
以下配置限制每个 IP 最多 2 个并发连接,且每个连接不超过 200KB/s:
limit_conn_zone $binary_remote_addr zone=addr:10m;
<p>server {
location /download/ {
limit_conn addr 2;
limit_rate 200k;</p><h1>其他静态文件配置...</h1><pre class="brush:php;toolbar:false;"><code>}}
说明:
– $binary_remote_addr 比 $remote_addr 更节省内存,用于精确识别客户端 IP
– zone=addr:10m 分配 10MB 内存存储连接状态,支持约 16 万个 IP 记录
– 若用户开多个标签页或下载工具多线程,会受 limit_conn 限制,无法绕过
进阶:不同 IP 段差异化限速
用 map 实现白名单不限速、其他 IP 限速:
map $binary_remote_addr $rate_limit {
default 100k;
192.168.1.100 0; # 0 表示不限速
2001:db8::1 0;
}
<p>server {
location /dl/ {
limit_rate $rate_limit;
}
}注意:limit_rate 0 表示关闭限速;变量必须在 http 块中定义,且仅支持数值或 0。
不复杂但容易忽略:限速只对 HTTP 响应体生效(如文件下载),不控制请求头、短响应或 upstream 通信;若后端是 FastCGI 或 proxy_pass,需确保限速放在最终发送响应的位置(通常在 location 内)。


















