トップ  > サーバ設定:運用  > 各アプリケーションのインストール  > Apacheアクセスログ解析(AWStats)

Apacheアクセスログ解析(AWStats)  (最終更新日:2012/10/27)

AWStatsを利用してApacheのアクセスログを解析し、Webサイトへのアクセス統計をWebブラウザから参照出来るようにします。

AWStatsインストール

RPMforge+EPELリポジトリが導入されいない場合こちらを参照してインストールします。

[root@sv ~]# yum install awstats ← AWStatsインストール

AWStats初期設定

1.設定
[root@sv ~]# rm -f /etc/awstats/awstats.localhost.localdomain.conf ← 不要な設定ファイルを削除

[root@sv ~]# rm -f /etc/awstats/awstats.`hostname`.conf ← 不要な設定ファイルを削除
このファイルは「cron」で自動実行される、AWStatsデータベース更新処理の対象となり無駄な処理が発生してしまうので削除します。

[root@sv ~]# cp /etc/awstats/awstats.model.conf /etc/awstats/awstats.www.rx-93dff.net.conf ← 設定ファイルをサンプルよりコピー

[root@sv ~]# vi /etc/awstats/awstats.www.rx-93dff.net.conf ← 設定ファイル編集

# "SiteDomain" must contain the main domain name, or the main intranet web
# server name, used to reach the web site.
# If you share the same log file for several virtual web servers, this
# parameter is used to tell AWStats to filter record that contains records for
# this virtual host name only (So check that this virtual hostname can be
# found in your log file and use a personalized log format that include the
# %virtualname tag).
# But for multi hosting a better solution is to have one log file for each
# virtual web server. In this case, this parameter is only used to generate
# full URL's links when ShowLinksOnUrl option is set to 1.
# If analyzing mail log, enter here the domain name of mail server.
# Example: "myintranetserver"
# Example: "www.domain.com"
# Example: "ftp.domain.com"
# Example: "domain.com"
#
SiteDomain="localhost.localdomain"
↓
SiteDomain="www.rx-93dff.net" ← Webサーバ名に変更

# Enter here all other possible domain names, addresses or virtual host
# aliases someone can use to access your site. Try to keep only the minimum
# number of possible names/addresses to have the best performances.
# You can repeat the "SiteDomain" value in this list.
# This parameter is used to analyze referer field in log file and to help
# AWStats to know if a referer URL is a local URL of same site or an URL of
# another site.
# Note: Use space between each value.
# Note: You can use regular expression values writing value with REGEX[value].
# Note: You can also use @/mypath/myfile if list of aliases are in a file.
# Example: "www.myserver.com localhost 127.0.0.1 REGEX[mydomain\.(net|org)$]"
#
HostAliases="localhost 127.0.0.1"
↓
HostAliases="localhost 127.0.0.1 REGEX[^192\.168\.0\.]" ← 内部からのアクセスを除外

# If you want to have hosts reported by name instead of ip address, AWStats
# need to make reverse DNS lookups (if not already done in your log file).
# With DNSLookup to 0, all hosts will be reported by their IP addresses and
# not by the full hostname of visitors (except if names are already available
# in log file).
# If you want/need to set DNSLookup to 1, don't forget that this will reduce
# dramatically AWStats update process speed. Do not use on large web sites.
# Note: Reverse DNS lookup is done on IPv4 only (Enable ipv6 plugin for IPv6).
# Note: Result of DNS Lookup can be used to build the Country report. However
# it is highly recommanded to enable the plugin 'geoip' or 'geoipfree' to
# have an accurate Country report with no need of DNS Lookup.
# Possible values:
# 0 - No DNS Lookup
# 1 - DNS Lookup is fully enabled
# 2 - DNS Lookup is made only from static DNS cache file (if it exists)
# Default: 2
# 
DNSLookup=2
↓
DNSLookup=1 ← アクセス元の名前解決をする(アクセス元をホスト名で表示するようにする)

