使用nginx的limit模块限制并发

【遇到的问题】

  1. 当前系统被高强度频繁的调用API
  2. 当前系统API经常被各种扫描请求

【如何解决】

  1. 使用nginx的limit模块限制并发
  2. 只限制部分地址或是只限制部分IP(白名单或黑名单)

【配置方法】

  1. vi nginx/conf/limit/black_ip.conf

    192.168.8.xxx 1;
    192.168.8.xxx 1;
    
  2. vi nginx/conf/limit/limit_zone.conf

    geo $blackiplist  {
      default 0;
      include limit/black_ip.conf;
    }
            
    map $blackiplist $limit {
      1 $binary_remote_addr;
      0 "";
    }
            
    limit_req_zone $limit zone=perreq:100m rate=3000r/s;     #黑名单内的IP每秒最多处理 3000 个请求
    limit_conn_zone $limit zone=perip:100m; 
    
  3. vi nginx/conf/limit/limit_location.conf

    limit_conn perip 3000;        # 黑名单的IP,每个IP最大并发为2000
    limit_req zone=perreq nodelay;
    
  4. 修改 nginx/conf/nginx.conf,http { … } 区域添加下面配置:

    include limit/limit_zone.conf;
    
  5. 最后在需要限制的虚拟主机里,对应要限制的路径下面添加配置用于限制。

    include limit/limit_location.conf;
    

【配置说明】

  1. 里面使用到了 geo指令定义黑名单 \$blackiplist 的变量,默认值为0,如果客户端IP在上面的范围内,\$blackiplist 的值为1
  2. 使用map指令映射【黑名单里IP】显示为真实的IP,如果不是黑名单里的IP就为空,这样【除了黑名单里的IP】都不能存到limit_req_zone内存session中,所以不会限制黑名单之外的ip访问