はてなブックマークに追加する Twitterに投稿する Facebookで共有する Googleブックマークに追加する Evernoteクリップに追加する Share Yahoo!ブックマークに追加する livedoorクリップに追加する

Cyberam Documents Project

AWStatsとは
AWStatsはアクセスログを解析し、ブラウザで閲覧できるようにHTML形式で視覚的な統計情報を表示することができるPerlスクリプトです。
AWStats以外にもAnalogなどのログ管理ソフトはありますがAWStatsが一番見やすくわかりやすいでしょう。
インストールも非常に簡単です。主な統計情報としては月別、時間別、曜日別のアクセス統計やOS別、ブラウザ別、 トップレベルドメイン別統計などがあります。またどこのページからリンクされてきたのかやどの検索エンジンでどのような検索語でやってきたのかなどが一目でわかります。
次のような統計情報が表示されます。http://awstats.sourceforge.net/cgi-bin/awstats.pl
AWStatsのインストール
まず最初にAWStatsをダウンロードします。Last stableが最新安定板です。AWStats
そして解凍します。
#tar xzvf awstats-6.7.tar.gz
#ls awstats-6.7/
README.TXT  docs  tools  wwwroot
#ls awstats-6.7/wwwroot/
cgi-bin  classes  css  icon  js
#ls awstats-6.7/wwwroot/cgi-bin/
awredir.pl  awstats.model.conf  awstats.pl  lang  lib  plugins
次に以下のことを確認します。
1.perlのバージョンが5.8.0以降である。
#perl -v
This is perl, v5.8.3 built for i386-linux-thread-multi
2.perlの場所を確認します。
#which perl
/usr/bin/perl
3.WWWサーバのCGIディレクトリのパスを確認します。(この文章では/usr/local/apache/cgi-binとします。)

4.Apacheのアクセスログのパスを確認します。(この文章では/usr/local/apache/logs/access_logとします。)

5.WWWサーバのルートディレクトリを確認します。(この文章では/usr/local/apache/htdocsとします。)

6.Apacheのログフォーマットがcombinedであるか確認する。(デフォルトのログフォーマットはcommonである。)
#vi /usr/local/apache/conf/httpd.conf
----------------省略----------------
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a 
# container, they will be logged here. Contrariwise, if you *do*
# define per- access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog /var/log/httpd/access_log common  ←コメントアウトする。
----------------省略----------------
#
# If you prefer a single logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog /var/log/httpd/access_log combined  ←コメントアウトを解除する。
----------------省略----------------
ではインストールします。

awstats-6.7/wwwroot/cgi-bin内の全てのファイル、ディレクトリをCGIディレクトリにコピーします。
#cp -r awstats-6.7/wwwroot/cgi-bin/* /usr/local/apache/cgi-bin/
AWStatsが使用するアイコンファイルが格納されたディレクトリをWWWサーバから見える場所にコピーします。
#cp -r awstats-6.7/wwwroot/icon/ /usr/local/apache/htdocs/
以上でインストール完了です。
AWStatsの基本設定
AWStatsの設定ファイルは先ほどCGIディレクトリに保存したawstats.model.confです。まずこのファイルの名前を変更します。
#cd /usr/local/apache/cgi-bin/
#mv awstats.model.conf awstats.conf
そしてこのAWStatsの設定ファイル(awstats.conf)を編集します。編集する項目は次のとおりです。(Apacheのログファイルを分析する。)

