您在這裡

從Apache訪問日志統計IP訪問數,發現采集者屏蔽

James Qi 在 2013年11月8日 - 15:31 發表

  在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就可以生效了。

  這個程序以後還可以設法做得更完善、更智能一些。

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。