防止程序被频繁调用,原理:查看日志5W条记录,对单个IP访问量进行统计并记数超过1000视为黑名单IP,每半小时检查执行一次脚本。
一、黑名单配置
在http模块最后加上配置
#黑名单设置
include /usr/local/nginx/conf/blockip.conf;
二、创建脚本
#!/bin/bash
#取最近5w条数据
tail -n50000 /usr/local/nginx/logs/access.log \
#过滤需要的信息行ip等
|awk '{print $1,$12}' \
#过滤爬虫
|grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou|360|bing|soso|403|admin" \
#统计
|awk '{print $1}'|sort|uniq -c|sort -rn \
#超过1000加入黑名单
|awk '{if($1>1000)print "deny "$2";"}' >> /usr/local/nginx/conf/blockip.conf
#重启nginx生效
/usr/local/nginx/sbin/nginx -s reload
三、制定执行计划
*/30 * * * * . /etc/profile;/bin/sh /root/project/nginx_blockip_task/blockip.sh
四、加入任务
crontab -e
五、其他方案
https://www.jb51.net/article/168907.htm
六、其他
屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。
# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24
deny 123.0.0.0/8; // 封 123.0.0.1~123.255.255.254 这个段的ip
deny 123.123.0.0/16; // 封 123.123.0.1~123.123.255.254 这个段的ip
deny 123.123.123.0/24; // 封 123.123.123.1~123.123.123.254 这个段的ip
deny all; // 封所有ip
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,那需要你在blockip.conf中这样写
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
单独网站屏蔽IP的方法,把include blocksip.conf; 放到网址对应的在server{}语句块,
所有网站屏蔽IP的方法,把include blocksip.conf; 放到http {}语句块。
--end--