# Use SkipFiles to ignore access to URLs that match one of following entries.
# You can enter a list of not important URLs (like framed menus, hidden pages,
# etc...) to exclude them from statistics. You must enter here exact relative
# URL as found in log file, or a matching REGEX value. Check apply on URL with
# all its query paramaters.
# For example, to ignore /badpage.php, just add "/badpage.php". To ignore all
# pages in a particular directory, add "REGEX[^\/directorytoexclude]".
# The opposite parameter of "SkipFiles" is "OnlyFiles".
# Note: Use space between each value. This parameter is or not case sensitive
# depending on URLNotCaseSensitive parameter.
# Note: You can use regular expression values writing value with REGEX[value].
# Change : Effective for new updates only
# Example: "/badpage.php /page.php?param=x REGEX[^\/excludedirectory]"
# Default: ""
#
SkipFiles=""
↓
SkipFiles="REGEX[^\/wp-admin]" ← Wordpressの管理へのアクセスは除外

# Show authenticated users chart
# Context: Web, Streaming, Ftp
# Default: 0, Possible column codes: PHBL
ShowAuthenticatedUsers=0
↓
ShowAuthenticatedUsers=PHBL ← 認証ユーザを表示する

# PLUGIN: GeoIPfree
# REQUIRED MODULES: Geo::IPfree version 0.2+ (from Graciliano M.P.)
# PARAMETERS: None
# DESCRIPTION: Country chart is built from an Internet IP-Country database.
# This plugin is useless for intranet only log files.
# Note: You must choose between using this plugin (need Perl Geo::IPfree
# module, database is free but not up to date) or the GeoIP plugin (need
# Perl Geo::IP module from Maxmind, database is also free and up to date).
# Note: Activestate provide a corrupted version of Geo::IPfree 0.2 Perl
# module, so install it from elsewhere (from www.cpan.org for example).
# This plugin reduces AWStats speed by up to 10% !
#
#LoadPlugin="geoipfree"
↓
LoadPlugin="geoipfree" ← アクセス元国情報を詳細に取得する

[root@sv ~]# yum install perl-Geo-IPfree ← GeoIPfreeプラグインの動作に必要なPerlモジュールをインストール
2.日本の検索エンジンへの対応

日本の検索エンジンが検索エンジンとして集計されるようにします。

