在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就可以生效了。
这个程序以后还可以设法做得更完善、更智能一些。
评论