Linux下nginx服务的配置文件nginx.conf中模块的讲解之配置limit_req_zone来限制下载速率

续我的上篇博文: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两种工作情况

  1. limit_reqzone=one burst=10;
    默认情况下是这样配置的,这样每个请求就会有一个delay时间,
    limit_req_zone  $binary_remote_addr  zone=one:100m  rate=10r/m;
    就是每分钟有10个令牌供用户使用,按照1的配置情况,就会有一个delay,每个请求时间就是60/10,那每个请求时间就是6s。
  2. 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;
            ...
        }
        ...
    }
    ...
}

猜你喜欢

转载自blog.csdn.net/qq_42303254/article/details/89518574
今日推荐