15:Apacheアクセスログ解析(AWStats)とリファラースパム防止の設定
Date 2012-9-6 17:26:00 | Topic: CentOS 6.3(6.4)に挑戦
| http://www.starplatinum.jp/awstats/awstats70/を参考にしました。このページの "AWStats Ver.7.0完全日本語版のダウンロード” からダウンロードし、解凍をしておきます。(/Download/awstats/AWStats70_Jpn に解凍) 私はvirtualhostで数個のWEBを動かすつもりなのでプログラム(.pl)は共通に出来るが、設定ファイルは独立していなければならない。と言う事で data DIRは /webdata/awstats/URLごとのDIR/ に置く プログラム(cgi-bin, .pl)は /webdata/cgi/awstatsに置く。設定ファイルは /etc/awstats/awstats.www,kinryokai.net.conf とする cgi-bin関係のファイルをコピーしrenameする。 # cp -pr /Download/awstats/AWStats70_Jpn/wwwroot/cgi-bin/ /webdata/cgi/ # mv /webdata/cgi/cgi-bin/ /webdata/cgi/awstats icon関連をコピーしますが、私はデフォルト(/var/www/icons)では無く /webdata/icons にしていますので # cp -pr /Download/awstats/AWStats70_Jpn/wwwroot/icon/ /webdata/icons/ 後で、必要になるファイルを/usr/share/perl5にコピー # cp /Download/awstats/AWStats70_Jpn/tools/awstats_updateall.pl /usr/share/perl5/ # cp /Download/awstats/AWStats70_Jpn/tools/awstats_buildstaticpages.pl /usr/share/perl5/ awstatsを動かすにはCustomlog をcombined にしなくてはならないが、前の /etc/httpd/conf.d/virtualhost.confの設定で CustomLog logs/kinryokai_access_log combined env=!no_log にしているので問題ない。 /etc/awstats/awstats.www,kinryokai.net.conf の設定をしますがサンプルがありますのでそれを変更します。 # mkdir /etc/awstats # mv /webdata/cgi/awstats/awstats.model_jp.conf /etc/awstats/awstats.www,kinryokai.net.conf wwwの次は本当は . でカンマでない(XOOPSが勝手にリンクを張る為)この後も同じでwww.と解釈してください。 同じ場所にある awstats.model.confは使いませんので削除しておきます。 # gedit /etc/awstats/awstats.www,kinryokai.net.conf
LogFile="/var/log/httpd/kinryokai_access_log"
SiteDomain="www,kinryokai.net"
HostAliases="localhost 127.0.0.1 REGEX[kinryokai\.net$]"
DirData="/webdata/awstats/URLごとのDIR"
DirCgi="/awstats"
DirIcons="/icon"
上記は変更した部分のみ書き出してあります。 次に jcode.pm をインストールしますが、 http://blog.96q.org/2008/04/21/jcodepm-install/を参考にインストールしますが、 # perl -MCPAN -e shell としたら、エラーが出た。そういえば cpan2rpm をインストールしていなかった。なので http://centocsrv.comをみてcpan2rpmをインストールする。途中で # cpan2rpm --install URI::Find としたら、エラーが出た。 * A newer version of this program is now available. To upgrade * enter the following command: /usr/bin/cpan2rpm --upgrade RPM user environment - Your account does not have permissions to the requisite RPM directory structure. Try 'cpan2rpm --mk-rpm-dirs=~/rpm' to setup your environment for non-root package building. Failing dirs: /root/rpmbuild/SRPMS /root/rpmbuild/BUILD /root/rpmbuild/SOURCES /root/rpmbuild/SPECS /root/rpmbuild/RPMS 色々googleで調べるとJcoeは yum でインストール出きることが分かったので、上のエラーは別の機会にやるとして、肝心のjcode.pmをインストールする # yum -y install perl-Jcode で、/usr/share/perl5/Jcode.pm にインストールされた。 と、ここで困ったことになった。と言うのは私はプログラムはvirtualhost全部で同じプログラム(perl)を使おうとしているが、上記WEBによると、utf8_decode.plの中にホスト名前を設定する所がある。そうするとプログラムが共通にならない。 utf8_decode.plをハックして、ホスト分のチェックをするようにしてもいいが(実は私はperlをあまり理解していないので大変そう)、この数年のWEBのログを見てみると(完全に見た訳ではないが)全角で記録されている部分が見あたらなった。このutf8_decode.plと言うものは(多分)ログに全角がある時に使うと思うので、私はこの変換をしないことにした。 と言う事はawstatsだけならcpan2rpmとJcode.pmはインストールしなくてもよかったが、わざわざ消すこともないのでそのままにする。/etc/awstats/にあるconfファイルはvirtualhost分用意をするので、プログラムは共通化出来る。 なので、http://www.starplatinum.jp/awstats/awstats70/の3、4、5はやらない。 今はテストでapacheを動かしているので、ログは無いに等しいので、現在アクティブなWEBからログをコピーする。 ここはNFSでお互い参照出来る様にする。(NFSの設定はここのCentOS 6.3に挑戦 : 16:NFSを設定する。を参照) ログはNFSの設定で /Download/NfsDir にコピーしたので、これを本来の場所である /var/log/httpd に移し、(この時、ついでにアクティブなWEBのawstatsのデーターも(*.www,kinryokai.net.*)も/webdata/awstats/URLごとのDIRに移して置いた) AWStatsデータベース初期作成スクリプトを作ります。/root/awstatsinit.sh として下記を記入します。
#!/bin/sh
logfile=`grep ^LogFile /etc/awstats/awstats.$1.conf|sed -e 's/LogFile="\([^ ]*\)"/\1/p' -e d`
# ↑ ログのパスを抽出
for log in `ls $logfile*|sort -r`
do
/webdata/cgi/awstats/awstats.pl -config=$1 -update -logfile=$log
done
/webdata/cgi/awstats/awstats.pl は私の場合、各自の環境に合わせて下さい。 # sh awstatsinit.sh www,kinryokai.net で更新処理をしますが、ログの量によっては時間がかかります。終わると Create/Update database for config "/etc/awstats/awstats.www,kinryokai.net.conf" by AWStats version 7.0 (build 1.971) From data in log file "/var/log/httpd/kinryokai_access_log"... Phase 1 : First bypass old records, searching new record... Direct access to last remembered record is out of file. So searching it from beginning of log file... Jumped lines in file: 0 Parsed lines in file: 20371 Found 0 dropped records, Found 0 comments, Found 0 blank records, Found 1 corrupted records, Found 20370 old records, Found 0 new qualified records. と表示された。(最後のみ取り出し、この繰り返しがlogの個数分続く) /etc/httpd/conf.d/awstats.confに
Alias /icon/ /webdata/icons/
ScriptAlias /awstats/ /webdata/cgi/awstats/
<Directory /webdata/cgi/awstats/>
DirectoryIndex awstats.pl
Options ExecCGI
order deny,allow
deny from all
allow from all
#allow from 192.168
</Directory>
と記入し、httpd を再起動して設定ファイルを読み込ませる。この設定はすべてのホストから見れてしまう設定になっています。 テストをしたいが、www,kinryokai.net としてもアクティブなWEBを参照し、このテストのWEBには来ないので、dnsmasq がこのサブホストの親で走っているので、それを一時的に変更する。親ホストに移って /etc/hosts の "192.168.xxx.xxx www,kinryokai.net www" のIPをこのテスト用のサブホストのIPに変更し、dnsmasq を再起動してから、ブラウザで www,kinryokai.net/awstats/awstats.pl にアクセスすると表示される筈. ここからはまだ確認が終わっておりませんので、間違えがあるかも httdのログの内容をawstatsに反映させてからロテイトするように、/etc/logrotate.d/httpd を
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
prerotate ←ここから
`/usr/share/perl5/awstats_updateall\.pl` now -confdir="/etc/awstats" \
-awstatsprog="/webdata/cgi/awstats/awstats\.pl >/dev/null
endscript ←ここまで追記
#delaycompress ←圧縮はしないのでコメントアウト
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
1時間毎にawstatsを更新する為に /etc/cron.hourly/awstats を作成
/usr/share/perl5/awstats_updateall.pl now -confdir="/etc" \
awstatsprog="/webdata/cgi/awstats/awstats.pl" >/dev/null
perlプログラムへのパスは各自の環境に合わせて下さい。 静的なHTMLのデータの作成 まずは/etc/httpd/conf.d/virtualhost.conf の </VirtualHost>の前に下記を追加します。
Alias /awreport /webdata/awreport/kinryo
<Directory /webdata/cgi/awstats/>
DirectoryIndex awstats.pl
Options ExecCGI
order deny,allow
deny from all
allow from all
#allow from 192.168
</Directory>
1日1回データーを作ります。そのスクリプトは(注:2013/2/21訂正)
#!/bin/sh
site=$1
DirReport=$2
reportbuild() {
# AWStatsデータベース更新中断時ロックファイル残存対処(ここから)
if [ -f /tmp/awstats.$site.lock ]; then
ps -p `cat /tmp/awstats.$site.lock |awk '{print $6}'`
if [ $? -ne 0 ]; then
echo /tmp/awstats.$site.lock removed >&2
rm -f /tmp/awstats.$site.lock
fi
fi
# AWStatsデータベース更新中断時ロックファイル残存対処(ここまで)
/usr/share/perl5/awstats_buildstaticpages.pl \
-awstatsprog=/webdata/cgi/awstats/awstats.pl\
-config=$site -update -lang=jp -dir=$DirReport \
-year=$YEAR -month=$MONTH -builddate=$YEAR$MONTH
# 個別ページリンク切れ対処(ここから)
sed -i "s/href=\"${site}/href=\"awstats.${site}/g" \
$DirReport/$YEAR$MONTH.html
# 個別ページリンク切れ対処(ここまで)
if [ "$YEAR$MONTH" = $(date +%Y%m) ]; then
mv $DirReport/awstats.$site.$YEAR$MONTH.html $DirReport/index.html
else
mv $DirReport/awstats.$site.$YEAR$MONTH.html $DirReport/$YEAR$MONTH.html
fi
}
ls $DirReport/* > /dev/null 2>&1
if [ $? -eq 0 ]; then
YEAR=`date --date '1 days ago' +%Y`
MONTH=`date --date '1 days ago' +%m`
for site in `ls -l /etc/awstats |grep -v ~$|cut -d' ' -f 11|sed -e '/^$/d'|cut -d . -f 2-4`
# ↑ 全virtual host名を抽出する
do
DirReport=/webdata/awreport/`echo $site|cut -d . -f 2`
reportbuild
done
else
DirAwstats=`grep ^DirData /etc/awstats/awstats.$site.conf|awk -F= '{print $2}'|tr -d \"`
# ↑ awstatsのデーターがあるdirectoryを抽出
for log in `ls $DirAwstats/awstats*.$site.txt`
do
YEAR=`echo $log|cut -d / -f 6|cut -d . -f 1|sed -e 's/awstats..\([^ ]*\)/\1/p' -e d`
MONTH=`echo $log|cut -d / -f 6|cut -d . -f 1|sed -e 's/awstats\([^ ]*\)..../\1/p' -e d`
reportbuild
done
fi
私の環境はvrtualhostが5個も走っているので、色々参考に考えましたが、まだ検証していないので、このスクリプトはまったく自信がありません。多分数ヶ所間違えていると思います。検証をしたら、この一文を取ります。 これをawstatsreport.shとして/rootにしまい、パーミッションを変更し、毎日零時にHTML作成スクリプトを走らせます。 # chmod 700 awstatsreport.sh # echo "00 00 * * * root /root/awstatsreport.sh > /dev/null" > /etc/cron.d/awstatsreport その後、http://centossrv.com/referer_spam.shtmlを参考にリファラースパムの防止設定をして置きます。 但し、私はvirtual hostで数個のwebがありますので、スクリプトを変更してあります。 refererlogdel.shの最後は restart ではなく graceful にしました。 awstatslogchk.sh は
#!/bin/bash
if [ $# -eq 0 ]; then
for site in `ls -l /etc/awstats |grep -v ~$|cut -d' ' -f 11|sed -e '/^$/d'|cut -d . -f 2-4|cut -d . -f 2`
# ↑ 全virtual host名を抽出する
do
log=/webdata/awstats/`echo $site`/awstats*.txt
done
else
# 引数に月年(例:032013)を与えた時
log=/webdata/awstats/`echo $site`/awstats${1}*.txt
fi
for host in `cat /etc/httpd/conf.d/referer_spam.conf|awk '{print $3}'|sed -e 's/^(.*)\([^ ]*\)/\1/p' -e d`
# ↑ referer_spamのリストを抽出
do
grep "$host" $log > /dev/null
if [ $? -eq 0 ]; then
echo "$host delete"
sed -i "/$host/d" $log
fi
done
また、awstatsreport.sh を走らす時は # /root/awstatsreport.sh www.kinryokai.net /webdata/awreport (この文中にあるwww, は本当は www. (XOOPSが勝手にリンクを張るのを防止する為)
|
|