nginx限制请求(ngx_http_limit_req_module)模块和nginx设置ip白名单
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=120 nodelay;
}
语法:limit_req_zone $variable zone=name:size rate=rate;
该指令设置一块共享内存限制域用来保存键值的状态参数。特别是保存了当前超出请求的数量。键的值就是指定的变量(控制不被计算)。如:
使用$binary_remote_addr变量,可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回503(Service Temporarily Unavailable)错误
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要每秒处理少于1个的请求,2秒处理一个请求,可以使用30r/m
ab -c 100 -t 10 -k http://192.168.1.10/
确实是每秒请求一次,那多测试一会儿呢?把时间从10秒增加到30秒
这个时候应该是120 已经不够用了,出现很多503,还有两种情况会出现,请看图
还有种情况请求得不到响应而超时了,但我不确定是不是这种情况。客户端自己等不及断开了,返回499
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
虽然这样会让nginx 一秒钟只处理一个请求,但是仍然会有很多还在队列里面等待处理,这样也会占用很多tcp连接,从上面那条命令的结果中就能看得出来。
limit_req zone=req_one burst=120 nodelay;
加上 nodelay之后超过 burst大小的请求就会直接 返回503,如图
也是每秒处理1个请求,但多出来的请求没有象刚才那样等待处理,而是直接返回503。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
通过这次测试我发现 这两种模块都不能做到绝对的限制,但的确已经起到了很大的减少并发和限制连接的作用,在生产环境中具体用哪种或者需要两种在一起使用就要看各自的需求
1.limit_req和limit_conn两个模块都是为了来限流的,但是两者不在一个层面
2.connection是连接,即常说的tcp连接,通过三次握手而建立的一个完整状态机。建立一个连接,必须得要三次握手
3.request是指请求,即http请求,(注意,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议)
4.简单说明一下, rate=1r/s 的意思是每个地址每秒只能请求一次,也就是说根据令牌桶原理 burst=120 一共有120块令牌,并且每秒钟只新增1块令牌,
5.当且仅当limit_req 当前级别上没有指令时,这些指令才从上一级继承 。
Syntax: |
limit_req_dry_run on | off; |
Default: |
limit_req_dry_run off; |
Context: |
http, server, location |
This directive appeared in version 1.17.1.
6.启用空运行模式。在这种模式下,请求处理速率不受限制,但是,在共享内存区域中,过多请求的数量将照常计算。
Syntax: |
limit_req_log_level info | notice | warn | error; |
Default: |
limit_req_log_level error; |
Context: |
http, server, location |
This directive appeared in version 0.8.18.
7.在服务器由于速率超出而拒绝处理请求或延迟请求处理的情况下,设置所需的日志记录级别。延迟的记录级别比拒绝的记录级别少1分;例如,如果limit_req_log_level notice指定“ ” ,则将延迟记录为该info级别。
Syntax: |
limit_req_status code; |
Default: |
limit_req_status 503; |
Context: |
http, server, location |
This directive appeared in version 1.3.15.
Syntax: |
limit_req_zone key zone=name:size rate=rate [sync]; |
Default: |
— |
Context: |
http |
9.设置共享内存区域的参数,该参数将保留各种键的状态。特别是,状态存储当前的过多请求数。该key可以包含文本,变量,他们的组合。**值为空的请求不予考虑。
白名单
limit_req_zone $limit zone=fifa:10m rate=5r/s;
limit_req zone=fifa burst=10 nodelay;
ab -c 100 -t 10 -k http://192.168.1.10/
ab -c 100 -t 10 -k http://192.168.1.10/