2018年04月08日 18:00:29 do better myself 阅读数:949更多php
我的分类: php高级知识html
点击如下超连接可查看对应模块的官方详细介绍node
limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"nginx
limit_req_conn 用来限制同一时间链接数,即并发限制算法
其中limit_req_conn模块能够根据源IP限制单用户并发访问的链接数或链接到该服务的总并发链接数服务器
什么是漏桶算法?网络
咱们假设系统是一个漏桶,当请求到达时,就是往漏桶里“加水”,而当请求被处理掉,就是水从漏桶的底部漏出。水漏出的速度是固定的,当“加水”太快,桶就会溢出,也就是“拒绝请求”。从而使得桶里的水的体积不可能超出桶的容量。主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,经过它,突发流量能够被整形以便为网络提供一个稳定的流量。session
示例以下:并发
http {tcp
limit_conn_log_level error;
limit_conn_status 503;
limit_conn_zone $binary_remote_addr zone=one:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_req_zone $binary_remote_addr zone=allips:100m rate=10r/s; 其中$binary_remote_addr有时须要根据本身已有的log_format变量配置进行替换
server {
…………………….
limit_conn one 100;
limit_conn perserver 1000;
limit_req zone=allips burst=5 nodelay;
………………….
}
}
参数解释:
Zone=one或allips 表示设置了名为“one”或“allips”的存储区,大小为10兆字节
rate=10r/s 的意思是容许1秒钟不超过10个请求
burst=5 表示最大延迟请求数量不大于5。 若是太过多的请求被限制延迟是不须要的 ,这时须要使用nodelay参数,服务器会马上返回503状态码。
limit_conn one 100表示最大并发链接数100
limit_conn perserver 1000表示该服务提供的总链接数不得超过1000,超过请求的会被拒绝
-----------------------------------------------------------------------------------------------------------
示例以下:
http {
limit_req_zone $binary_remote_addr zone=one:100m rate=10r/m;
server {
…………………….
…………………….
limit_req zone=one burst=1 nodelay;
………………….
}
}
rate=10r/m 的意思是容许1秒钟不超过1个请求,最大延迟请求数量不大于5.
若是请求不须要被延迟,添加nodelay参数,服务器会马上返回503状态码。若是没有该字段会形成大量的tcp链接请求等待。
http{
limit_zone one $binary_remote_addr 10m;
server
{
......
limit_conn one 1;
......
}
}
这里的 one 是声明一个 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr 的变量,10m 是会话状态储存的空间
limit_conn one 1 ,限制客户端并发链接数量为1, allow only one connection per an IP address at a time(每次).
d)按照字面的理解,lit_req_zone的功能是经过漏桶原理来限制用户的链接频率,(这个模块容许你去限制单个地址指定会话或特殊须要的请求数 )
而 limit_zone 功能是限制一个客户端的并发链接数。(这个模块能够限制单个地址的指定会话或者特殊状况的并发链接数)
一个是限制并发链接一个是限制链接频率,表面上彷佛看不出来有什么区别,那就看看实际的效果吧~~~
在个人测试机上面加上这两个参数下面是个人部分配置文件
e)http{
limit_zone one $binary_remote_addr 10m;
#limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server
{
......
limit_conn one 1;
#limit_req zone=req_one burst=120;
......
}
}
f)解释一下 limit_zone one $binary_remote_addr 10m;
这里的 one 是声明一个 limit_zone 的名字,$binary_remote_addr是替代 $remore_addr 的变量,10m是会话状态储存的空间
limit_conn one 1 ,限制客户端并发链接数量为1
2、limit_zone两种工做状况
a)limit_reqzone=one burst=10 ;
i.默认状况下是这样配置的,这样每一个请求就会有一个delay时间,
limit_req_zone$binary_remote_addr zone=one:100m rate=10r/m;
就是每分钟有10个令牌供用户使用,按照a的配置状况,就会有一个delay,每一个请求时间就是60/10,那每一个请求时间就是6s。
b)limit_reqzone=one burst=10 nodelay;
i.添加nodelay配置,这样就是根据你的网络情况访问,一分钟访问够10次后,服务器直接返回503。
ii.Eg:imit_req_zone$binary_remote_addr zone=one:100m rate=10r/m;
就是每分钟有10个令牌供用户使用,按照b的配置状况,就会根据网络状况访问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个, #1M能存储16000个状态,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; ... } ... } ... }
-------------------------------------------------------------------
location /download {
limit_rate 128k;
}
#若是想设置用户下载文件的前10m大小时不限速,大于10m后再以128kb/s限速能够增长如下配内容,修改nginx.conf文件
location /download {
limit_rate_after 10m;
limit_rate 128k;