最近的爬虫真的是相当猖獗,稍不留意流量费就涨了。虽然用上ngxblocker反爬工具之后,效果杠杠的(见《快被爬虫搞破产了——网站反爬虫小记》,但时不时还是得通过手工添加IP到黑名单中的方式来防范。
那么问题也来了,每次需要排查新的爬虫时,默认的日志中总夹杂着大量的444记录,也就是已经被我禁止的,无形中增加了大量的工作量。
因此当务之急是将状态码为200的IP记录下来,而444或者其他状态码的可以单独保存。
打开网站的配置文件,在server前加入如下代码:

map $status $normal {
    ~^2  1;
    default 0;
}
map $status $abnormal {
    ~^2  0;
    default 1;
}
map $remote_addr $islocal {
    ~^127  1;
    default 0;
}

然后将server中的access_logs部分修改为如下内容:

access_log logs/access.log combined if=$normal;
access_log logs/access_abnormal.log combined if=$abnormal;
access_log logs/access_local.log combined if=$islocal;

这样一来,状态码如果是2开头的则记录到access.log文件中,如果是非2开头的(入404、444等)则保存到access_abnormal.log文件中,而本地访问则保存在access_local.log文件中(如果没有本地访问的话,可以删除含有$islocal的部分),以保证不同记录的分门别类。
如果想更省事的话,可以在server部分试试如下代码:

if ($status != "200") {
    access_log off;
}

也就是说只要状态码不是200的就不记录。

参考资料:
https://stackoverflow.com/questions/19011719/how-to-write-only-logs-with-200-status

最后修改:2025 年 03 月 05 日
如果觉得我的文章对你有用,请随意赞赏