nginx限制请求之二:(ngx_http_limit_req_module)模块

相关文章:php

高可用服务设计之二:Rate limiting 限流与降级html

nginx限制请求之一:(ngx_http_limit_conn_module)模块node

nginx限制请求之二:(ngx_http_limit_req_module)模块nginx

nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制算法

nginx限制请求之四:目录进行IP限制服务器

上一篇文章主要写nginx限制链接数ngx_http_limit_conn_module 模块的做用及使用方法,下面来写ngx_http_limit_req_module模块的做用及使用。tcp

经过ngx_http_limit_req_module 模块能够经过定义的键值来限制请求处理的频率。特别的,能够限制来自单个IP地址的请求处理频率。 限制的方法如同漏斗,每秒固定处理请求数,推迟过多请求。例如,单客户端IP的每秒请求数。实现的原理是使用“漏桶”原理(限流算法之漏桶算法、令牌桶算法)。post

该模块提供了两个配置参数,limit_req_zone 和 limit_req ,其中 limit_req_zone 只能配置在 http{} 段,而 limit_req 则能够配置于http{},server{},location{} 区段中。测试


第三方模块编译安装参数:

这里写图片描述


1、limit_req_zone

语法:limit_req_zone $variable zone=name:size rate=rate; 
配置段:httpurl

该指令设置一块共享内存限制域用来保存键值的状态参数。特别是保存了当前超出请求的数量。键的值就是指定的变量(控制不被计算)。如:

这里写图片描述

注释: 
使用$binary_remote_addr变量,能够将每条状态记录的大小减小到64个字节,这样1M的内存能够保存大约1万6千个64字节的记录

若是限制域的存储空间耗尽了,对于后续全部请求,服务器都会返回503(Service Temporarily Unavailable)错误

速度能够设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,因此若是你须要每秒处理少于1个的请求,2秒处理一个请求,可使用30r/m


2、limit_req

语法: limit_req zone=name burst=number [nodelay]; 
配置段:http,server,location

设置对应的共享内存限制域和容许被处理的最大请求数阀值。若是请求的频率超过了限制域配置的值,请求处理会被延迟,因此全部的请求都是以定义的频率被处理的。超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阀值,这时,这个请求会被终止,并返回503(Service Tempporarily Unavailable)错误,这个阀值的默认值为0,如:

限制频率每秒不超过一个请求,同时容许超过频率限制的请求数很少于100个;若是不但愿超过的请求被延迟,能够用nodelay参数。

这里写图片描述


3、配置使用示例

limit_req_zone $binary_remote_addr zone=showjoy_req:20m rate=1r/s; 
主要是用来定义变量,空间名称,以及共享内存大小。

limit_req zone=showjoy_req burst=100 nodelay; 
主要是用来使用前面定义的空间,定义请求频率限制,使用nodelay则表示不但愿超过的请求被延迟。

这里写图片描述

可能要对某些IP不作限制,须要使用到白名单。

模块地址:https://yunpan.cn/cqSKP6BrJ2AeT 访问密码 4f50

 

关于limit_req和limit_conn的区别

1,首先,limit_req和limit_conn两个模块都是为了来限流的,可是二者不在一个层面,为了搞清楚这个,必须先要弄清楚request和connection的区别,由于在不少状况下,咱们把他们混淆了。

so, what is the difference  between connection and request? 

2, connection是链接,即常说的tcp链接,经过三次握手而创建的一个完整状态机。创建一个链接,必须得要三次握手。

request是指请求,即http请求,(注意,tcp链接是有状态的,而构建在tcp之上的http倒是无状态的协议)。

经过打开一个网页,而后经过wareshark能够看到,一个链接创建后(即三次握手后),在这个链接断开以前(即四次挥手以前),会有不少的http request,这就是他们的区别:即一个链接的生命周期中,会存在一个或者多个请求,这是为了加快效率,避免每次请求都要三次握手创建链接,如今的HTTP/1.1协议都支持这种特性,叫作keepalive。

好了如今知道区别了。

3,那么在Nginx中,对于链接限制模块:limit_conn_module来看:

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
locoation /limit.html {
    limit_conn conn_zone 1;
}

这样的配配置,代表以ip为key,来限制每一个ip访问lmit.html文件时候,最多只能有一个在线,不然其他的都要返回不可用。

这种状况就是一个静止状态的计数能够实现,而无关乎多长时间。

举个例子,若是你的这个链接一直不释放,即便你经过这一个链接发送出再多的request请求,只要我可以应付,那么我就帮你处理。可是,若是你只须要处理2个请求,可是这两个请求是分别用两个链接同时发送过来的,那么,我就只能处理其中一个,另一个就不行。这就是他的区别。

能够用ab命令来测试:

ab -n100 -c100 -k http://yoursit/limit.html

注意:ab命令的-n -c都是指的发送多少请求,即-n一共发送多少请求,-c同时发送多少请求,他并不关心须要多少链接来发送,默认状况下是每一个请求都创建一个链接来发送。

上面这个命令,因为默认是一个链接发送一个请求,那么这将会同时创建100个链接,而这样的话,就会致使限制超过(最多只能一个链接for一个ip)。99个请求都会失败。

而若是你只开一个链接:

ab -n100 -c100 -k http://yousit/limt.html

这里的-k选秀就是表示keepalive,只开一个链接来发送这100个请求,即便是同时发送,那么server也不会认为你超过了,由于在一个时间你只是创建一个链接,这样这100个请求都会干净利落的处理完成。

3,再看limit_req_module 

limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s;
location /limit.html{
    limit_conn zone=req_zone;
}

注意和上面的区别:这里须要为共享内存配置一个速率rate

代表:对于每一个ip来讲,处理请求的速度不超过每秒1个请求。

能够看到这是个速度量(而上面的那个是数字量,速度和个数仍是有直观的区别的吧。。)

那么这时候 :

ab -n100 -c100 http://yoursit/limit.html 

ab -n100 -c100 -k http://yousit/limt.html

的区别就不是那么明显了,由于这老是同时发送出100个请求(不论是经过100个链接仍是1个链接),只要你请求到底的速度超过每秒1个,那么我就会拒绝你。

附加:https://forum.linode.com/viewtopic.php?t=8064%3E

相关文章
相关标签/搜索