このサイトを公開するのに使っている「さくらのレンタルサーバ スタンダード」では、Webalizerによるアクセス解析機能が標準で用意されています。しかしながら、私はAWStatsを好んで使っていたので、Webalizer形式のレポートに慣れておりません。そこで、AWStats 6.9(日本語版)を設置してアクセス統計取ってみました。
さくらのレンタルサーバ(スタンダード)では、Apacheのログをcombined形式で1日ごとに提供してくれます。毎日00:05頃にユーザのホームディレクトリのlog以下に保存されます。これをAWStatsに与えることでアクセス統計をレポート化することができます。
- アクセスログのファイル名 access_log_20091002
- 以前のログは自動的に圧縮されます access_log_20091001.gz
アクセスログが決まった単位でしか提供されないため、AWStatsはCGI版として動かさずcronを使って定期的にレポートを生成する方式を取ります。
試した環境について。
| 項目 | 値 |
|---|---|
| サーバ | さくらのレンタルサーバ スタンダード |
| OS | FreeBSD 7.1-RELEASE-p6 i386 |
| Apache | Apache-1.3.41 |
| Perl | 5.8.9 |
| AWStats | AWStats 6.9 日本語版 |
AWStatsの設置
AWStatsについて
下記サイトで公開されているAWStats6.9日本語版を利用させていただきました。
- AWStatsをFreeBSDで動かす
- http://hobbit.ddo.jp/html/awstats.html
- awstats69t_jpn.zip
検索文字列のデコードがしっかりと効くのと、サーチエンジン等が日本語環境に合っているので、とても便利でした。
処理の流れ
AWStatsを使ってアクセスログからレポートを生成するまでの流れは、次のとおりです。
- 00:05頃 Apacheのアクセスログがlogディレクトリに保存される
- 01:00頃 AWStats処理用スクリプトを実行する(前日分のログを統計処理)
- 検索文字列のURLデコード(utf8_decode.pl)
- ログ統計情報アップデート(awstats.pl)
- レポートページ作成(awstats.pl)
- レポート詳細ページ作成(awstats_buildstaticpages.pl)
アクセスログのURLデコード(検索文字列の復元)からAWStats統計情報ファイル更新までの流れ。
AWStatsの統計情報ファイルからレポート、詳細ページ(HTML)の生成。
生成されるレポートページの例。
ファイルのアップロード
AWStats6.9(日本語版)のアーカイブに含まれるファイルを、さくらのサーバにアップロードします。これらのファイルは事前に改行コードをCR+LFからLFに変更しておきます。詳しくは、以前の記事を参照のこと。
ついでにawstats.*.confファイルも日本語コメントを全て消した上で、改行コードをLFに変換してからアップロードしておくと便利です。さくらのサーバではvimが入っていないようなので、日本語無しにするとサーバ上のviで編集できるからです。
utf8_decode.pl内の「include 'awstats_hosts.conf'」部分を、次のように変えておくと良いです。
# 解析対象のホスト名。ドット「.」には\を付けてエスケープする。 $Myhost = "satospo\.sakura\.ne\.jp";
mime.pmとdomains.pmの準備
ファイルをアップロードした後に、さくらのサーバにSSHでログインしてからmime.pmとdomains.pmファイルのシンボリックリンクを作ります。アーカイブを展開した先のwwwroot/cgi-bin/lib/に、次のファイルがあります。
- mime-en.pm
- mime-jp.pm
- domains-en.pm
- domains-jp.pm
レポートに表示させたい項目に合わせてリネームするか、シンボリックリンクを張ります。
日本語表示したい場合。 % ln -s domains-jp.pm domains.pm % ln -s mime-jp.pm mime.pm 英語表示したい場合。 % ln -s domains-en.pm domains.pm % ln -s mime-en.pm mime.pm
Perlモジュールの確認
AWStats6.9(日本語版)で使用するPerlモジュールは、次のとおりです。
- Encode
- Time::Local
- Socket
- Jcode
- Unicode::Japanese
- HTML::Entities::Numbered
さくらのレンタルサーバ(スタンダード)では、以下のPerlモジュールが用意されていませんでした。
- Encode
- Unicode::Japanese
- HTML::Entities::Numbered
例えば、コマンドラインでutf8_decode.plを実行すると次のようなエラーになってしまいます。
% ./utf8_decode.pl Can't locate Unicode/Japanese.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN /usr/local/lib/perl5/site_perl/5.8.9/mach /usr/local/lib/perl5/site_perl/5.8.9 /usr/local/lib/perl5/5.8.9/mach /usr/local/lib/perl5/5.8.9 .) at ./utf8_decode.pl line 15, <DATA> line 855. BEGIN failed--compilation aborted at ./utf8_decode.pl line 15, <DATA> line 855.
CPANモジュールを追加
そこで、AWStats6.9(日本語版)を実行するのに必要なモジュールを、さくらのサーバにアップロードします。手持ちのCentOS5サーバにインストール済みのモジュールを使ってみました。
| モジュール | 元サーバのパス | アップロード先 |
|---|---|---|
| Encode | /usr/lib/perl5/5.8.8/Encode | perl_lib/Encode |
| HTML::Entities::Number | /usr/lib/perl5/site_perl/5.8.8/HTML | perl_lib/HTML |
| Unicode::Japanese | /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Unicode | perl_lib/Unicode |
自分のホームディレクトリにperl_libと言うディレクトリを作成して、そこにアップロードしています。
さくらのサーバで環境変数PERL5LIBを設定します。SSHでサーバにログインし、ファイル.cshrcに次の内容を追加します。
setenv PERL5LIB /home/satospo/perl_lib
変更後に.cshrdを適用します。
% source .cshrc
以上で、AWStats6.9の実行に必要なモジュールが整いました。utf8_decode.plがエラー無く実行できることが確認できます。
参考サイト。
AWStatsレポート生成方針
AWStatsのレポートの保存先などを次のように決めます。YYYYMMDDは日付を年月日8ケタにしたもの。
| 用途 | ディレクトリ(ファイル) |
|---|---|
| Apacheログファイル | /home/UserName/log/access_log.YYYYMMDD |
| AWStats 本体設置場所 | /home/UserName/awstats69/ |
| AWStats 設定ファイル | /home/UserName/awstats69/wwwroot/cgi-bin/awstats.*.conf |
| AWStats データディレクトリ | /home/UserName/awstats69/dat/ |
| AWStats 公開用ディレクトリ | /home/UserName/www/awstats/ |
| AWStats レポート | /home/UserName/www/awstats/YYYYMMDD/ |
| AWStats 画像ディレクトリ | /home/UserName/www/awstats/icon/ |
| AWStats CSSディレクトリ | /home/UserName/www/awstats/css/ |
AWStats6.9のアーカイブに含まれるwwwroot以下から、次のディレクトリを公開用ディレクトリに移動しておきます。
- css
- icon
- js
AWStatsのアイコンファイルおよびCSSは、次のURLでアクセスできるようになります。
- /awstats/icon/
- /awstats/css/
設定ファイルの作成
AWStats用の設定ファイルを作ります。ここでは当サイトを例にしてます。ファイル wwwroot/cgi-bin/awstats.satospo.sakura.ne.jp.conf とする。元のファイル(awstats.model.conf)との変更点は次のとおり。
LogFile="/home/satospo/log/access_log.enc" LogFormat=1 LogSeparator=" " Lang="jp" SiteDomain="satospo.sakura.ne.jp" HostAliases="" DirData="/home/satospo/awstats69/data" DirIcons="/awstats/icon" StyleSheet="/awstats/css/awstats_bw.css"
公開用ディレクトリに.htaccessファイルを用意しておきます。自分以外がアクセスできないように、適当にBasic認証をかけておくと良いでしょう。
IndexOptions NameWidth=40 IndexIgnore .. css icon js IndexOrderDefault Descending Name Order Allow,Deny Allow from 自宅IPアドレス
サイトのrobots.txtで/awstats以下を除外するように書いておきます。念のため。
User-Agent: * Disallow: /mtlib/ Disallow: /tech_image/ Disallow: /awstats/ Allow: /
AWStasを実行してみる
お試し
今までに溜まっているアクセスログをAWStatsで処理してみます。まずは、logディレクトリ内の圧縮済みファイルを一時ディレクトリに移します。
% cd ~ % mkdir temp % cd log % cp *.gz ../temp % cd ~/temp % gzip -d * % ls access_log_20090901 access_log_20090912 access_log_20090923 access_log_20090902 access_log_20090913 access_log_20090924 access_log_20090903 access_log_20090914 access_log_20090925 access_log_20090904 access_log_20090915 access_log_20090926 access_log_20090905 access_log_20090916 access_log_20090927 access_log_20090906 access_log_20090917 access_log_20090928 access_log_20090907 access_log_20090918 access_log_20090929 access_log_20090908 access_log_20090919 access_log_20090930 access_log_20090909 access_log_20090920 access_log_20091001 access_log_20090910 access_log_20090921 access_log_20090911 access_log_20090922
全てのログを結合して1ファイルにまとめます。AWStatsに同梱されている「logresolvemerge.pl」スクリプトを使いました。
% cd ~/temp % ~/awstats69/tools/logresolvemerge.pl access_log_2009* > access_log
まとまったログファイルのURLをデコードします。これで ~/log/access_log.enc ファイルができます。
% ~/awstats69/tools/utf8_decode.pl < access_log > ../log/access_log.enc
あとは、AWStatsを実行して統計情報ファイルを生成します。
%~/awstats69/wwwroot/cgi-bin/awstats.pl -config=satospo.sakura.ne.jp -update Create/Update database for config "/home/satospo/awstats69/wwwroot/cgi-bin/awstats.satospo.sakura.ne.jp.conf" by AWStats version 6.95 (build 1.942) From data in log file "/home/satospo/log/access_log.enc"... Warning: HostAliases parameter is not defined, awstats choose "satospo.sakura.ne.jp localhost 127.0.0.1". Phase 1 : First bypass old records, searching new record... Searching new records from beginning of log file... Phase 2 : Now process new records (Flush history on disk after 20000 hosts)... Jumped lines in file: 0 Parsed lines in file: 18850 Found 0 dropped records, Found 0 corrupted records, Found 0 old records, Found 18850 new qualified records.
これで統計情報ファイルがDataDirに生成されました。
% cd ~/awstats/data % ls -1 awstats092009.satospo.sakura.ne.jp.txt awstats102009.satospo.sakura.ne.jp.txt
tempに展開したログファイルと、log/access_log.encファイルは不要なので、削除しておきます。
レポートを作成する前に、保存先ディレクトリを作っておきます。ここでは2009年09月と10月のレポートを生成するので、200909と200910の公開用ディレクトリを作ります。
% mkdir ~/www/awstats/200909 % mkdir ~/www/awstats/200910 % ls -1 ~/www/awstats/ 200909 200910 css icon js
レポート作成その1。トップページの生成。9月分の例。10月分は同様にオプションを変える。
% ~/awstats69/wwwroot/cgi-bin/awstats.pl -config=satospo.sakura.ne.jp \ -output -staticlinks \ -year=2009 -month=9 > ~/www/awstats/200909/index.html
レポート作成その2。詳細ページの作成。9月分の例。10月分は同様にオプションを変える。
% ~/awstats69/tools/awstats_buildstaticpages.pl \ -config=satospo.sakura.ne.jp -lang=jp -year=2009 -month=9 \ -awstatsprog=/home/satospo/awstats69/wwwroot/cgi-bin/awstats.pl \ -diricons=/awstats/icon \ -dir=/home/satospo/www/awstats/200909/
これまでで正しくレポートが生成されたことを確認します。
定期実行用スクリプト作成
AWStats関連の処理をまとめたシェルスクリプトを作成します。これをcronで実行することで、自動的にログの統計処理がされるようになります。シェルスクリプト内でもPERL5LIBを定義してます。
ちなみに、FreeBSDのdateコマンドで前日の日付を得るには?次のようにオプションを与えます。Linuxと違うので注意。
%date Sat Oct 3 14:48:03 JST 2009 %date -v -1d +%Y%m%d 20091002
定期処理用スクリプト例。
#!/bin/sh # satospo.sakura.ne.jp - AWStats # ENV export PERL5LIB=/home/satospo/perl_lib HDIR="/home/satospo" DATE=`/bin/date -v -1d +%Y%m%d` MONTH=`/bin/date -v -1d +%m` YEAR=`/bin/date -v -1d +%Y` if [ -f "${HDIR}/log/access_log_${DATE}" ]; then # check if [ ! -d "${HDIR}/www/awstats/${YEAR}${MONTH}" ]; then /bin/mkdir ${HDIR}/www/awstats/${YEAR}${MONTH} fi if [ -f "${HDIR}/log/access_log.enc" ]; then /bin/rm -f ${HDIR}/log/access_log.enc fi # url decode ${HDIR}/awstats69/tools/utf8_decode.pl < ${HDIR}/log/access_log_${DATE} \ > ${HDIR}/log/access_log.enc # update ${HDIR}/awstats69/wwwroot/cgi-bin/awstats.pl \ -config=satospo.sakura.ne.jp -update # static report index ${HDIR}/awstats69/wwwroot/cgi-bin/awstats.pl \ -config=satospo.sakura.ne.jp -output -staticlinks \ -year=${YEAR} \ -month=${MONTH} > ${HDIR}/www/awstats/${YEAR}${MONTH}/index.html # static report page ${HDIR}/awstats69/tools/awstats_buildstaticpages.pl \ -config=satospo.sakura.ne.jp -lang=jp -year=${YEAR} -month=${MONTH} \ -awstatsprog=${HDIR}/awstats69/wwwroot/cgi-bin/awstats.pl \ -diricons=/awstats/icon -dir=${HDIR}/www/awstats/${YEAR}${MONTH} # delete logfile if [ -f "${HDIR}/log/access_log.enc" ]; then /bin/rm -f ${HDIR}/log/access_log.enc fi fi
サーバのcronに作成したスクリプトを登録する。
% crontab -e # awstats 0 1 * * * /home/satospo/awstats69/satospo.sh > /dev/null
以上で、毎日1時頃にAWStatsのレポートが生成されるようになりました。
注意点
Apacheのログファイルサイズが大きい場合(おおよそ100MB~)では、AWStatsのutf8_decode処理とupdate処理で結構なリソースを消費します。アクセス数が多いサイトなどの場合は、サーバ負荷が大きくなってしまうためAWStatsでの処理には、注意する必要があります。例えば、ログファイルを分割して少しずつ処理するなど。
まとめ
私はAWStatsのレポートページを見慣れて居たので、AWStatsでも処理できないかと試した所、そんなに難しくなかったです。さくらのレンタルサーバでは、Apacheログをcombined形式でdailyローテート済みで提供してくれていたため、普段慣れた処理の流れを使うことができました。



