nginx限制请求(ngx_http_limit_req_module)模块和nginx设置ip白名单

Example Configuration

http {    

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

语法:limit_req_zone $variable zone=name:size rate=rate; 

配置段:http

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

注释: 

使用$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

看看当前的tcp连接数

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。

当前的tcp连接

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块令牌,

120块令牌发完后 多出来的那些请求就会返回503

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.

8.设置状态代码以响应被拒绝的请求而返回。

Syntax:

limit_req_zone key zone=name:size rate=rate [sync];

Default:

Context:

http

9.设置共享内存区域的参数,该参数将保留各种键的状态。特别是,状态存储当前的过多请求数。该key可以包含文本,变量,他们的组合。密钥值为空的请求不予考虑。

 

白名单

1.设置IP白名单:对指定请求IP不设置限制

http {

   .........................

    geo $whiteiplist  {

       default 1;

       127.0.0.1 0;

       192.168.0.0/16 0;   

    }

    map $whiteiplist $limit {

        1 $binary_remote_addr;

       0 "";

  }

       limit_req_zone $limit zone=fifa:10m rate=5r/s;

    server {

       .......................

        location / {

               limit_req zone=fifa burst=10 nodelay;          

        }

2.测试结果:

IP加入白名单和限制流如图:页面正常

ab -c 100 -t 10 -k http://192.168.1.10/

IP未加入白名单IP段得到的结果如图:页面报错显示503

ab -c 100 -t 10 -k http://192.168.1.10/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值