[root@sv ~]# vi /usr/share/awstats/lib/search_engines.pm ← search_engines.pm編集
@SearchEnginesSearchIDOrder_list1=(
以下を追加
# Japanese Search Engines
'google\.co\.jp',
'66\.249\.(89\.99|93\.104)',
'66\.102\.(7\.99|7\.104|9\.104|11\.104)',
'64\.233\.(161\.104|179\.104|167\.104|183\.104|187\.104)',
'72\.14\.(203|205|207|209|221|235|253)\.104',
'216\.239\.(37\.104|39\.104|41\.104|51\.104|57\.104|59\.104)',
'search\.biglobe\.ne\.jp',
'goo\.ne\.jp',
'nifty\.com',
'search\.msn\.co\.jp',
'search\.odn\.ne\.jp',
'excite\.ne\.jp',
'naver\.co\.jp',
'fresheye\.com',
'tocc\.co\.jp',
'infoseek\.co\.jp',
'cache\.yahoofs\.jp',
'search\.livedoor\.com',
'www\.ceek\.jp',
'www\.bing\.com',
's\.luna\.tv',
'72\.14\.207\.99',
'209\.85\.165\.104',
'209\.85\.129\.104',
'209\.85\.129\.132',
'209\.85\.(173|175)\.104',
'74\.125\.47\.132',
'74\.125\.77\.132',
'74\.125\.95\.132',
'74\.125\.153\.132',
'74\.125\.155\.132',
'72\.14\.235\.132',
'66\.249\.89\.104',

%NotSearchEnginesKeys=(
以下を追加
# For Japanese Search Engines
'infoseek\.co\.jp'=>'at\.infoseek\.co\.jp',
'goo\.ne\.jp'=>'members\.goo\.ne\.jp',

%SearchEnginesHashID = (
以下を追加
# Japanese Search Engines
'google\.co\.jp','googlejapan',
'66\.249\.(89\.99|93\.104)','googlejapan',
'66\.102\.(7\.99|7\.104|9\.104|11\.104)','googlejapan',
'64\.233\.(161\.104|179\.104|167\.104|183\.104|187\.104)','googlejapan',
'72\.14\.(203|205|207|209|221|235|253)\.104','googlejapan',
'216\.239\.(37\.104|39\.104|41\.104|51\.104|57\.104|59\.104)','googlejapan',
'search\.biglobe\.ne\.jp','biglobe',
'goo\.ne\.jp','goo',
'nifty\.com','nifty',
'search\.msn\.co\.jp','msnjapan',
'search\.odn\.ne\.jp','odn',
'excite\.co\.jp','excitejapan',
'naver\.co\.jp','naver',
'fresheye\.com','fresheye',
'tocc\.co\.jp','tocc',
'infoseek\.co\.jp','infoseek',
'cache\.yahoofs\.jp','yahoocache',
'search\.livedoor\.com','livedoor',
'www\.ceek\.jp','ceek',
'www\.bing\.com','bing',
's\.luna\.tv','lunascape',
'72\.14\.207\.99','googlejapan',
'209\.85\.165\.104','googlejapan',
'209\.85\.129\.104','googlejapan',
'209\.85\.129\.132','googlejapan',
'209\.85\.(173|175)\.104','googlejapan',
'74\.125\.47\.132','googlejapan',
'74\.125\.77\.132','googlejapan',
'74\.125\.95\.132','googlejapan',
'74\.125\.153\.132','googlejapan',
'74\.125\.155\.132','googlejapan',
'72\.14\.235\.132','googlejapan',
'66\.249\.89\.104','googlejapan',

%SearchEnginesKnownUrl=(
以下を追加
# Japanese Search Engines
'googlejapan','(p|q)=',
'biglobe','q=',
'goo','MT=',
'nifty','Text=',
'msnjapan','(q|MT)=',
'odn','Querystring=',
'excitejapan','search=',
'naver','query=',
'fresheye','kw=',
'tocc','QRY=',
'infoseek','qt=',
'yahoocache','w=',
'livedoor','q=',
'ceek','q=',
'clusty','query=',

@WordsToCleanSearchUrl= ('act=','annuaire=','btng=','cat=','categoria=','cfg=','cof=','cou=','count=','cp=','dd=','domain=','dt=','dw=','enc=','exec=','geo=','hc=','height=','hits=','hl=','hq=','hs=','id=','kl=','lang=','loc=','lr=','matchmode=','medor=','message=','meta=','mode=','order=','page=','par=','pays=','pg=','pos=','prg=','qc=','refer=','sa=','safe=','sc=','sort=','src=','start=','style=','stype=','sum=','tag=','temp=','theme=','type=','url=','user=','width=','what=','\\.x=','\\.y=','y=','look=');
↓
@WordsToCleanSearchUrl= ('act=','annuaire=','btng=','cat=','categoria=','cfg=','cof=','cou=','count=','cp=','dd=','domain=','dt=','dw=','enc=','exec=','geo=','hc=','height=','hits=','hl=','hq=','hs=','id=','kl=','lang=','loc=','lr=','matchmode=','medor=','message=','meta=','mode=','order=','page=','par=','pays=','pg=','pos=','prg=','qc=','refer=','sa=','safe=','sc=','sort=','src=','start=','style=','stype=','sum=','tag=','temp=','theme=','type=','url=','user=','width=','what=','\\.x=','\\.y=','y=','look=','target=','collection=','showSummary=','perPage=','next=','DB=','OPE=','Max=','base=','submit=','SearchType=','SESSIONID=','QUERYRULE=','DISPLAYMIN=','RELURLSWITCH=','SORT=','start=','direct=','relwd=','lk=','svx=','nh=','internet=','DC=','submit0=','DEST=','where=','CCM=','NRS=','UNI=','UD0=','FRS=','sv=','rf=','oq=','col=','act\.search=');
 ← 変更

%SearchEnginesHashLib=(
以下を追加
# Japanese Search Engines
'googlejapan','Google Japan',
'biglobe','Biglobe',
'goo','Goo',
'nifty','Nifty',
'msnjapan','MSN Japan',
'odn','ODN',
'excitejapan','Excite Japan',
'naver','Naver',
'fresheye','Fresheye',
'tocc','TOCC/Search',
'infoseek','Infoseek',
'yahoocache','Yahoo Cache',
'livedoor','Livedoor',
'ceek','CEEK.JP',
'bing','Bing',
'lunascape','Lunascape',
3.携帯電話対応

日本の携帯電話からのアクセスをキャリア別に表示できるようにします。

[root@sv ~]# vi /usr/share/awstats/lib/browsers_phone.pm ← browsers_phone.pm編集
@BrowsersSearchIDOrder = (
以下を追加
# Japanese mobile phone
'docomo',
'vodafone',
'j\-phone',
'emobile',
'softbank',
'kddi',

%BrowsersHashIDLib = (
以下を追加
# Japanese mobile phone
'docomo','DoCoMo',
'vodafone','SoftBank(Vodafone)',
'j\-phone','SoftBank(J-Phone)',
'emobile','eMobile',
'softbank','SoftBank',
'kddi','au by KDDI',
4.日本語環境設定

デフォルトではレポートの日付形式が「月 8月 2011」となってしまうので、「2011年 8月」と表示されるように変更します。

[root@sv ~]# vi /usr/share/awstats/wwwroot/cgi-bin/awstats.pl ← スクリプトファイル編集
"<input type=\"submit\" value=\" $Message[115] \" class=\"aws_button\" /&gt";
		}
		else {
			print "<span style=\"font-size: 14px;\">";
			if ($DayRequired) { print "$Message[4] $DayRequired - "; }
			if ( $MonthRequired eq 'all' ) {
				print "$Message[6] $YearRequired";
			}
			else {
				print
				  #"$Message[5] $MonthNumLib{$MonthRequired} $YearRequired"; ← #を追加してコメントアウト
				  "$YearRequired$Message[6] ".$MonthNumLib{$MonthRequired}; ← 追加(表示形式をYYYY年 MM月に変更)

"<td class=\"aws\"><b>$Message[133]</b></td><td class=\"aws\" colspan=\""
	  . ( $colspan - 1 ) . "\">\n";
	print( $MonthRequired eq 'all'
		? "$Message[6] $YearRequired"
		#: "$Message[5] " ← #を追加してコメントアウト
		  #. $MonthNumLib{$MonthRequired} ← #を追加してコメントアウト
		  #. " $YearRequired" ← #を追加してコメントアウト
		: "$YearRequired$Message[6] $MonthNumLib{$MonthRequired}" ← 追加(表示形式をYYYY年 MM月に変更)

			#print "$MonthNumLib{$monthix}<br />$YearRequired"; ← #を追加してコメントアウト
			print "$YearRequired$Message[6]<br />$MonthNumLib{$monthix}"; ← 追加(表示形式をYYYY年 MM月に変更)

			#print "$MonthNumLib{$monthix} $YearRequired"; ← #を追加してコメントアウト
			print "$YearRequired$Message[6] $MonthNumLib{$monthix}"; ← 追加(表示形式をYYYY年 MM月に変更)
5.Apache設定

初期設定ではサーバのみしかアクセスできない為設定を変更します。

[root@sv ~]# vi /etc/httpd/conf.d/awstats.conf ← AWStats用Apache設定ファイル編集
<Directory "/usr/share/awstats/wwwroot">
    Options None
    AllowOverride None
    Order allow,deny
    allow from All ← 追加(全てのアクセスを許可)
    #allow from 127.0.0.1 ← コメントアウト
</Directory>

[root@sv ~]# /etc/rc.d/init.d/httpd reload ← Apache設定反映
httpd を再読み込み中:                                      [  OK  ]

AWStatsデータベース作成

1.AWStatsデータベース初期作成

Apacheのログファイルを過去分も含めて全てデータベースに取り込む

アクセスログが何も無い場合、作成時エラーになるので注意(携帯電話等からとりあえずアクセスしておく)

[root@sv ~]# vi awstatsinit.sh ← AWStatsデータベース初期作成スクリプト作成
ここから----------
#!/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
    `rpm -ql awstats|grep "awstats\.pl"` \
    -config=$1 -update -logfile=$log
done
----------ここまで

[root@sv ~]# sh awstatsinit.sh www.rx-93dff.net ← AWStatsデータベース初期作成スクリプト実行
Create/Update database for config "/etc/awstats/awstats.www.rx-93dff.net.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/var/log/httpd/access_log"...
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
Phase 2 : Now process new records (Flush history on disk after 20000 hosts)...
Jumped lines in file: 0
Parsed lines in file: 3
 Found 0 dropped records,
 Found 0 comments,
 Found 0 blank records,
 Found 0 corrupted records,
 Found 0 old records,
 Found 3 new qualified records.
[root@sv ~]# rm -f awstatsinit.sh ← AWStatsデータベース初期作成スクリプト削除
これ以降は「cron」により1時間毎にデータベース更新が行われる。
2.Apacheログローテーション設定

Apacheログファイル切り替え時、AWStatsのデータベースに取り込んでから切り替えを行うようにする。

[root@sv ~]# vi /etc/logrotate.d/httpd ← Apacheログロテート設定ファイル編集
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    prerotate
        `rpm -ql awstats|grep "awstats_updateall\.pl"` now -confdir="/etc/awstats" \
        -awstatsprog="`rpm -ql awstats|grep "awstats\.pl"`" >/dev/null
    endscript ← 追加
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

AWStats動作確認

http://サーバ名/awstats/awstats.plへアクセスし、アクセス統計ページが表示されることを確認。

アクセス統計ページHTML版の作成

awstats.plは、都度アクセス統計ページを作成するため、負荷がかかることからawstats.plはアクセスを制限する。又、万が一データベースが破損等した場合、統計が見れなくなるのでHTML版を作成するようにする。

1.アクセス統計ページHTML版格納ディレクトリ設定
[root@sv ~]# mkdir /var/www/awstatsreport ← HTML版格納ディレクトリ作成

[root@sv ~]# vi /etc/httpd/conf.d/awstatsreport.conf ← HTML版格納ディレクトリアクセス設定ファイル作成
ここから----------
Alias /awstatsreport "/var/www/awstatsreport"
外部に公開しない場合は以下を追加
<Location "/awstatsreport">
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from 192.168.0.0/24 ← 内部ネットワークアドレスを指定
</Location>
----------ここまで
2.awstats.plアクセス制限
[root@sv ~]# vi /etc/httpd/conf.d/awstats.conf ← AWStats用Apache設定ファイル編集
最終行へ以下を追加
ここから----------
<Files "awstats.pl">
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from 192.168.0.0/24 ← 内部ネットワークアドレスを指定
</Files>
----------ここまで
3.apache設定反映
[root@sv ~]# /etc/rc.d/init.d/httpd reload ← Apache設定反映
httpd を再読み込み中:                                      [  OK  ]
4.アクセス統計ページHTML版作成
[root@sv ~]# vi awstatsreport.sh ← アクセス統計ページHTML版作成スクリプト作成
ここから----------
#!/bin/bash

site=$1
dir=$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データベース更新中断時ロックファイル残存対処(ここまで)
    `rpm -ql awstats|grep "awstats_buildstaticpages\.pl"` \
    -awstatsprog="`rpm -ql awstats|grep "awstats\.pl"`"\
    -config=$site -update -lang=jp -dir=$dir \
    -year=$YEAR -month=$MONTH -builddate=$YEAR$MONTH
    if [ "$YEAR$MONTH" = $(date +%Y%m) ]; then
        mv $dir/awstats.$site.$YEAR$MONTH.html $dir/index.html
    else
        mv $dir/awstats.$site.$YEAR$MONTH.html $dir/$YEAR$MONTH.html
    fi
}

ls $dir/* > /dev/null 2>&1
if [ $? -eq 0 ]; then
    YEAR=`date --date '1 days ago' +%Y`
    MONTH=`date --date '1 days ago' +%m`
    reportbuild
else
    DirData=`grep ^DirData /etc/awstats/awstats.model.conf|awk -F= '{print $2}'|tr -d \"`
    for log in `ls $DirData/awstats*.$site.txt`
    do
        YEAR=`echo $log|cut -d / -f 5|cut -d . -f 1|sed -e 's/awstats..\([^ ]*\)/\1/p' -e d`
        MONTH=`echo $log|cut -d / -f 5|cut -d . -f 1|sed -e 's/awstats\([^ ]*\)..../\1/p' -e d`
        reportbuild
    done
fi
----------ここまで

[root@sv ~]# chmod 700 awstatsreport.sh ← アクセス統計ページHTML版作成スクリプトへ実行権限付加

[root@sv ~]# ./awstatsreport.sh www.rx-93dff.net /var/www/awstatsreport ← アクセス統計ページHTML版作成スクリプト実行
5.アクセス統計ページHTML版動作確認

http://サーバ名/awstatsreport/へアクセスし今月分のページが表示されることを確認。

過去のページはhttp://サーバ名/awstatsreport/YYYYMM.htmlで表示することができます。

5.アクセス統計ページHTML版自動実行設定
[root@sv ~]# echo "00 00 * * * root /root/awstatsreport.sh www.rx-93dff.net /var/www/awstatsreport > /dev/null" > /etc/cron.d/awstatsreport ← 毎日00:00にアクセス統計ページHTML版作成スクリプト実行