Nginx如何设置限制每个连接的访问速度?
				
									
					
					
						|  | 
							admin 2025年8月21日 17:58
								本文热度 1385 | 
					
				 
				在 Nginx 中限制每个连接(即每个客户端)的访问速度,主要使用的是 limit_rate 和 limit_rate_after 这两个指令。
这是一个非常实用的功能,常用于提供大文件(如视频、ISO镜像)下载的服务,以确保单个客户端不会耗尽所有带宽,保证服务器资源的公平使用。
核心指令
- limit_rate
 
- limit_rate 100k;表示将速率限制在每秒 100KB。
 
- limit_rate 500k;表示将速率限制在每秒 500KB。
 
- limit_rate 1m;表示将速率限制在每秒 1MB。
 
- limit_rate_after(可选,但推荐使用)
 
- 功能:指定在传输了多少数据之后才开始限速。在达到这个阈值之前,传输速度是不受限制的。 
- 为什么需要它:这对于提升用户体验非常有用。例如,允许用户快速加载页面的前几兆内容(如网页本身、小图片),或者允许视频/音频播放器快速缓冲开头的部分,以保证流畅播放,然后再对后续的下载进行限速。 
- 单位:同样支持 - k(千字节) 和- m(兆字节)。
 
- 示例: 
配置方法
这些指令可以放在 Nginx 配置文件的多个上下文中,作用范围不同。
- 在 - server块中设置(对整个虚拟主机生效)
 
server {
    listen 80;
    server_name example.com;
    # 在传输了 5MB 数据后,将速度限制为每秒 200KB
    limit_rate_after 5m;
    limit_rate 200k;
    ... # 其他配置
}
- 在 - location块中设置(对特定请求生效)
 
这是更常见的用法,可以只对下载大文件的路径进行限速。
server {
    listen 80;
    server_name example.com;
    # 正常网站内容,不限速
    location / {
        root /usr/share/nginx/html;
    }
    # 对下载目录 /download/ 下的所有文件进行限速
    location /download/ {
        alias /data/downloads/;
        # 前10MB不限速,之后限速为每秒 500KB
        limit_rate_after 10m;
        limit_rate 500k;
    }
    # 针对特定的文件类型,例如 .iso 文件进行更严格的限速
    location ~* \.(iso|img)$ {
        # 前 20MB 快速下载,之后限速为每秒 100KB
        limit_rate_after 20m;
        limit_rate 100k;
    }
}
- 通过 - $limit_rate变量进行动态控制(高级用法)
 
limit_rate 指令实际上设置的是 $limit_rate 变量的值。这个变量可以在运行时被修改,从而实现动态限速。
示例:根据请求参数中的 speed 值来动态限速
# 在http块中定义一个map,将参数映射为速率值
map $arg_speed $limit_rate_val {
    default   100k;    # 默认100KB/s
    high      500k;    # ...?speed=high 则500KB/s
    low       50k;     # ...?speed=low  则50KB/s
    unlimited off;     # ...?speed=unlimited 则不限速(‘off’ 表示取消限制)
}
server {
    listen 80;
    server_name example.com;
    location /download/ {
        alias /data/downloads/;
        limit_rate_after 10m;
        limit_rate $limit_rate_val; # 使用map定义的变量值
    }
}
这样,用户访问 https://example.com/download/file.iso?speed=high 就可以获得更快的下载速度。
重要注意事项
- 作用单位:- limit_rate限制的是每个 Nginx 工作进程与每个客户端之间的单个连接的速率。如果一个客户端打开了多个连接(例如,用下载工具多线程下载),那么它的总速度是- limit_rate * 连接数。
 
- 全局限速:如果要严格地“每个IP地址”或“每个用户”进行全局限速,需要使用 - limit_conn_zone和- limit_conn来限制并发连接数,再配合- limit_rate才能达到更好效果。- limit_rate本身不限制连接数。
 
- 生效时机:- limit_rate指令在向客户端发送响应时生效。对于已经建立连接的 keep-alive 请求,指令会在新请求到来时应用。
 
- 测试:配置完成后,记得使用 - nginx -t测试配置语法是否正确,然后使用- nginx -s reload重载配置。测试限速效果可以使用- wget、- curl或浏览器下载文件进行观察。
 
总结
| 指令 | 作用 | 示例 | 说明 | 
|---|
| limit_rate | 限制单个连接的传输速率 | limit_rate 200k; | 速度限制为 200KB/s | 
| limit_rate_after | 定义在传输多少数据后开始限速 | limit_rate_after 10m; | 前 10MB 不限速,之后开始限速 | 
最简单的配置就是在你的 server 或 location 块中加入:
limit_rate_after 5m;
limit_rate 100k;
该文章在 2025/8/22 14:18:34 编辑过