当前位置

使用Apache模块mod_qos反采集

James Qi 在 2018年8月21日 - 16:53 提交

  反采集一直都是我们需要进行的工作,特殊是国内互联网行业抄袭风气太盛,其实我们不介意这些采集者把我们原创内容采过去,反正采集者也影响不了我们自己多少,但老是导致我们服务器资源过载就很烦了。

  以前一般用“Apache中设置屏蔽IP地址和URL网址来禁止采集”,高级一些的用法记录在“识别User Agent屏蔽一些Web爬虫防采集”,中途还专门“自己编写网站防采集程序”,但用起来也有些不完善。

  这两个月提交百度熊掌号、MIP/AMP后,正常的爬虫多起来,流量也多一些,跟着来的采集爬虫也多起来,导致服务器总是资源不足,带宽堵塞、服务器卡死、服务重启等等。

  除了硬件上增加带宽、增加服务器以外,还得人工看着不断屏蔽,现在的采集者也变得“聪明”一些了,变着ip/user-agent/referer来,与我们斗智斗勇。

  前一阵子找了好些资料,apache的几个模块有些作用,例如:mod_bw、mod_limitipconn、mod_evasive20、mod_qos等,比较了一下,mod_qos最接近我们需要,只是功能太强了一些,我们用不了那么多,配置起来有些复杂。

  官方介绍:

  我们添加的qos.conf代码:

# don't allow a client IP to access a "handler" (not a static resource like
# a jpg, gif, ..) more than 20 times within two minutes:
QS_ClientEventLimitCount          20 120 SlowRequest
SetEnvIfPlus              Request_URI / SlowRequest=1
SetEnvIfPlus              Request_URI /generateReport.php SlowRequest=2
SetEnvIfPlus              Request_URI .*\.(jpg)|(jpeg)|(gif)|(png)|(js)|(css)$ !SlowRequest
SetEnvIfPlus              Remote_Addr ^(47\.88\..*\..*|115\.28\..*\..*)$ !SlowRequest

# disable any event counting if the server has less than 499 connections:
QS_SetEnvIf               QS_AllConn=^[1234]?[0-9]{1,2}$ !SlowRequest

# Clients violating these rules may times can be blocked for an even longer period of time. This is implemented by a second counter, called SlowRepeatedlySlow in this example.
# Alternatively, the QS_Block variable could be set to incremented the QS_ClientEventBlockCount counter in the case of a repeated rule violation (to block clients at a connection level extending the list of events defined above).

# deny a client IP for 10 minutes if he violates the rule above 3 times:
QS_ClientEventLimitCount          3 600 SlowRepeatedlySlow
QS_SetEnvIf      SlowRequest_Counter=20 SlowRepeatedlySlow=1

QS_ErrorResponseCode 403

  刚开始这样设置后,重启apache报错,没有SetEnvIfPlus模块,找到mod_setenvifplus官方网站,又去下载mod_setenvifplus,解压后apxs -i -a -c mod_setenvifplus.c编译,再修改httpd.conf添加上mod_setenvifplus。

  还有一点 QS_ClientEventLimitCount directives can't be added/removed by graceful restart. A server restart is required to apply the new configuration!,需要重启机器。

  这样设置、重启后,可以从error.log中看到屏蔽的事情。

  后续需要解决的事情:

  • 添加白名单,放行我们自己的服务器以及搜索引擎IP;(已经解决,加一行:SetEnvIfPlus Remote_Addr ...)
  • 添加hostname白名单,放行DNS反向查询是google、百度等搜索引擎爬虫;
  • 返回错误码现在是500(内部错误),应该改为403(拒绝);(已经解决,加一行:QS_ErrorResponseCode 403)

  2018年12月14日补充:《常见搜索引擎爬虫IP地址段》,添加了Google、百度、MSN等几个搜索引擎蜘蛛的IP地址段:|66\.249\..*|203\.208\.60\..*|216\.239\..*|66\.102\..*|64\.233\..*|72\.14\..*|123\.125\..*|220\.181\.108\..*|220\.181\.124\..*|220\.181\.125\..*|111\.206\..*|207\.46\.13\..*|157\.55\.39\..*|40\.77\.167\..*

自由标签:

评论

下面是一个简单的php程序,用于验证qos是否生效:

<?php
$url = "https://jamesqi.com/robots.txt";
for ($i=1;$i<300;$i++) {
  print "i = $i\n";
  $time_start = time();
  $content = file_get_contents($url);
  print 'content length = '.strlen($content)."\n";
  $time_end = time();
  $time_long = $time_end - $time_start;
  print "time = $time_long s\n";
}
?> 

  运行很多次循环,每次访问指定网址的中间不加延时,可以看到当运行到超过qos限制的时候,打印出来503被拒绝的信息,证实qos的设置生效了,如果调整qos中指定的限制次数(然后重启apache),这里打印错误信息的次数也跟着变了,如果把IP加入qos的白名单(然后重启apache),这个程序的循环中就不会打印报错信息。

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。