QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

微信扫一扫 分享朋友圈

已有 4521 人浏览分享

开启左侧

防范爬虫流量攻击:Nginx限制同时段IP访问数量和频率

[复制链接]
4521 0
  最近网站遭受爬虫攻击,经常出现CPU和带宽100%跑满,服务器陷入假死的状态,虽然持续时间不长,每次5分钟左右,或者重启nginx可恢复,但是架不住太过频繁,一天要搞十多次,也是恼火。排查日志发现,有大量的同网段IP频繁请求网络资源,尝试了封禁IP,效果并不大,对方会更换新的IP,求助网警,答复是攻击者IP为虚拟IP,无法定位。
image.jpg
  实在没办法,网络防火墙价格又太贵,只能通过nginx的基础功能,看能不能解决。网上查了一下,找到了如下解决方案。
  主要用到了nginx的ngx_http_limit_conn_module和ngx_http_limit_req_module两个配置:
  ngx_http_limit_conn_module:限制并发连接数;
  ngx_http_limit_req_module:限制一段时间内同一IP的访问频率;
  首先,我们为了防止别人来攻击,或者访问量异常过高导致服务器崩掉,就需限制访问量,如果是一瞬间的并发访问,那么我们就需要限制一秒之内的并发连接数,此时就需要用到第一个配置,可以写在nginx.conf文件里:
  http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    #定义一个名为addr的limit_req_zone用来存储session,大小是10M内存
    #以$binary_remote_addr 为key
    #且只能放在http{}代码段.
    server {
       location / {
        limit_conn addr 2;   #连接数限制
        #设置给定键值的共享内存区域和允许的最大连接数。超出此限制时,服务器将返回503(服务临时不可用)错误.
        #如果区域存储空间不足,服务器将返回503(服务临时不可用)错误
        }
     }
  }
  上面的配置能达到的效果就是,一瞬间访问的时候,只会有100个IP能得到响应,后面的IP直接就返回503状态。
image.jpg
  其次,如果一个IP能访问到服务器,那么它如果疯狂的调用接口,最后可能导致将服务器的带宽耗尽,从而导致服务器假死崩溃,此时就需要用到第二个配置:
  http{
    #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
    #以$binary_remote_addr为key,限制平均每秒的请求为100个,
    #1M能存储16000个状态,rate的值必须为整数,
    #如果限制1分钟100个请求,可以设置成100r/m
    limit_req_zone $binary_remote_addr zone=allips:10m rate=5000r/m;
    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=100 nodelay;
       }
     }
  }
  此时能达到的效果,同一个用户机在1分钟内可以访问5000个资源,如果1秒内超过了2个并发连接,后面的也是直接返回503。
  注意:如果网站规模不大,设置 limit_conn addr 2足够,即允许同一客户机2个并发连接请求。如果页面资源较多,比如首页network里面有200个资源,可以设置brust为100,这样2秒就可以全部请求通过。
image.jpg
附上比较理想的配置方案:
1、在nginx.conf文件里:
http {
    #限制单IP并发量开始
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    limit_req_zone $binary_remote_addr zone=allips:10m rate=5000r/m;
    #limit_req_zone:请求频率
    #$binary_remote_addr:以客户端IP进行限制
    #zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
    #rate=10r/s:表示客户端的访问频率为每秒10次         
    #限制单IP并发量结束        
}
2、在具体网站的.conf文件里:
server {
    #限制单IP并发量开始
    limit_conn  addr  2;  
    limit_req zone=allips burst=100 nodelay;
    #burst:如果请求的频率超过了限制域配置的值,请求处理会被延迟
    #nodelay:超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503        
    #限制单IP并发量结束
}

上一篇:Redis提示Received SIGTERM scheduling shutdown问题解决方案
下一篇:分享CentOS7按天分割Nginx日志并定期删除日志文件的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

3

粉丝

687

主题
  • 公众号

    微信公众号

  • 微信

    站长微信

关于我们|手机版|玩慈利网 湘公网安备 43082102000138号 ( 湘ICP备12012604号-1 )

GMT+8, 2024-11-23 17:54 , Processed in 0.064845 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! 在此致以诚挚谢意!

CopyRight © 2011-2024 wancili.com