トップ  »  Tech  »  Web

このサイトを公開するのに使っている「さくらのレンタルサーバ スタンダード」では、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を使ってアクセスログからレポートを生成するまでの流れは、次のとおりです。

  • 00:05頃 Apacheのアクセスログがlogディレクトリに保存される
  • 01:00頃 AWStats処理用スクリプトを実行する(前日分のログを統計処理)
    • 検索文字列のURLデコード(utf8_decode.pl)
    • ログ統計情報アップデート(awstats.pl)
    • レポートページ作成(awstats.pl)
    • レポート詳細ページ作成(awstats_buildstaticpages.pl)

アクセスログのURLデコード(検索文字列の復元)からAWStats統計情報ファイル更新までの流れ。

http://satospo.sakura.ne.jp/tech_image/webapp/awstats_sakura1.png


AWStatsの統計情報ファイルからレポート、詳細ページ(HTML)の生成。

http://satospo.sakura.ne.jp/tech_image/webapp/awstats_sakura2.png


生成されるレポートページの例。

http://satospo.sakura.ne.jp/tech_image/webapp/awstats_satospo02.png


ファイルのアップロード

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/

これまでで正しくレポートが生成されたことを確認します。

http://satospo.sakura.ne.jp/tech_image/webapp/awstats_satospo01.png


定期実行用スクリプト作成

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ローテート済みで提供してくれていたため、普段慣れた処理の流れを使うことができました。