续我的上篇博文:https://mp.csdn.net/postedit/89515598。即本篇博文是在上篇博文修改完之后的nginx.conf文件中进行修改的。
一、限制下载速率的配置方法:
1、在nginx.conf里的http{}里加上如下代码:
[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf #在其中的37行加入下面的内容(在http{}模块中加入的)
37 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
#参数解释:
zone=one 表示设置了名为“one”的存储区,大小为10兆字节
rate=1r/s 的意思是允许1秒钟不超过1个请求
2、在需要限制下载速率不的网站配置server{}里加上如下代码:
[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf #将之前编写的54行注释掉(因为54行也是用来限速的),加入55行的内容
52 location /download/ {
53 limit_conn addr 1;
54 #limit_rate 50k;
55 limit_req zone=one burst=5;
56 }
#参数解释:
burst=5 表示最大延迟请求数量不大于5。如果太过多的请求被限制延迟是不需要的,这时需要使用nodelay参数,服务器会立刻返回503状态码。
3、进行测试:
#在物理机进行访问测试:
[root@foundation83 Desktop]# ab -c 1 -n 10 http://172.25.83.1/download/vim.jpg
Time taken for tests: 9.003 seconds #我们可以看到10个请求大概用来10秒左右(1秒钟只处理一个请求)
Complete requests: 10
Failed requests: 0
Transfer rate: 492.27 [Kbytes/sec] received
二、什么是漏桶算法?
我们假设系统是一个漏桶,当请求到达时,就是往漏桶里“加水”,而当请求被处理掉,就是水从漏桶的底部漏出。水漏出的速度是固定的,当“加水”太 快,桶就会溢出,也就是“拒绝请求”。从而使得桶里的水的体积不可能超出桶的容量。主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算 法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
三、limit_req_zone两种工作情况
limit_reqzone=one burst=10;
默认情况下是这样配置的,这样每个请求就会有一个delay时间,
limit_req_zone $binary_remote_addr zone=one:100m rate=10r/m;
就是每分钟有10个令牌供用户使用,按照1的配置情况,就会有一个delay,每个请求时间就是60/10,那每个请求时间就是6s。limit_reqzone=one burst=10 nodelay;
a). 添加nodelay配置,这样就是根据你的网络状况访问,一分钟访问够10次后,服务器直接返回503。
b). Eg:limit_req_zone $binary_remote_addr zone=one:100m rate=10r/m;
就是每分钟有10个令牌供用户使用,按照2的配置情况,就会根据网络情况访问url,如果一分钟超过10个令牌,服务器返回503,等待下一个一分钟领取访问令牌。
rate=10r/m 的意思是每个地址每分钟只能请求10次,也就是说根据漏桶原理burst=1 一共有1块令牌,并且每分钟只新增10块令牌,
1块令牌发完后多出来的那些请求就会返回503。
加上 nodelay之后超过 burst大小的请求就会直接返回503,如果没有该字段会造成大量的tcp连接请求等待。
示例:
http{
...
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个,
#rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
...
server{
...
location {
...
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
limit_req zone=allips burst=5 nodelay;
...
}
...
}
...
}