Nginx下设置自动屏蔽频繁访问的爬虫IP
熊爷爷 2016-07-18
爬虫和反爬虫,就像是一场猫和老鼠的竞赛。你可以爬,别太过分。
本文将介绍如何在Nginx服务器中配置自动屏蔽高访问量ip。
首先,可以看看我们的Nginx Log里最频繁访问的ip分别是哪些。
在Term中SSH连接服务器后,执行以下代码(需替换log路径)。其中 -n 后面接的数值10意思是显示前10名。
awk '{print $1}' /home/wwwlogs/www.xiezeyu.xyz.log | sort | uniq -c | sort -n -k 1 -r | head -n 10之后,我们得到了一个列表,我们可以手动将这个列表中我们并不想要的ip加入屏蔽名单:
进入/usr/local/nginx/conf目录下,新建一个名为 blockips.conf 的文件
编辑 blockips.conf ,写入要屏蔽的ip,并保存后退出。如:
deny 192.168.0.1然后编辑/usr/local/nginx/conf/nginx.conf,将blockips.conf加入Nginx的启动配置,找到http,在下方粘贴一行:
include blockips.conf;保存退出,在Term中输入以下命令执行,测试一下是否可以正常执行:
/usr/local/nginx/sbin/nginx -t如果可以执行,应该返回 Syntax OK 和 Success。
如果没有报错,则重载一遍Nginx:Term中输入以下代码
/usr/local/nginx/sbin/nginx -s reload到这一步,就已经成功手动屏蔽了一个IP,但是如果进一步希望加入自动化屏蔽功能,你可以继续往下看。
我们首先需要一个可以自动统计的Shell脚本,并让它生成一个屏蔽列表到指定目录,然后把那个生成的conf作为初始化载入Nginx中。
以下是步骤:
首先复制以下内容,新建一个名为 autoblockip.sh 的Shell文件,将内容粘贴进去并保存。放到你的服务器目录中,这里推荐 nginx_home 目录:/usr/local/nginx/sbin/nginx(请检查你的目录位置是不是这个)。以下代码里面的几个路径需要修改为自己的目录,此Bash将统计代码第三四行中的访问Log并自动输出到倒数第二行的目录中,倒数第二行的1000代表频繁访问阈值为1000:
#!/bin/bash
nginx_home=/usr/local/nginx
log_path=/home/wwwlogs/www.xiezeyu.xyz.log
tail -n50000 /home/wwwlogs/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/vhost/autoblockip.conf
/etc/init.d/nginx reload
这时,可以在Term中手动执行一下这个sh文件,看看能不能正确生成autoblockip.conf到指定目录下,如果报错,请检查你的配置。
如果成功,检查一下生成的conf文件,里面应该已经有了几条屏蔽规则,如果规则是空的,那可能是你的网站访问量太少了。
接下来要把这个自动生成的conf文件也加入nginx的自启动配置里:再次编辑/usr/local/nginx/conf/nginx.conf,将autoblockip.conf加入Nginx的启动配置,找到http,在下方再粘贴一行:
include autoblockip.conf;同样,可以运行 /usr/local/nginx/sbin/nginx -t 指令检查是否正确配置。
然后在Term中给予 autoblockip.sh 可执行的权限:
chmod +x /usr/local/nginx/sbin/nginx/autoblockip.sh接下来需要让系统在指定时间自动执行该bash文件,编辑crontab文件,在Term中输入 crontab -e 并回车执行,将打开VI编辑器修改。
按 i 切换到插入模式,写入以下字段,注意替换autoblockip.sh的路径:
40 4 * * * /usr/local/nginx/autoblockip.sh按 ESC 返回浏览模式,然后按:,输入 wq 回车保存退出。
以上代码意为每天4:40 am自动执行该脚本,如果觉得这个检查频率过低可以修改crontab参数。详细关于crontab的用法可以在这篇文章中学习。
配置至此完全结束。
