【遇到的问题】
- 当前系统被高强度频繁的调用API
- 当前系统API经常被各种扫描请求
【如何解决】
- 使用nginx的limit模块限制并发
- 只限制部分地址或是只限制部分IP(白名单或黑名单)
【配置方法】
vi nginx/conf/limit/black_ip.conf
192.168.8.xxx 1; 192.168.8.xxx 1;
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;
vi nginx/conf/limit/limit_location.conf
limit_conn perip 3000; # 黑名单的IP,每个IP最大并发为2000 limit_req zone=perreq nodelay;
修改
nginx/conf/nginx.conf
,http { … } 区域添加下面配置:include limit/limit_zone.conf;
最后在需要限制的虚拟主机里,对应要限制的路径下面添加配置用于限制。
include limit/limit_location.conf;
【配置说明】
- 里面使用到了 geo指令定义黑名单 \$blackiplist 的变量,默认值为0,如果客户端IP在上面的范围内,\$blackiplist 的值为1
- 使用map指令映射【黑名单里IP】显示为真实的IP,如果不是黑名单里的IP就为空,这样【除了黑名单里的IP】都不能存到limit_req_zone内存session中,所以不会限制黑名单之外的ip访问