レンタルサーバ(sakura)にawstats(with GeoIP)インストール

1.ユーザランドへのインストール方針

レンタルサーバ(sakura)にGeoIPプラグインを有効にしたawstatsをインストールしたのでそのメモ。

日本用にカスタマイズされたawstasが以下のサイトで公開されている。
AWStatsをFreeBSDで動かす

sakuraのようなレンタルサーバでは、ユーザランドでの動作となるので以下のような工夫が必要となる。

  • 必要なPerlモジュール(CPAN利用)のユーザランドへインストール
  • GeoIP(IPから接続元の地域がわかる)のユーザランドへのインストール
  • awstats.plに上記モジュールのパス追加

2.CPANを利用して必要モジュールインストール

・ホームディレクトリ下にlocalとlocal/srcを作成

$ cd ~
$ mkdir -p local/src

・CAPN初期設定

まずは初期設定。

$ perl -MCPAN -e shell

質問に答える。とりあえず全部デフォルト。
/home/USERNAME/.cpan/CPAN/MyConfig.pmが設定ファイル。これを編集。ここを参考にした。

'make_install_arg' => qq[SITEPREFIX=$ENV{HOME}/local],
'makepl_arg' => qq[INSTALLDIRS=site INSTALL_BASE=$ENV{HOME}/local LIB=$ENV{HOME}/local/lib/perl5],
'mbuildpl_arg' => qq[./Build --install_base $ENV{HOME}/local],
'urllist' => [q[ftp://ftp.u-aizu.ac.jp/pub/CPAN], q[ftp://ftp.kddilabs.jp/CPAN/]],

※TIPS:間違えた場合はCAPN>o conf init で初期化できる。

自分の環境はbashに変えてあるので.bashrcにパスなどを書き込み

$ echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
$ echo 'export PERL5LIB=$HOME/local/lib/perl5:$HOME/local/lib/perl5/site_perl' >> ~/.bashrc

FreeBSDのportsと連携する仕組みであるBSDPANでエラーがでないよう調整。

$ echo 'export PKG_DBDIR=$HOME/local/var/db/pkg' >> ~/.bashrc
$ echo 'export PORT_DBDIR=$HOME/local/var/db/pkg' >> ~/.bashrc
$ echo 'export INSTALL_AS_USER=' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=$HOME/local/lib' >> ~/.bashrc
$ mkdir -p ~/local/var/db/pkg

設定を有効にする。

$ source ~/.bashrc

・モジュールインストール

$ perl -MCPAN -e shell
CPAN[1]>install HTML::Entities::Numbered
CPAN[2]>install Unicode::Japanese
CPAN[3]>install Jcode

・CAPNを最新にアップデートする。

$ cpan -i Bundle::CPAN

3.GeoIPのインストール

おそらくCPANでもインストールできる(Geo::IP)が、CAPI(高速動作するらしい)を使用したかったのでソースからインストールした。

・GeoIPのCAPI(C言語で書かれたAPI)ダウンロード、インストール

$ cd ~/local/src
$ wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.6.tar.gz
$ tar zxvf GeoIP-1.4.6.tar.gz
$ cd GeoIP-1.4.6
$ ./configure --prefix=/home/USERNAME/local/
$ make
$ make check
$ make install

コマンドがあるので試してみる。
% geoiplookup 124.83.147.202 (www.yahoo.co.jp)
GeoIP Country Edition: JP, Japan

% geoiplookup www.google.com
GeoIP Country Edition: US, United States

・GeoIPのPerlモジュールダウンロード、インストール

$ wget http://geolite.maxmind.com/download/geoip/api/perl/Geo-IP-1.38.tar.gz
$ tar zxvf Geo-IP-1.38.tar.gz
$ cd Geo-IP-1.38
$ perl Makefile.PL LIBS='-L/home/USERNAME/local/lib' INC='-I/home/USERNAME/local/include' PREFIX='/home/USERNAME/local'
$ make
$ make test
$ make install

・GeoIP用最新データダウンロード

GeoIP用データは月に一度更新されるらしい。とりあえず最新版にしておく。

最新版の国別IPデータをダウンロードする。

$ cd ~/local/src
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
$ gunzip GeoIP.dat.gz
$ mv GeoIP.dat ~/local/share/GeoIP/GeoIP.dat

最新版の地域別IPデータをダウンロードする。

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
$ gunzip GeoLiteCity.dat.gz
$ mv GeoLiteCity.dat ~/local/share/GeoIP/GeoLiteCity.dat

※有償版は以下のコマンドで自動アップデート可能
$ geoipupdate -d /home/USERNAME/local/share/GeoIP

4.awstatsのインストール

以下のディレクトリにインストールする。
~/local/awstats-6.95-jp
~/local/awstats-6.95-jp/wwwroot以下をWebに公開することにする(~/local/www/awstatsからのシンボリックリンクを作成)。

・日本用にカスタマイズされたawstatsをダウンロード・インストール

AWStatsをFreeBSDで動かすサイトのawstats695t_jpn.zipを使用する。

awstats.model.confはawstats.HOSTNAME.confなどに変更する。HOSTNAMEのところが各種コマンド実行時の-configオプションの指定と一致するようにする。

$ mkdir awstats-6.95-jp
$ cd ~/local/awstats-6.95-jp
$ wget http://hobbit.ddo.jp/html/awstats695t_jpn.zip
$ unzip awstats695t_jpn.zip
$ cd wwwroot/cgi-bin/
$ cp awstats.model.conf awstats.www.hogepage.net.conf

Perlソースの改行コードがCRLFになってる。これだとInternal Server Errorが発生する。また、windowsで作成したらしいのでパーミッションがおかしい。
以下のように修正。

$ cd ~/local/awstats-6.95-jp
$ find ./ -name *.pl | xargs nkf -w -Lu --overwrite
$ find ./ -name *.pl | xargs chmod 755

・confの設定

awstats.www.hogepage.net.confの編集

#日本語用のawstatsはUTF-8に変換したログを指定。
LogFile="/home/USERNAME/log/access_log.utf8"
#オリジナルのawstats使用の場合はこちらを指定。
#LogFile="/home/USERNAME/log/access_log_%YYYY-24%MM-24%DD-24"
SiteDomain="www.hogepage.net"
DirData="/home/USERNAME/local/awstats-6.95-jp/wwwroot/data"
DirCgi="/awstats/cgi-bin"
DirIcons="/awstats/icon"
StyleSheet="/awstats/css/awstats_bw.css"
Lang="jp"
LoadPlugin="geoip GEOIP_STANDARD /home/USERNAME/local/share/GeoIP/GeoIP.dat"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /home/USERNAME/local/share/GeoIP/GeoLiteCity.dat"

GeoIPのPluginは2つ設定してあるが、それぞれ国別、地域別(都道府県など)用のPluginである。

解析データ保存用ディレクトリ、静的なHTML用ディレクトリを作成。

$ mkdir ~/www/awstats/data
$ mkdir ~/www/awstats/html

※awstatsは統計情報を毎回動的にHTML出力するのは負荷になるので、静的なHTMLに変換できる。

・apacheの設定

$ cd ~/www
$ ln -s ../local/awstats-6.95-jp/wwwroot awstats
$ cd awstats
$ cat .htaccess
AddHandler cgi-script pl
AuthUserFile /home/USERNAME/.htpasswd
AuthGroupFile /dev/null
AuthName "awstats login"
AuthType Basic
require valid-user

アクセス制限用アカウント登録。sakuraはDigest認証が使えないのでBasic認証の設定を行う。
$ htpasswd -c ~/.htpasswd admin

・ユーザランドのCPAN、GeoIPモジュールのインクルード

awstats.plの最初の方に以下追加。

use lib '/home/USERNAME/local/lib/perl5';
use lib '/home/USERNAME/local/lib/perl5/site_perl/5.8.9/mach';

またawstats.plの先頭の「#!c:/perl/bin/perl」を削除。

・画面表示

画面表示してみる。
http://HOSTNAME/awstats/cgi-bin/awstats.pl

なんか以下のエラーが。。
 ※error_logが見れない状況では「use CGI::Carp ‘fatalsToBrowser’;」をファイルの先頭付近に記述すると幸せになる。
該当箇所に「};」というゴミがあったので削除。

syntax error at /home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/plugins/geoip_city_maxmind.pm line 4472
syntax error at /home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/plugins/geoip_city_maxmind.pm line 4512, near "else"

再度表示。空のアクセス解析画面が表示されればOK

・アクセス解析

オリジナルのawstatsは、以下のコマンドでログを解析する。
/home/USERNAME/local/awstats-6.95-jp/wwwroot/cgi-bin/awstats.pl -config=www.hogepage.net -update

しかし、これではサーチエンジンのキーワードなどが文字化けする場合がある。
付属のawstats.shやawstats.cronにログをUTF-8形式にする方法が載っているが、sakuraのようにログがaccess_log_20100101のような日付形式になっている場合に対応していない。

access_log_20100101のような日付がついかアクセスログに対応できるスクリプトがここにあったので使わせて頂く(感謝)。以下、自分の環境用に書き換えたモノ。

/home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh

#!/bin/sh
# www.hogepage.nt - AWStats

# ENV
PERL5LIB=/home/USERNAME/local/lib/perl5:/home/USERNAME/local/lib/perl5/site_perl
HDIR="/home/USERNAME"
AWDIR=${HDIR}"/local/awstats-6.95-jp"
WWWDIR=${HDIR}"/www/awstats"
HOSTNAME="www.hogepage.net"
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 "${WWWDIR}/html/${YEAR}${MONTH}" ];
    then
        /bin/mkdir ${WWWDIR}/html/${YEAR}${MONTH}
    fi

    if [ -f "${HDIR}/log/access_log.utf8" ];
    then
        /bin/rm -f ${HDIR}/log/access_log.utf8
    fi

    # Can't locate awstats_host.plのエラーが発生するので、${AWDIR}/toolsに移動
    cd ${AWDIR}/tools
    # url decode
    ${AWDIR}/tools/utf8_decode.pl < ${HDIR}/log/access_log_${DATE} \
        > ${HDIR}/log/access_log.utf8

    # update
    ${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -config=$HOSTNAME -update

    # static report index
    ${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -config=$HOSTNAME -output -staticlinks \
        -year=${YEAR} \
        -month=${MONTH} > ${WWWDIR}/html/${YEAR}${MONTH}/index.html

    # static report page
    ${AWDIR}/tools/awstats_buildstaticpages.pl \
        -config=$HOSTNAME -lang=jp -year=${YEAR} -month=${MONTH} \
        -awstatsprog=${AWDIR}/wwwroot/cgi-bin/awstats.pl \
        -diricons=/awstats/icon -dir=${WWWDIR}/html/${YEAR}${MONTH}

    # delete logfile
    if [ -f "${HDIR}/log/access_log.utf8" ];
    then
        /bin/rm -f ${HDIR}/log/access_log.utf8
    fi
fi

~/local/awstats-6.95-jp/tools/awstats_host.plの書き換え

$Myhost = "www\.hogepage\.net";

実行してみる。エラーがでなければ成功。

/home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh

/home/USERNAME/www/wordpress/awstats/dataにファイルができていれば成功。

・cronへの登録

% crontab -e
# awstats
30 1 * * *       /home/USERNAME/local/awstats-6.95-jp/awstats_cron.sh > /dev/null

これで毎日01:30にデータが更新される。

コメントをどうぞ