您在這裡

使用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 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。