WebalizerによるWebアクセスログ解析(SuSE編)
Apache のログ解析ツールとして、SuSE にも Webalizer が用意されていましたので、RedHat
と同様にこれを使うことにしました。
サンプル(現在は、Redhatのもの)がこちらにありますが、RedHat と何も変わりはありません。
基本的には RedHat と変わりありませんが、提供されている RPM そのままではいくつか問題があったため少し見直しをしましたので、それを以下にあげておきます。
- バイナリパケージは日本語対応ができていないことと dns オプション付きなので、SRPM から 日本語対応の RPM を作成しなおした。
- RedHat の時と同様に、ログ量が多いと解析時間がずれログ解析中にlogrotateされるとおかしくなるので、タイミングでの処理をやめて
logrotate 後にlogrotate したファイルを解析するようにした。あわせて、検索文字列の文字化け対策をした。
■ Webalizerのダウンロードとインストール
ここでは、Webalizer の SRPM をダウンロードし、日本語対応等を折り込んだ
RPM を作成してインストールします。
- Webalizer の SRPM を、/usr/src/packages/SOURCES 配下に KDDI の FTPサイトからダウンロードし、展開する。おやじがダウンロードしてきたのは、webalizer-2.01-560.src.rpm
である。KDDI のサイトは非常に込み繋がらないことがあるので他のサイトでも構わないが、残念ながら
Novell のサイトには SRPM は置いていない。
# cd /usr/src/packages/SOURCES
# wget ftp://ftp.kddlabs.co.jp/Linux/packages/SuSE/suse/i386/9.0/suse/src/webalizer-2.01-560.src.rpm
# rpm -Uvh webalizer-2.01-560.src.rpm |
- /usr/src/packages/SPECS 配下に展開された webalizer.spec を、日本語対応、dns
オプションなしに変更してコンパイルしなおす。 日本語対応では、グラフ表示を日本語表示にします。また、デフォルトでは
dns オプション付きで作成されていますが、おやじは Apacheでログを採るときに既にホスト名でログを採取しており、このオプションを指定するとエラーになるので削除した。IP
アドレスでログは採っているが Webalizer ではホスト名で表示したい場合は、そのまま
configure で dns オプション指定を残すこと。
# cd /usr/src/packages/SPECS
# vi
webalizer.spec
(snip)
build
%{suse_update_config -f}
autoconf
CFLAGS="$RPM_OPT_FLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" ./configure --prefix=/usr \
--with-gdlib=%{_libdir} \
--with-gd=/usr/include/gd \
--with-language=japanese \
--mandir=%{_mandir} \
--enable-dns \
%{_target_cpu}-suse-linux
make LIBNAME=%{_lib}
(snip)
「Esc」、「:」、「w」、「q」で保存。
#
rpmbuild -ba
webalizer.spec |
-
上記で、日本語対応版の RPM が /usr/src/packages/RPM/i586 配下に作成されるので、確認しインストールする。
# cd /usr/src/packages/RPM/i586 #
ls webalizer-2.01-560.i586.rpm # rpm -Uvh
webalizer-2.01-560.i586.rpm
|
注: 手動で RPM をインストールすると、YaST 上は「保護されている−変更しない」パッケージとして扱われ、自動アップデートされなくなる。当然、書き換えられては困るので非常にうまくできているが、自己管理になるので注意が必要である。
■ Webalizerの設定
Webalizer の設定は、インストール時に作成される /etc/webalizer.conf をベースに作成していきます。一般的には、このファイルをそのまま設定していけばいいと思います。おやじの場合は、おやじと娘のサイトでログを分けていますので、それぞれについて
/etc/webalizer_oyaji.conf と /etc/webalizer_akirin.conf を作成しました。なお、デフォルトの
webalizer.conf が存在すると、作成した conf ファイルに不具合があるとこのファイルを使おうとするので、リネームしておくことを薦めます。
# cp /etc/webalizer.conf
/etc/webalizer.conf.bak # cp /etc/webalizer.conf.bak
/etc/webalizer_oyaji.conf # cp /etc/webaiizer.conf.bak
/ets/webalizer_akirin.conf |
以下、各設定項目を設定していきますが、かなりの項目が設定可能であり、ここではおやじが変更した項目を中心に示します。下記は、おやじの設定(webalizer_oyaji.conf)を基本とし、娘の設定(webalizer_akirin.conf)は、( )で併記してあります。
- Apacheのログファイルへのパス指定
おやじは、SuSE 標準の Apache2.0 を使用しているので、下記のようになる。なお、こちらにあるように、logrotate
後に rotate したファイルを解析するように処理を変更し、検索文字列が文字化けするので、文字コード変換後のファイルを解析するように変更してある。
LogFile /var/log/apache2/access_log_jpn
(LogFile
/var/log/apache2/akirin_log_jpn)
- ログの種類を指定
今回は、Web のログ解析のみなのでデフォルトのままとする。Webalizer では
FTP や Squid のログ解析も可能であり、その場合、「clf」をそれぞれ「ftp」、「squid」とすればよい。
LogType
clf
- 解析結果の出力先ディレクトリの指定(Apache のドキュメントルート配下にしておくとブラウザでアクセスできる。必要ならディレクトリは別途作成しておく。)
OutputDir
/home/oyaji/public_html/webalizer
(OutputDir
/home/akirin/public_html/webalizer)
- webalizer の履歴を記録するためのファイル名を指定
一般的にはデフォルトのままでよい。今回は二つのサイトを解析するため、下記のようにした。
HistoryName
/var/lib/webalizer/webalizer_oyaji.hist
(HistoryName
/var/lib/webalizer/webalizer_akirin.hist)
- ログ解析の方法を指定
デフォルトの設定(no)では、常に最新の状態で解析され、logrotate されると古いログの情報が消えていってしまう。これを「yes」に変更することで、古いログ解析情報はそのままに、新しく変更があったログのみを追加解析するようになる。
Incremental
yes
- 上記項目を「yes」としたときのログの追加情報に関するデータを格納するファイル名を指定
一般的にはデフォルトのままでよい。今回は二つのサイトを解析するため、下記のようにした。
IncrementalName
/var/lib/webalizer/webalizer_oyaji.current
(IncrementalName
/var/lib/webalizer/webalizer_akirin.current)
- 解析結果レポートのタイトルを指定
日本語化との関係がよく分からないが、とりあえずデフォルトのままで日本語化されるのでそのままとした。
ReportTitle
Usage Statistics for
- 解析対象のホスト名を指定
タイトルやレポート内のリンクに使用される。
HostName
www.aconus.com
- Webalizer が生成するレポートの HTML ファイルの拡張子を指定
一般的には、デフォルトのままで可。おやじは「htm」を基本にしているのでそれに合わせた。
HTMLExtension
htm
- ログ解析時にページ(ドキュメント)として認識する拡張子を指定
ドキュメントの構成に応じて設定すればよい。おやじは、いろいろ CGI を動かしているので「htm*」のみとし、htm/html
のみをカウントするようにした。
PageType
htm*
#PageType cgi
#PageType phtml
#PageType php3
#PageType pl
- ログ解析時、IPアドレスで採られたログをホスト名で表示する場合の指定(configure時にdnsオプション指定要)
ログ解析時、IP アドレスで採られたログをホスト名で表示する場合、毎回 DNS の逆引きをしていると負荷・時間がかかる。そこで、Webalizer では検索結果をキャッシュしており、そのためのファイルの指定と、逆引き時に動作させるプロセス数を指定する。プロセス数は多ければ多いほど早く処理されるが、負荷がかかるので5程度に留めたほうが良い。おやじは、こういう事態を避け負荷分散を図るためログ時にホスト名を引いている。従って、本項目はコメントアウト。
#DNSCache
dns_cache.db
#DNSChildren 5
- 各集計の Top x として表示する数(x)を指定。
各集計の上位何位までを表示するか指定する。表示したくない集計については、zero とする。
TopSites
30
TopKSites 10
TopURLs 30
TopKURLs 10
TopReferrers
zero
TopAgents 15
TopCountries 30
TopEntry 10
TopExit
10
TopSearch 20
TopUsers zero
- 集計から隠したいサイトを指定(カウントには含まれる。)
自サイト内からのアクセスを隠すように設定。とは言うものの、おやじは Apache
でのログ段階で家庭内からのアクセスは別のログファイルにしているので、この設定は盲腸である。
HideSite
*www.aconus.com
HideSite localhost
- 集計から隠したいリファラーを指定(カウントには含まれる。)
自サイト内での移動を隠すように www.aconus.com を設定。
HideReferrer
www.aconus.com
- 集計から隠したい URL を指定(カウントには含まれる。)
集計から隠したいURLを指定する。おやじは、デフォルト設定にCGI等を追加した。
HideURL
*.gif
HideURL *.GIF
HideURL *.jpg
HideURL *.JPG
HideURL *.png
HideURL *.PNG
HideURL *.ra
HideURL *.css
HideURL *.cgi
HideURL *.pl
- 集計したくないサイト/リファラー/URLを指定
ログ解析時、集計したくないサイト/リファラー/URLを指定。集計したくないサイトやURL等を指定する。例えば、隠しディレクトリ等が考えられる。
#IgnoreSite
bad.site.net
#IgnoreURL /test*
#IgnoreReferrer file:/*
#IgnoreAgent RealPlayer
#IgnoreUser root
■ Apacheの設定
Webalizer でリファラーを採りたい場合、Apache のデフォルト設定ではログにリファラーが採られないため、httpd.conf
を変更する必要があります。
おやじのログ周りの設定を以下に示します。(先頭の数字は説明用です。) リファラーを採るには、8/10行目のようにデフォルトの「common」から「combined」に変更します。
- SetEnvIf Remote_Addr 192.168.1. homelog nolog
- SetEnvIf Request_URI "~akirin" akirinlog nolog
- SetEnvIf Request_URI "default.ida" wormlog nolog
- SetEnvIf Request_URI "root.exe" wormlog nolog
- SetEnvIf Request_URI "cmd.exe" wormlog nolog
- SetEnvIf Request_URI "Admin.dll" wormlog nolog
- CustomLog /var/log/apache2/home_log common env=homelog
- CustomLog /var/log/apache2/akirin_log combined env=akirinlog
- CustomLog /var/log/apache2/worm_log common env=wormlog
- CustomLog /var/log/apache2/access_log combined env=!nolog
- 1/7行目で、家庭内からのアクセスをhome_logに採取。
- 2/8行目で、娘のサイトへのアクセスをakirin_logに採取。
- 3行目でCodeRed、4〜6行目でNimudaからアタックを識別し、9行目でworm_logに採取。,
- 10行目で残りのアクセスをaccess_logに採取。おやじのサイトへのアクセスは、ここに含まれる。
■ Webalizerの起動
まずは、手動でWebalizerを動かして、解析結果を見てみましょう。
logrotateされた古いログ
(accsess_log.1/2/3・・・)がある場合は、下記のように日付の古い順に処理します。
# /usr/bin/webalizer -c /etc/webalizer_oyaji.conf /var/log/apache2/access_log.3
# /usr/bin/webalizer -c /etc/webalizer_oyaji.conf /var/log/apache2/access_log.2
# /usr/bin/webalizer -c /etc/webalizer_oyaji.conf /var/log/apache2/access_log.1
# /usr/bin/webalizer -c /etc/webalizer_oyaji.conf /var/log/apache2/access_log |
結果をブラウザで確認してみましょう。見せたくないものが見えてしまっている等、結果が思わしくない場合は、webalizer_oyaji.conf
ファイルを変更し、HistoryName (webalizer_oyaji.hist)、IncrementalName (webalizer_oyaji.current)で指定したファイルを削除して初めからやり直せば大丈夫です。
問題がなければ、crontab に登録して自動的に集計するようにします。おやじは、下記のような簡単なスクリプトを書き /usr/local/bin/webalizer.sh として保存し、0:01に起動するようにしています。
ログ量が多いと解析時間がずれログ解析中にlogrotateされるとおかしくなることがあるらしいので、タイミングでの処理をやめ、logrotate後に
logrotate したファイルを解析するようにしました。また、検索文字列が文字化けするので対策しました。
rotateしたファイルを解析するようにWebalizer.confのLogfileの設定変更を忘れずに。
- Apache の logrotate 設定ファイルの作成
設定は、毎日更新(daily)、一か月分のログを残し(rotate
31)、rotate後に新規のログファイルを作成(create)するようにした。
# vi /usr/local/bin/logrotate.conf
#
logrotate.conf daily rotate
31 create
/var/log/apache2/*log {
missingok sharedscripts
postrotate
/etc/init.d/apache2 reload endscript }
[Esc],[:],[w],[q]で保存
|
- 日本語コードの変換
コード変換用のスクリプトを作成し、/usr/local/bin/jconv として保存、実行権を付与する。
# vi
/usr/local/bin/jconv
#!/usr/bin/perl use
Jcode; while(<>){ $_ =~
s/(%|\\x)([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($2))/eg;
Jcode::convert(\$_,euc);
print; }
[Esc],[:],[w],[q]で保存
# chmod 755
/usr/local/bin/jconv |
なお、このスクリプトでは Jcode を使用するので、インストールしてなければ下記でCPANからインストールする。
# perl -MCPAN -e shell cpan> install
Jcode |
- 起動スクリプトの作成
logrotate後に、日本語コードを変換し Webalizer で解析するスクリプトを作成する。(赤字は日本語コード変換での変更内容)
# vi
/usr/local/bin/webalizer.sh
#!/bin/sh # webalizer.sh
APACHELOG='/var/log/apache2'
/usr/sbin/logrotate /usr/local/bin/logrotate.conf /bin/cat $APACHELOG/access_log.1 | perl
/usr/local/bin/jconv > $APACHELOG/access_log_jpn /bin/cat
$APACHELOG/akirin_log.1 | perl /usr/local/bin/jconv >
$APACHELOG/akirin_log_jpn
/usr/bin/webalizer -c /etc/webalizer_oyaji.conf
/usr/bin/webalizer -c /etc/webalizer_akirin.conf
[Esc],[:],[w],[q]で保存
|
- 既存の logrotate.d から Apache の rotate データを削除し、代わりに cron
で0:01に webalizer.sh を起動する。
# rm -f /etc/logrotate.d/apache2 # vi
/etc/crontab 1 0 * * * root /usr/local/bin/webalizer.sh
[Esc],[:],[w],[q]で保存
# /etc/init.d/crond restart |
■ ログ解析停止時の対処方法
ログ解析を Incremental
モードで動作させていると、障害時にバックアップからログファイル等を戻したりすると、以後、解析が進まなくなることがあります。その場合の復旧方法を以下に示します。完全に復旧するためには、以下の条件を満たしている必要があります。
- 前月までのWebalizerが生成したHTMLファイルがそのまま残っている。
- 当月の、Apacheのログファイルが残っている。
- webalizer.conf (おやじの場合は、webalizer_oyaji.confとwebalizer_akirin.conf) の
HistoryName で指定したwebalizer.hist
(おやじの場合は、webalizer_oyaji.histとwebalizer_akirin.hist) が残っている。
上記の条件を満たしていれば、以下の手順で完全に復旧できます。以下は、おやじの環境を前提に示しているので、実際には各人の環境に読み替えて作業してください。なお、作業はWebalizerが自動実行される前までに完了する必要があるので、十分に余裕をもって作業するか、自動実行を止めて復元後に起動するようにしてください。復元作業が、自動実行の時間を絶対に跨がないようにしてください。
- まずは、Webalizer の動作環境及び設定、Apache のログファイルや Webalizer が作成した HTML ファイルやログを復元する。
- webalizer.conf (おやじの場合は、webalizer_oyaji.confとwebalizer_akirin.conf)の
IncrementalName で指定したwebalizer.current (おやじの場合は、webalizer_oyaji.current
と webalizer_akirin.current)ファイルを消去する。
- 復旧作業を自動化するスクリプトを適当な名前で作成する。おやじは、/usr/local/bin 配下に remake.sh
という名前で作成した。
# cd /usr/local/bin # vi remake.sh
#!/bin/sh # remake.sh # #
Webalizer log remake.
APACHELOG='/var/log/apache2'
i=30 while [ $i -gt
0 ] do /bin/cat
$APACHELOG/access_log.${i} | perl /usr/local/bin/jconv >
$APACHELOG/access_log_jpn /bin/cat
$APACHELOG/akirin_log.${i} | perl /usr/local/bin/jconv >
$APACHELOG/akirin_log_jpn
/usr/bin/webalizer -c /etc/webalizer_oyaji.conf
/usr/bin/webalizer -c /etc/webalizer_akirin.conf i=`expr $i -
1` done
[Esc],[:],[w],[q]で保存
# chmod 755
remake.sh |
Apache のログファイルを調査し、当月の一日のログファイルの追番 (access_log.xx
の xxの部分) を上記スクリプトの i の初期値(赤字部分)に設定する。
- 後は、上記スクリプトを実行して、ひたすら解析が終わるのを待つだけ。サーバの性能やログの量にも依存するが、おやじの場合は、月末にこの作業をやると30分近くかかるのでじっくり待つしかない。
Top Pageへ