○ visitorsのインストール

・Apacheのaccess_logの解析をします
・visitorsは C言語 で書かれており、軽快に動作します
・visitors-0.7をソースからインストールし、設定します
・"サタケヒサシ"さんの"Yahoo解析&日本語化版"を参考にしています
・charsetをUTF-8に、cssを外部で設定できるように修正しています
・httpdが先に起動している必要があります

・google検索のSSL化により、google検索キーワードが取得できなくなります

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

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

○関連サイト

:visitors-0.7.tar.gz  (http://www.hping.org/visitors/)
:  (ftp://ftp.jp.netbsd.org/pub/pkgsrc/distfiles/)
:visitors.c (https://github.com/hisashisatake/visitors)

○参照ファイル

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

○インストール環境

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

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



○visitors-0.7

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

# cd ~/src
[root@jupiter:~/src]
# tar zxvf visitors-0.7.tar.gz
# chown -R root:root visitors_0.7
# cd visitors_0.7
[root@jupiter:~/src/visitors_0.7]

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

# patch -p1 < ../visitors-YAHOOBINGJP.patch
# patch -p1 < ../visitors-OSBROWSER.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 ~/src
[root@jupiter:~/src]
# tar jcf visitors_0.7-160611.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-YAHOOBINGJP.patch

・"サタケヒサシ"さんの"Yahoo解析&日本語化版"を参考にしています
・yahoo(SSL化されていない)検索キーワードの解析を追加しています
・bing (SSL化されていない)検索キーワードの解析を追加しています
・日本語化はja_JP.UTF-8で行っています(一部オリジナル英文のままです)
・作成されるhtmlファイルのcharsetをUTF-8に設定しています
・動的IPの場合、ホスト名は変わるので、ユーザ名を除いて表示します strstr();
・htmlスタイルは、外部スタイルシートを読み込みます (ファイル名 v-cool.css)

visitors-OSBROWSER.patch

・OSとブラウザの種類を追加しています
・Windows10のブラウザはEdge/12.0になるようです

○ヤフー検索、BING検索のためのvisitorsオプション

--yahoo-keyphrases
・ヤフー検索キーワードを出力
--yahoo-keyphrases-age
・初回訪問時ヤフー検索キーワードを出力
--max-yahoo-keyphrases
・キーワード表示件数
--max-yahoo-keyphrases-age 
・初回訪問時キーワード表示件数
--bing-keyphrases
・BING検索キーワードを出力
--bing-keyphrases-age
・初回訪問時BING検索キーワードを出力
--max-bing-keyphrases
・キーワード表示件数
--max-bing-keyphrases-age 
・初回訪問時キーワード表示件数

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

・apacheの設定は、"HostnameLookups off"なので、ログはIPアドレスで記録されます
・visitorsの実行前に、perlスクリプトでドメイン名に変換します (全てではありません)
・apacheに付属のlogresolveコマンドでも変換できます

:/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

○access_logの修正

・IE11 でユーザエージェント文字列から「MSIE」が消える場合があります
・Trident/7.0からrv:11.0の文字列を見つけたら、いったんその行を削除します
・ユーザエージェント文字列の"rv:"を"MSIE "に変えて追記します
・trendmicroからのウィルスチェックアクセスを除く
・nkfに"--url-input"オプションをつけ、urlデコード(%文字をUTF-8に)します
・日付の順番が入れ替わりますが、解析には問題ないと思う

:/usr/local/bin/v-modify (root root 700)

#!/bin/bash
#
filename=$1
version="Trident\/7.0.*rv:11.0"
#
sed '/\('$version'\)/d' "$filename"> "$filename".new
grep "${version}" "$filename" | sed 's/rv:/MSIE /' >> "$filename".new
#
sed -i -e '/trendmicro.com /d' "$filename".new
#
/usr/bin/nkf -w --url-input "$filename".new > "$filename"

rm -f "$filename".new

v-modify

・実行例

[root@jupiter:~]
# v-modify fqdn_access_log

○apacheのログローテーションの変更

:/etc/logrotate.d/httpd

・CentOS 6のlogrotateはデフォルトで日付を添付するので数字添付に変更します
・nodateextオプションを個別に設定して、dateextオプションを上書きします

/var/log/httpd/*log  {
    nodateext
    missingok
    notifempty
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

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

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

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

#!/bin/bash

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

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
    $MODIFY $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
    $MODIFY $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 -m 100 --yahoo-keyphrases --yahoo-keyphrases-age --bing-keyphrases \
--bing-keyphrases-age $REPODIR/fqdn_access_log > $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 -m 100 --yahoo-keyphrases --bing-keyphrases \
$REPODIR/log_month_grep > $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アドレスをドメイン名に変更します
・ドメイン名に変更したログを修正します (MSIE、trendmicro、URLデコード、etc)
・月曜日に作成した"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

○アクセス制限

・apacheの設定ファイルに下記内容を追加します
・ローカルネットワークからの接続のみ許可します

・httpd(apache) 2.4 の場合

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

<Directory "/home/www/myhome/visitors">
    Options SymLinksifOwnerMatch IncludesNoExec
    AllowOverride None
        Require ip 192.168.0
</Directory>

・httpd(apache) 2.2 の場合

<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-YAHOOBINGJP.patch" を修正してください
・例 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



○参考

・日本語化を除き、修正を加えた部分の差分です

visitors-YAHOOBINGUS.diff

・"サタケヒサシ"さんの"Yahoo解析&日本語化版"を参考にしています
・Yahoo及びBingの検索キーワードを解析し表示します

visitors-HTMLMODIFY.diff

・htmlのcharsetをUTF-8に設定します
・htmlスタイルを、外部スタイルシートで設定します

visitors-HOSTNAME.diff

・ホスト名の先頭から"."を探してそれ以降の文字列を返します

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