在Drupal網站中使用PHP程序來屏蔽采集者效果還不錯,可以自己任意設定判斷标準。不過我們以前的MediaWiki平台上的網站還沒有使用這套PHP程序來屏蔽,最近發現采集又太多了,搞得服務器負載太高,老是從Apache日志人工排查太麻煩、太慢(以前的辦法見博文《Apache中設置屏蔽IP地址和URL網址來禁止采集》),今天花一些時間編寫了一個小程序來統計日志中的IP訪問數,程序很簡短,如下:
<?php /* * 統計Apache日志文件的IP,找出訪問最多的IP地址,方便發現采集者 * James Qi 2013-11-8 */ //0、設置 $file=$argv[1];//文件名稱 $number=50;//需要獲取IP的數量 //1、讀取 $fp=fopen($file,"r");//以隻讀的方式打開文件 $ip_array=array();//IP數組賦空值 while(!(feof($fp))) {//循環讀取文件中所有行 $line=fgets($fp);//讀取文件的一行 if (strpos($line,'HTTP/1.1" 200 ')!=false) {//隻尋找訪問成功的,排除已經被屏蔽的 $ip=strtok($line,' ');//取前面的IP地址 $ip_array[]=$ip;//添加到數組中 } } //2、統計 $count_array=array_count_values($ip_array);//統計生成帶計數的新數組 asort ($count_array);//帶指針排序 $output_array=array_slice($count_array,-$number);//取後面的設置數量的IP //3、輸出 foreach ($output_array as $output_ip=>$output_count) {//循環遍曆輸出數組 $output_host=gethostbyaddr($output_ip);//獲取host name $output_line="$output_ip : $output_count - $output_host\n";//組合輸出行 print $output_line;//打印輸出行 } $output_line="output_ip : output_count - output_host\n";//組成标題行 print $output_line;//打印标題行 //4、結束 ?>
輸出如下:
122.146.207.159 : 27 - 122.146.207.159 115.196.76.138 : 28 - 115.196.76.138 121.237.123.91 : 29 - 91.123.237.121.broad.nj.js.dynamic.163data.com.cn 14.114.33.12 : 30 - 14.114.33.12 157.55.33.31 : 30 - msnbot-157-55-33-31.search.msn.com 123.202.147.103 : 32 - 123202147103.ctinets.com 157.56.93.150 : 33 - msnbot-157-56-93-150.search.msn.com 180.158.138.101 : 33 - 180.158.138.101 67.128.22.254 : 34 - 67.128.22.254 112.230.96.7 : 34 - 112.230.96.7 1.36.80.43 : 34 - 1-36-80-043.static.netvigator.com 203.218.185.20 : 36 - pcd395020.netvigator.com 61.15.142.137 : 36 - cm61-15-142-137.hkcable.com.hk 173.243.112.214 : 46 - ded4u.com 183.159.73.30 : 52 - 183.159.73.30 122.238.225.66 : 59 - 122.238.225.66 41.190.2.41 : 73 - 41.190.2.41 157.56.93.42 : 120 - msnbot-157-56-93-42.search.msn.com 157.55.33.111 : 128 - msnbot-157-55-33-111.search.msn.com 157.55.34.25 : 221 - msnbot-157-55-34-25.search.msn.com 91.237.52.132 : 3333 - 91-237-52-132.greendata.pl output_ip : output_count - output_host
如果host name不是搜索引擎,就可以屏蔽。
可以專門建個deny.conf,内容為:
Order allow,deny Deny from 113.97.135.10 118.249.151.175 180.140.161.253 Deny from 185.24.233.4182.149.62.217 58.60.196.51 183.0.85.6 Allow from all
然後把這個文件包含到需要的虛拟主機設置中:
Include conf/deny.conf
再重啟Apache就可以生效了。
這個程序以後還可以設法做得更完善、更智能一些。
评论