Ranvis Script

Ranvis Script > Linux > AWFFull

AWFFullとは

AWFFullはApacheのログ解析・統計生成ツール。

同種のツールではWebalizerが有名で、その機能強化版という位置づけ。

SRPMからRPMを作る

AWFFullはRPMがいくつか作られているが、たまたま最新版がjavier氏のサイトのi386向けしかなかったため、SRPMから作ってみることにした。

rpmbuildとawffull関連パッケージの準備

# yum install -y rpm-build rpm-libs
# yum install -y db4-devel gd-devel libpng-devel pcre-devel zlib-devel

AWFFullはGeoIPを使った国情報の解析に対応しているので、それもインストールする。

RHEL等のyumでインストールできるGeoIPではなく、小文字のgeoipでないとrpmが認識してくれない。今回は素直にgeoipを使ったが、後述する.specファイルの修正時に大文字にしてしまえば動作するかもしれない。

# rpm -ivh geoip-devel-1.4.0-1.el4.rf.x86_64.rpm geoip-1.4.0-1.el4.rf.x86_64.rpm
    or
# yum install -y GeoIP-devel GeoIP-data

以降は一般ユーザー権限で行う。

# su - USER
$ mkdir -p ~/rpm/{BUILD,RPMS,SRPMS}
$ echo "%_topdir $HOME/rpm" > ~/.rpmmacros

RPMのビルド

SRPMからそのままRPMを作りたいところだが.specファイルに多少問題があり、ビルドできなかったり、インストールされるファイルが希望のものではなかったりした。

そこでDebian testingのものを参考に修正を加え、SRPMを作り直すことにした。ちなみにDebian testing側だけでも同様だった。

$ rpm -ivh awffull-3.8.2-1.src.rpm
[rpm/SPECS/awffull.spec]
 %install
 %{__rm} -rf %{buildroot}
 %makeinstall
+%find_lang %{name}

 %clean
 %{__rm} -rf %{buildroot}

-%files
+%files -f %{name}.lang
 %defattr(-, root, root, 0755)
 %doc ChangeLog COPYING INSTALL README README.FIRST README.webalizer TODO DNS.README PERFORMANCE_TIPS.txt sample.conf

Webalizerのhistoryを引き継ぐ場合はperlスクリプトもコピーさせる。

+%doc contrib/awffull_history_regen.pl

修正したらSRPMを作り直す。

$ rpmbuild -bs rpm/SPECS/awffull.spec

最後にSRPMからRPMを作る。

$ rpmbuild --rebuild rpm/SRPMS/awffull-3.8.2-1.src.rpm

インストールする

前節でビルドしたrpmをインストールする。

# rpm -ivh ~USER/rpm/RPMS/x86_64/awffull-3.8.2-1.x86_64.rpm

設定ファイルを作成する

設定のサンプルがあるのでそれを元にする。また、GeoIPのインストール場所を調べる。

# cp /usr/share/doc/awffull-3.8.2/sample.conf /etc/awffull.conf
# whereis GeoIP
GeoIP: /etc/GeoIP.conf /usr/include/GeoIP.h /usr/share/GeoIP
# ls /usr/share/GeoIP
GeoIP.dat  GeoLiteCity.dat

必要な設定を追加する。ちなみに試しにコマンドラインから実行し出力を確認するため、Quiet命令は追加しない。

[/etc/awffull.conf]
LogType combined
Incremental yes
PageType php
FoldSeqErr yes
GeoIP yes
GeoIPDatabase /usr/share/GeoIP/GeoIP.dat
FlagsLocation /usage/flags
# mkdir /var/www/usage
# ln -s /usr/share/doc/awffull-3.8.2/flags /var/www/usage/

試運転

# awffull -n example.com -o /var/www/usage/ < /var/log/httpd/access_log

usage以下に解析結果が作成されればOK。

Webalizerのhistoryを移行

Webalizer 2.01のhistoryファイルを変換するスクリプトが用意されている。

# /usr/share/doc/awffull-3.8.2/awffull_history_regen.pl --dir /var/www/usage > /var/www/usage/awffull.hist

また自動実行スクリプトを書いていた場合は退避しておく。

運用

Webに公開

VirtualHostを使っていたため、メインのVirtualHost内に設定を記述した。

[/etc/httpd/conf.d/httpd.conf]
 NameVirtualHost *
 <VirtualHost *>
 ServerAdmin webmaster@example.com
 DocumentRoot /var/www/html
 ServerName example.com
+Alias /usage /var/www/usage
+<Location /usage>
+	order allow,deny
+	allow from localhost
+</Location>
 </VirtualHost>

自動実行の設定

メインのホストのログファイル名をaccess_logとし、後はVirtualHost毎にFQDN-access_logにログを保存しているため、メインの解析結果は/var/www/usage/、それ以外は/var/www/usage/FQDN/に保存させてみる。

[/etc/cron.daily/00awffull]
#!/bin/bash

if [ -e /var/log/httpd/access_log ]; then
    /usr/bin/awffull -qn example.com -o /var/www/usage < /var/log/httpd/access_log
fi

for log in /var/log/httpd/*-access_log; do
    host=${log##*/}
    host=${host%-access_log}
    if [ ! -d /var/www/usage/$host ]; then
        mkdir /var/www/usage/$host
    fi
    /usr/bin/awffull -qn $host -o /var/www/usage/$host < $log
done

exit 0

ちなみにport 80以外は想定していない。