nginx禁止高频ip访问

有时候我们会通过在一定时间内ip访问次数来判断用户是否恶性访问,来达到防刷的目的,下面借用nginx模块来限制。

 nginx模块限制ip

    #nginx.conf
    http{
    ...
     
    limit_req_zone $binary_remote_addr zone=limits:10m rate=50r/s;
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
     
    server {
        limit_req zone=limits burst=50;
        
        limit_conn conn_zone 1;
        limit_rate 50k;
    }
    ...
     
    }

limit_req_zone : 限制单位时间内的请求数

limit_req_conn : 限制同一时间内的连接(并发)数

超出限制会直接返货503错误。

 limit_req_zone模块

    limit_req_zone $binary_remote_addr zone=five:10m rate=50r/s;

$binary_remote_addr :表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。 

zone=limits:10m:表示生成一个大小为10M,名字为limits的内存区域,用来存储访问的频次信息。 

rate=1r/s:表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

    limit_req zone=limits burst=50;

zone=limits:使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。 

burst=50:burst这个配置的意思是设置一个大小为50的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。 

 limit_conn_zone模块

  顾名思义,这里是限制读取到请求头后的连接ip。

    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;

zone=addr:10m; 表示生成一个大小为10M,名字为conn_zone的内存区域,用来存储访问的频次信息

    limit_conn conn_zone 1;

 limit_conn conn_zone 1;表示限制每个IP只能发起一个并发连接。

    limit_rate 50k;

 limit_rate 50k; 表示对每个连接限速50k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。

猜你喜欢

转载自blog.csdn.net/panjiapengfly/article/details/118189070
今日推荐