項目 説明
LogFile /usr/local/apache/logs/access_log 分析するWWWサーバのアクセスログファイルのパスを指定する。(絶対パスもしくはawstats.plからの相対パス)
LogType W 分析するログファイルのタイプを指定します。(W:web S:streaming M:mail F:ftp)
LogFormat 1 ログフォーマットを指定する。(Apache:1 IIS:2)
SiteDomain ドメイン名 分析対象のWWWサーバのドメイン名を指定する。
HostAliases ドメイン名 | IPアドレス SiteDomainで指定したドメイン名以外で分析対象のWWWサーバにアクセスできるドメイン名やIPアドレスを指定する。
DNSLookup 1 ドメイン/国別などの統計情報を取得する場合はDNSの逆引きをする必要があります。
(0:逆引きしない 1:逆引きする 2:DNSキャッシュ内のIPアドレスのみ逆引きする
DirData ./awstats_db AWStatsが保持する分析結果などのファイルを格納するディレクトリを指定します。(絶対パスもしくはawstats.plからの相対パス)
DirCgi /cgi-bin awstats.plが格納されているディレクトリを指定する。(絶対URLもしくはWWWサーバのルートディレクトリからの相対URL)
DirIcons /icon アイコンファイルが格納されているディレクトリを指定する。(絶対URLもしくはWWWサーバのルートディレクトリからの相対URL)
AllowToUpdateStatsFromBrowser 0 出力するHTMLファイルに更新ボタンを設置するか指定します。この更新ボタンからの動作はApacheのユーザ権限で 動作するためそのユーザにDirDataで指定されたディレクトリやファイルへの書き込み権限が必要です。(0:設置しない 1:設置する)
AllowFullYearView 3 年間統計情報を出力できるか指定する。(0:許可しない 1:コマンドライン上では許可、出力されたHTML上のコンボボックスには表示されない  2:コマンドライン上では許可、出力されたHTML上のコンボボックスからは許可しない 3:許可する)
PurgeLogFile 0 AWStats実行時にLogFileで指定したログファイルを切り詰めるか指定します。動作が安定するまでは切り詰めを行わないこと をお勧めします。(0:切り詰めない 1:切り詰める)
SkipHosts ホスト名 | IPアドレス 統計情報の処理対象外にするクライアントを指定する。ログファイルの時点で逆引きされている場合はホスト名 で指定し、されていない場合はIPアドレスで指定する。(自分からのアクセスは統計に含みたくない場合は自分のIPアドレスを記述すればよい。)
Lang 言語 統計情報で表示される言語を指定する。日本語で表示させるならjaです。

ここで一度正しく動作するのかチェックします。
#/usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -update
#/usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -output -staticlink > /usr/local/apache/htdocs/awstats.html
http://ドメイン名/awstats.htmlでブラウザから閲覧できるか確認します。
(検索語や検索文などは文字化けしていますが次の「AWStatsを日本語に対応させる(検索語の文字化け回避編)」で解決します。)

正しく動作したらDirDataで指定したディレクトリ内のファイルを削除しておきます。
AWStatsを日本語に対応させる(検索語の文字化け回避編)
AWStatsが出力するHTMLファイルの文字コードはutf8なので、検索語、検索文統計表示の時にその他の文字コードで検索された文字列は文字化けします。
せっかくの検索語や検索文統計が文字化けしてしまうのでnayuta様が公開している以下のスクリプトをダウンロードします。
conv_weblog_to_utf8.pl

そしてこのperlスクリプトをCGIディレクトリにコピーします。
#cp conv_weblog_to_utf8.pl /usr/local/apache/cgi-bin/
このスクリプトにApacheのアクセスログを通すことでApacheのアクセスログ内の検索文字列がutf8に変換されます。(変換後のアクセスログはaccess_log.enc)
#/usr/local/apache/cgi-bin/conv_weblog_to_utf8.pl < /usr/local/apache/logs/access_log > /usr/local/apache/logs/access_log.enc
これでaccess_log内の検索文字列はutf8に変換されaccess_log.encに出力されます。
ここでAWStatsの設定ファイル(awstats.conf)のLogFileの部分を/usr/local/apache/logs/access_log.encに編集する必要があります。
LogFile="/usr/local/apache/logs/access_log.enc"
統計情報を更新します。
/usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -update
最後にHTML形式で統計情報を出力します。
/usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -output -staticlink > /usr/local/apache/htdocs/awstats.html
下線部には出力させたいパスを記述します。(絶対パスもしくはawstats.plからの相対パス)
以上でhttp://ドメイン名/awstats.htmlでブラウザから閲覧することができます。
AWStatsを日本語に対応させる(正しい日本語統計表示編)
AWStatsの設定ファイル(awstats.conf)内の Lang を ja に設定すると統計情報を日本語表示することができますが満足のいくものにはなっていない。
(日本語表示されていない部分や意味がおかしいなど。) 日本語表示が設定されているファイルは/usr/local/apache/cgi-bin/lang/awstats-jp.txtである。このファイルを編集する。
#vi /usr/local/apache/cgi-bin/lang/awstats-jp.txt
# Japanese message file (info@kchosting.jp)
# $Revision: 1.9 $ - $Date: 2004/06/07 19:04:36 $
PageCode=UTF-8
message0=不明
message1=不明(ipが解りません)
message2=その他
message3=詳細を見る
message4=日
message5=月
message6=年
----------------省略----------------
上記のように設定されているので、これらを編集すれば自分のわかりやすい日本語表示にすることができる。しかし、これら(message)がどの表示部分に対応しているかを 調べる必要がある。私が修正したファイルを置いておきます。(右クリック→対象をファイルに保存)awstats-jp.txt

変更の一部分はこのような感じです。




また、以下のように一部日本語表示に誤り箇所がある。この修正はAWStats日本語化バージョン6.7のawstats.plに反映しています。




ドメインや国名の統計を日本語で表示するには/usr/local/apache/cgi-bin/lib/domains.pmを編集します。
----------------省略----------------
%DomainsHashIDLib = (
'localhost','localhost',
'i0','Local network host',
'a2','Satellite access host',
'ac','Ascension Island','ad','Andorra','ae','United Arab Emirates',
'aero','Aero/Travel domains','af','Afghanistan',
'ag','Antigua and Barbuda','ai','Anguilla','al','Albania',
----------------省略----------------
);
’TLD(トップレベルドメイン)’,’表示名’というフォーマットになっているのでこの表示名の部分を日本語で編集してください。
そしてこのファイル(domains.pm)の文字コードをutf8に変換してください。(utf8に変換しないと日本語で編集した文字列が文字化けします。)
私が修正したファイルを置いておきます。domains.pm

変更の一部分はこのような感じです。




AWStatsを日本の検索サイトにも対応させる
AWStatsは日本の検索サイトには対応していないため正確な統計情報は得られない。
例えば、実際は日本の検索サイトから検索してサイトにアクセスしたとしても、検索サイトからのアクセスには含まれない。
これを修正するには/usr/local/apache/cgi-bin/lib/search_engines.pmを編集します。
----------------省略----------------
@SearchEnginesSearchIDOrder_list1=(
# Major international search engines
'base\.google\.',
'froogle\.google\.',
'groups\.google\.',
'images\.google\.',
'google\.',
'googlee\.',
'googlecom\.com',
'goggle\.co\.hu',
'216\.239\.(35|37|39|51)\.100',
'216\.239\.(35|37|39|51)\.101',
'216\.239\.5[0-9]\.104',
'64\.233\.1[0-9]{2}\.104',
'66\.102\.[1-9]\.104',
'66\.249\.93\.104',
'72\.14\.2[0-9]{2}\.104',
'msn\.',
----------------省略----------------
私が修正したファイルを置いておきます。search_engines.pm
変更の一部分はこのような感じです。
 → 

きちんとInfoseekなどの日本の検索サイトも表示されています。
AWStatsを定期的に実行する
HTMLファイルで統計情報を出力せずブラウザから直接awstats.plを実行して表示してもいいのですがここでは1時間おきに統計情報をHTMLファイルで出力する 方法を紹介します。 まず次のスクリプトファイル(awstats.cron)を各自の環境に合わせてパスを書き換えて/etc/cron.hourlyに保存します。
#vi /etc/cron.hourly/awstats.cron
#!/bin/sh
/usr/bin/perl /usr/local/apache/cgi-bin/conv_weblog_to_utf8.pl < /usr/local/apache/logs/access_log > /usr/local/apache/logs/access_log.enc
/usr/bin/perl /usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -update > /dev/null
/usr/bin/perl /usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -output -staticlink > /usr/local/apache/htdocs/awstats.html
パーミッションを変更します。
#chmod 700 /etc/cron.hourly/awstats.cron
この動作はまず
1.Apacheのログファイルがconv_weblog_to_utf8.plにより変換されaccess_log.encに出力されます。
2.access_log.encで統計情報を更新します。
3.更新した統計情報をHTMLファイルで出力します。

以上で1時間おきにcronにより実行されます。

※必ずパスには注意してください。それぞれの環境に合わせて読み替えてください。
AWStatsとlogrotateの問題点解決
Apacheのaccess_logをlogrotateによりローテーションしている場合に問題が発生する。例えば4時10分にaccess_logの ログローテーションが行われるとすると「AWStatsを定期的に実行する」で紹介したスクリプトは1時間おきに実行されるので 4時に実行されたとして次に実行されるのは5時であるため、4時から4時10分の間にaccess_logに記録されたログはawstatsの統計情報に 反映されない。この問題を解決するにはaccess_logをローテーションする直前にawstats.plにより統計情報をアップデートします。
/etc/logrotate.d/apacheを編集します。
#vi /etc/logrotate.d/apache
/usr/local/apache/logs/access_log {
missingok
prerotate
/usr/bin/perl /usr/local/apache/cgi-bin/conv_weblog_to_utf8.pl < /usr/local/apache/logs/access_log > /usr/local/apache/logs/access_log.enc
/usr/bin/perl /usr/local/apache/cgi-bin/awstats.pl -config=awstats.conf -update > /dev/null
endscript
postrotate
   /bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid`
endscript
}
下線部を追記します。これでaccess_logをローテーションする直前に統計情報がアップデートされるので問題が発生しません。
ワームが残すログによるAWStatsのエラー回避
WindowsのIISやWebDAVの脆弱性を突いた攻撃により、Linuxではセキュリティ上は問題にならないが、大きなログを残すためログファイルが増大化する。 またAWStatsなどでアクセスログを元に統計情報を出力している場合、エラーとなり実行できなくなる場合もある。 これらの対策として、http.confを編集します。
#vi /usr/local/apache/conf/http.conf
SetEnvIf Request_URI "default\.ida" wormlog
SetEnvIf Request_URI "cmd\.exe" wormlog
SetEnvIf Request_URI "root\.exe" wormlog
SetEnvIf Request_URI "Admin\.dll" wormlog
SetEnvIf Request_URI "NULL\.IDA" wormlog
SetEnvIf Request_URI "NULL\.printer" wormlog
SetEnvIf Request_URI "mem_bin" wormlog
SetEnvIf Request_URI "vti_bin" wormlog
SetEnvIf Request_URI "MSADC" wormlog
CustomLog /usr/local/apache/logs/access_log combined env=!wormlog
CustomLog /usr/local/apache/logs/worm_log combined env=wormlog
上記のように SetEnvIf を追記し CustomLog を編集してください。これにより、NimdaやCode Red、Code Blueなどによるログはaccess_logではなくworm_logに記録されます。
また、WebDAVの脆弱性を突いた攻撃によるログは大変サイズが大きく、AWStatsも正常に動作しなくなります。
[12/Mar/2004:20:14:15 +0900] "SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02 …
というものが延々記録されます。このログは SetEnvIf では回避できません。(URIが長すぎることによる414エラー(Request-URI Too Long)に対するログのほうが先に判断されるため。)
このログをaccess_logファイルに記録しない方法は次のようにhttp.confを編集します。
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat に上記下線部を追記してください。以上で、ステータスコード414エラーによるログは記録されなくなります。
はてなブックマークに追加する
Evernoteクリップに追加する
Share on Tumblr