Nginx限速原理、配置与测试
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
1. Nginx限速的场景
Nginx限速是工作中常见的配置需求,对于nginx限速一般有两种场景:
-
限制某个用户在一个给定时间段内能够产生的HTTP请求数,防止短时间内产生大量HTTP请求数,占用服务器过多进程来处理;
-
限制访问的请求速率,一是在下载场景保护磁盘IO,也防止DDOS攻击;
2. Nginx限速的原理
Nginx限速的原理之一是漏斗原理,它的核心思想是:缓存请求,匀速处理,多余的请求直接丢弃。
3. Nginx限速的实现方法
Nginx一般通过这两个模块实现限速:
ngx_http_limit_req_module:
limit_reg_zone:用来限制单位时间内的请求数,即速率限制;
ngx_http_limit_conn_module:
limit_req_conn:用来限制同一时间连接数,即并发限制;
4. Nginx限速的案例
案例一:基于IP对访问速率做限制,限制每秒处理1次请求,突发请求不超过3个,对突发超过3个以后的请求放入缓存区sre。
http {
limit_req_zone $binary_remote_addr zone=sre:5m rate=1r/s;
server {
listen 80;
location /sre2024/ {
limit_req zone=sre burst=3 nodelay;
}
}
配置参数说明:
limit_req_zone $binary_remote_addr zone=sre:5m rate=1r/s;
第一个参数: $binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的⽬目的是缩写内存占用量,是限制同⼀客户端ip地址。
第二个参数: zone=sre:5m 表示生成一个大小为5M,名字为sre的内存区域,用来存储访问的频次信息。
第三个参数: rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
limit_req zone=sre burst=3 nodelay;
第一个参数: zone=sre 设置使用哪个配置区域来做限制, 与上面limit_req_zone 里的name对应。
第二个参数: burst=3 这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
第三个参数: nodelay 如果设置了nodelay,超过访问频次而且缓冲区也满了的时候就会直接返回错误提示,如果没有设置,则所有请求会等待排队,有些请求就会延迟很长时间。
① 修改配置文件:
② 创建测试数据文件:
[root@test102 conf]# echo "This is limit test.">../html/sre2024/index.html
③ 命令行和web测试访问结果:
案例二:基于IP做连接限制,限制同一IP并发为1,限制下载速度为100K
http {
limit_conn_zone $binary_remote_addr zone=sre:5m;
server {
location /sre2024/ {
limit_conn sre 1;
limit_rate 100k;
}
}
}
配置参数说明:
limit_conn sre 1:限制IP并发连接数,显示1个IP只能发起一个链接;
limit_rate 100k:表示限速100k;
① 修改配置文件:
② 创建测试文件:
# dd if=/dev/zero of=../html/sre2024/testfile bs=1M count=300
③ 测试对比:
配置修改前的下载速度:
配置修改后的下载速度:
因加了limit_conn addr 1;配置,所以只限制1个IP同时下载,同时下载速度是100k:
上面两种场景的配置也可以合二为一使用,或者根据单个域名做访问限速,很好用。
欢迎关注SRE成长记一起探讨学习!↓↓↓