○ visitorsのインストール

・Apacheのaccess_logの解析をします
・visitorsは C言語 で書かれており、軽快に動作します
・visitors-0.7をソースからインストールし、設定します
・sfreeサイトさんの日本語パッチを使っています
・cssを外部で設定できるように修正しています
・httpdが先に起動している必要があります

・ファイルの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・ソースを展開したら説明文を読みましょう
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:visitors-0.7.tar.gz (http://www.hping.org/visitors/)
:visitors_0.7-JP2.tar.gz (http://www.sfree.sc/)

○参照ファイル

パッケージの追加
最初の設定 (Xen)
httpd/phpのインストール

○インストール環境

:OS CentOS 5.6
:selinux disabled or permissive
:インストール先  /usr/local/bin/
:作業 /usr/src
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

・メンテナンスの場合は一般ユーザから行います



○visitors-0.7

○ファイルの展開・インストール

・sfreeサイトの日本語化visitorsを使わせていただきます

# cd /usr/src
[root@jupiter:/usr/src]
# tar zxvf visitors_0.7-JP2.tar.gz
# chown -R root:root visitors_0.7
# cd visitors_0.7
[root@jupiter:/usr/src/visitors_0.7]

・パッチを当てます (下記参照)
・パッチファイルは一つ上のディレクトリに置きます

# patch -p1 < ../visitors-SUBCSSJP.patch
# make
# cp visitors /usr/local/bin
# cp visitors.1 /usr/local/man/man1

・必要ならば下記ドキュメントhtmlをコピーします
 doc.html powered-by-visitors.png visitors.css visitors.png

# cd /usr/src
[root@jupiter:/usr/src]
# tar jcf visitors_0.7-JP2-110410.tar.bz2 visitors_0.7/

・必要なディレクトリを作成します

# cd ~
[root@jupiter:~]
# mkdir -p /home/www/myhome/visitors
# chmod 711 /home/www/myhome/visitors
# chown apache:apache /home/www/myhome/visitors

visitors-SUBCSSJP.patch

・外部スタイルシートを読み込みます (ファイル名 v-cool.css)
・動的IPの場合、ホスト名は変わるので、サブドメインまでを表示します

○access_logのIPアドレスをドメイン名にする

・apacheの設定で、"HostnameLookups off"になっており、ログはIPアドレスで記録されます
・visitorsの実行前に、perlスクリプトでドメイン名に変換します (全て変換できるわけではない)

:/usr/local/bin/ip2host (root root 700)

#!/usr/bin/perl
#
# Convert IP to hostname (domain name)
#

while ($ln = <STDIN>){
    if ($ln =~ /^(\d+\.\d+\.\d+\.\d+)/) {
        $ip = $1; $rest = $';
        if ($host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2)) {
            $ln = $host . $rest;
        }
    }
    print $ln;
}
exit;

ip2host

・実行例

[root@jupiter:~]
# ip2host < /var/log/httpd/access_log > access_log_host

○レポートhtml作成スクリプト

:/usr/local/bin/v-repo.sh (root root 700)

・access_log.1 がないとエラーになるので、空のファイルを作成しておいてください
・date の出力は言語が en_US.UTF-8 の場合です、他の場合は date の出力を確認して下さい
・ユーザ・オーナー・パーミッションを変更しています
・chown、chmod は危険なコマンドなので実行権に注意

#!/bin/bash

LOGDIR='/var/log/httpd'
REPODIR='/home/www/myhome/visitors'
IP2HOST='/usr/local/bin/ip2host'
VISITORS='/usr/local/bin/visitors'

WeekDay=$(date +%a)
TopDay=$(date +%d)
YesDate=$(date --date '1 days ago' | awk '{print $3}')
YesMonth=$(date --date '1 days ago' | awk '{print $2}')
YesYear=$(date --date '1 days ago' | awk '{print $6}')
PreYear=$(date --date '1 months ago' | awk '{print $6}')
PreMonth=$(date --date '1 months ago' | awk '{print $2}')
FNameDate=$(date --date '1 months ago' | awk '{print $2 $6}')

if [ "$WeekDay" = Mon ] ; then

    if [ -f $REPODIR/fqdn_access_log.5 ] ; then
        rm -f $REPODIR/fqdn_access_log.5
    fi

    if [ -f $REPODIR/fqdn_access_log.4 ] ; then
        mv $REPODIR/fqdn_access_log.4 $REPODIR/fqdn_access_log.5
    fi

    if [ -f $REPODIR/fqdn_access_log.3 ] ; then
        mv $REPODIR/fqdn_access_log.3 $REPODIR/fqdn_access_log.4
    fi

    if [ -f $REPODIR/fqdn_access_log.2 ] ; then
        mv $REPODIR/fqdn_access_log.2 $REPODIR/fqdn_access_log.3
    fi

    if [ -f $REPODIR/fqdn_access_log.1 ] ; then
        mv $REPODIR/fqdn_access_log.1 $REPODIR/fqdn_access_log.2
    fi

    if [ -f $REPODIR/fqdn_access_log ] ; then
        mv $REPODIR/fqdn_access_log $REPODIR/fqdn_access_log.1
    fi

    grep $YesDate/$YesMonth/$YesYear $LOGDIR/access_log.1 > $REPODIR/log_sun_grep
    cat $REPODIR/log_sun_grep > $REPODIR/access_log_sun
    cat $LOGDIR/access_log >> $REPODIR/access_log_sun
    $IP2HOST < $REPODIR/access_log_sun > $REPODIR/fqdn_access_log

    rm -f $REPODIR/log_sun_grep
    rm -f $REPODIR/access_log_sun

fi

if [ "$WeekDay" != Mon ] ; then

    grep $YesDate/$YesMonth/$YesYear $LOGDIR/access_log > $REPODIR/log_plus_grep
    $IP2HOST < $REPODIR/log_plus_grep > $REPODIR/fqdn_plus_log
    cat $REPODIR/fqdn_plus_log >> $REPODIR/fqdn_access_log

    rm -f $REPODIR/log_plus_grep
    rm -f $REPODIR/fqdn_plus_log

fi

$VISITORS -A -H -m 100 $REPODIR/fqdn_access_log | nkf -w -m0 > $REPODIR/repo-days.html
chown apache:apache $REPODIR/repo-days.html
chmod g-w,o-rw $REPODIR/repo-days.html

if [ "$TopDay" = 01 ] ; then

    cat $REPODIR/fqdn_access_log* > $REPODIR/access_log_month
    grep $PreMonth/$PreYear $REPODIR/access_log_month > $REPODIR/log_month_grep

    $VISITORS -A -H -m 100 $REPODIR/log_month_grep | nkf -w -m0 > $REPODIR/$FNameDate.html
    chown apache:apache $REPODIR/$FNameDate.html
    chmod g-w,o-rw $REPODIR/$FNameDate.html

    rm -f $REPODIR/access_log_month
    rm -f $REPODIR/log_month_grep

fi

exit

v-repo.sh

・dateコマンドの出力から曜日、日、月、年を切り出し選択の要素として使います
・日曜日の4時にapacheがログのローテートをするのでタイムラグが生じます
・月曜日に、日曜日のログの分を取り出して、IPアドレスをドメイン名に変更します
・月曜日以外は、前日のログの分を取り出して、IPアドレスをドメイン名に変更します
・月曜日に作成した"fqdn_access_log"に順次追加して visitorsで出力します
・"fqdn_access_log"は、月曜日にローテート(5周間分)し、新たに作成します
・毎月1日に"fqdn_access_log"(*.1から*.5も含む)から、前月分を取り出します
・visotorsで解析し、(month/year) の名前を付けて出力します
・ホスト名変換 (ip2host) に時間がかかるので、変換を少なくしています

○cronでの定期的実行

・/etc/cron.d に設定ファイルを置きます (ユーザ・グループ・パーミッションに注意)
・MAILTO="" はメールを送信しない設定です (デフォルトは実行者にメールを送信)
・毎日0時1分にroot権限で v-repo.sh を実行します
・行末に改行を入れること

:/etc/cron.d/visitos-repo (root root 644)

MAILTO=""
1 0 * * * root /usr/local/bin/v-repo.sh

○アクセス制限

:httpd-personal.confに下記内容を追加します

・ローカルからの接続のみ許可します

<IfModule alias_module>
    Alias /visitors "/home/www/myhome/visitors"
</IfModule>

<Directory "/home/www/myhome/visitors">
    Options SymLinksifOwnerMatch IncludesNoExec
    AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 192.168.0
</Directory>



○外部スタイルシート

・パッチを当てた場合は、html出力先のディレクトリに作成してください
・名前を変えたい場合はパッチを修正してください
・例 visitorsオリジナルのスタイルです

:v-cool.css

BODY, TD, B, LI, U, DIV, SPAN {
    background-color: #ffffff;
    color: #000000;
    font-family: Verdana, Arial, Helvetica, Sans-Serif;
    font-size: 10px;
}

A {
    color: #0066ff;
    text-decoration: none;
}

A:visited {
    color: #000099;
    text-decoration: none;
}

A:active {
    color: #26a0be;
    text-decoration: none;
}

A:hover {
    color: #ffffff;
    text-decoration: none;
    background-color: #26a0be;
}

.barfill {
    background-color: #96ef94;
    border-left: 1px;
    border-right: 1px;
    border-top: 1px;
    border-bottom: 1px;
    border-color: #4c934a;
    border-style: solid;
    font-size: 10px;
    height: 3px;
    line-height: 4px;
}

.barempty {
    font-size: 10px;
    line-height: 4px;
}

.barleft {
    background-color: #ff9696;
    border-left: 1px;
    border-right: 1px;
    border-top: 1px;
    border-bottom: 1px;
    border-color: #4c934a;
    border-style: solid;
    font-size: 10px;
    height: 3px;
    line-height: 4px;
}

.barright {
    background-color: #f8f8f8;
    border-left: 0px;
    border-right: 1px;
    border-top: 1px;
    border-bottom: 1px;
    border-color: #4c934a;
    border-style: solid;
    font-size: 10px;
    height: 3px;
    line-height: 4px;
}

.title {
    background-color: #007f9e;
    font-size: 12px;
    font-weight: bold;
    padding: 3px;
    color: #ffffff;
}

.reportlink {
    background-color: #ffffff;
    font-size: 12px;
    font-weight: bold;
    color: #000000;
    padding-left: 3px;
}

.subtitle {
    background-color: #007f9e;
    font-size: 12px;
    font-weight: normal;
    padding: 3px;
    color: #ffffff;
}

.info {
    background-color: #badfee;
    font-size: 12px;
    padding-left: 3px;
    padding-right: 3px;
}

.keyentry {
    font-size: 10px;
    padding-left: 2px;
    border-bottom: 1px dashed #bcbcbc;
}

.keyentrywe {
    background-color: #f0f090;
    font-size: 10px;
    padding-left: 2px;
    border-bottom: 1px dashed #bcbcbc;
}

.valueentry {
    font-size: 10px;
    padding-left: 2px;
    color: #905d14;
    border-bottom: 1px dashed #f6c074;
}

.credits {
    font-size: 12px;
    font-weight: bold;
}

.maintable {
    border-style: solid;
    border-color: #0b4b5b;
    border-width: 1px;
}

v-cool.css

○ Copyright(c) 528p.com All Rights Reserved.