首页 » 操作系统 » Linux » Nginx自动屏蔽频繁访问的IP

Nginx自动屏蔽频繁访问的IP

 

生产环境如果存在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,转载请注明来源!

1