生产环境如果存在IP过于频繁的访问,可能会频繁查询数据库,从而导致机器负载很高,
所以需要屏蔽掉相关访问频繁的IP。
取得IP之后通过nginx进行屏蔽
原理
nginx配置中allow,deny ip来进行权限屏蔽。
可创建一个blockip.conf,将屏蔽的ip保存在里面,再引入。
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
全站屏蔽,把include blockip.conf; 放到http {}语句块。
单独站点屏蔽,把include blockip.conf; 放到网址对应的在server{}语句块。
脚本内容:
里面具体的参数可配置。
#!/bin/bash
nginx_home=/etc/nginx/
log_path=/var/log/nginx/
tail -n50000 $log_path/access.log \
|awk '{print $1,$12}' \
|grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" \
|awk '{print $1}'|sort|uniq -c|sort -rn \
|awk '{if($1>1000) print "deny "$2 ";"}' >> $nginx_home/conf/blockip.conf
#去掉重复ip
sort $nginx_home/conf/blockip.conf | uniq -c \
|awk '{print "deny "$3}' > $nginx_home/conf/blockip.conf
/usr/bin/systemctl reload nginx
添加到定时任务
修改/etc/crontab,每晚23点30执行
30 23 * * * root /usr/bin/sh /opt/shell/blockip.sh
systemctl reload crond
保证每天更新黑名单即可
取得ip之后通过iptables禁用
如果生产环境走LVS,可以直接在LVS上配置iptables来禁止访问
用脚本获取黑名单之后
执行。
iptables这里还是建议人工操作吧。
iptables -I INPUT -p tcp --dport 80 -s 172.16.22.109 -j DROP
封掉黑名单ip的80端口即可。
原文链接:Nginx自动屏蔽频繁访问的IP,转载请注明来源!
如果访问的IP伪装成蜘蛛的话,脚本岂不是就失效了吗?grep -v直接就排除了