2005-01-23
●
apache リアファラspam対策
久々に awstats を導入してログを分析させてみて、一番に驚きなのはいわゆるリファラspam (referrer spam/referral spam)。tdiaryのようなリンク元を表示する日記を狙って、リンク元にまったく関係の無い宣伝URLを送ってきます。いい加減リファラ情報ってのはなくすべきなのかも知れない。一年前にはリファラspamってここまで酷くなかったと思うけどなぁ…。まったく迷惑なものが増えたものです。
まぁ嘆いていてもしょうがないので、2通りのやり方でブロック。一つ目は、apache 側で接続をはじくこと。もう一つは、ログの解析対象からはずすこと。前者はApache-Usersを参考に、refspam.conf を作成して httpd.confからInclude。後者は、同様のログを削除するperlスクリプト refspam.plを作成してawstatsに読み込ませた。最近の awstats (6.2) には、一応 referer_spam.pm というのがあるにはあるのだが、まったく使われていないというか、そもそも grep -R awstats/ 'referer_spam' をやってみても一切 use/require されていないので、使われていないんだろうと思う。将来的には使われるんでしょうかね…。
●
ログ解析の時間
ログ解析に2時間以上かかっている時点でそろそろサーバー乗り換えのいいタイミングなんだと思う。
wassy@node1 /home> df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/ubda 2.0G 792M 1.2G 41% / /dev/ubdb 2.7G 2.5G 58M 98% /home /dev/ubdc 1.1G 303M 716M 30% /var none 61M 0 61M 0% /dev/shm
てゆーか /home あと 58M ですか…orz
wassy@node1 /home> top -b
20:51:07 up 151 days, 12:20, 1 user, load average: 0.08, 0.04, 0.00
55 processes: 53 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 6.1% 0.0% 0.3% 0.0% 0.0% 0.0% 93.4%
Mem: 123816k av, 115384k used, 8432k free, 0k shrd, 7544k buff
15440k active, 45168k inactive
Swap: 263160k av, 24520k used, 238640k free 27196k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
24853 root 17 0 14204 13M 1924 S 4.7 11.4 0:26 0 awstats.pl
24890 root 9 0 6912 6904 6708 S 1.4 5.5 0:01 0 httpd
25078 wassy 11 0 1212 1212 912 R 0.3 0.9 0:01 0 top
1 root 8 0 376 352 352 S 0.0 0.2 0:01 0 init
うーん、やっぱ linode じゃパワー不足かもしれない…。
●
AWStats の日本語処理
にしても、AWStatsの検索キーの日本語文字コード変換は相変わらずbuggyなので、とりあえず decodeutfkeys.pm で Encodings ではなく Jcode を使うようにしました。(ダウンロード → decodeutfkeys.pm) 標準モジュールのはずの Encoding とかが遅くて不正確だっていうのは皮肉ですね。まぁ、統一規格というのはいつもそうなのですが*1。
wassy> cat /usr/local/awstats/wwwroot/cgi-bin/plugins/decodeutfkeys.pm
#!/usr/bin/perl
#-----------------------------------------------------------------------------
# decodeUTFKeys AWStats plugin (Jcode.pm version)
# Allow AWStats to convert keywords strings coded by some search engines in
# UTF8 coding to a common string in a local charset.
#-----------------------------------------------------------------------------
# Perl Required Modules: Jcode
#-----------------------------------------------------------------------------
use Jcode;
use strict;no strict "refs";
#-----------------------------------------------------------------------------
# PLUGIN VARIABLES
#-----------------------------------------------------------------------------
my $PluginNeedAWStatsVersion="6.0";
my $PluginHooksFunctions="DecodeKey";
#-----------------------------------------------------------------------------
# PLUGIN FUNCTION: Init_pluginname
#-----------------------------------------------------------------------------
sub Init_decodeutfkeys {
my $InitParams=shift;
my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion);
return ($checkversion?$checkversion:"$PluginHooksFunctions");
}
#------------------------------------------------------------------------------
# Function: Converts an UTF8 string to specified Charset
# Parameters: utfstringtodecode charsettoencode
# Return: newencodedstring
#------------------------------------------------------------------------------
sub DecodeKey_decodeutfkeys {
my $string = shift;
$string =~ s/\\x([0-9A-Fa-f][0-9A-Fa-f])/%$1/gi;
$string =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$string = Jcode->new($string)->utf8;
$string =~ s/[;+]/ /g;
return $string;
}
1; # Do not remove this line
(2005年8月13日追記)
ちなみに、これは今後のアクセスを変換するためのものであって、すでにログとして解析してしまったものの文字コードは変換できません。そこで、こんなスクリプトを使って、
mv awstats012005washitake.com.txt awstats012005washitake.com.txt~ cat awstats012005washitake.com.txt~ | perl awstatsconv.pl > awstats012005washitake.com.txt
などとして、ログファイルそのものを変換してしまいます。
*1 日本語以外も使えるようにしようとしているからなんですけどね