OSSのアクセス解析ツールとして有名なAWStatsをCentOS7のnginx環境に導入しました。AWStatsとはAdvanced Web Statisticsの短縮形です。他の解析ツール「Analog」「Webalizer「Sawmill Analytics」と比較してもAwstatsは優秀な機能を持っているようです。AWStatsはweb, ftp, mail およびストリーミングサーバの統計情報をサーバログから生成し読みやすいwebページでグラフィカルに表示します(参考文献)。AWStatsは元々Apache向けに作られており、Apacheで導入するのは簡単です。しかしnginxで動作させるのは簡単ではなく、先人方の資料を参考にしましたが自分なりのアレンジが必要でした。次回導入時に迷わないようにその手順を纏めてみます。
参考(Special Thanks):CentOSで自宅サーバ
目次
1.インストール
CentOS7の場合、Epelリポジトリにあります。Epelリポジトリを有効化してインストールします。インストール時に関連ライブラリーもインストールされます。
1 |
# yum -y install --enablerepo=epel awstats |
以下のディレクトリにインストールされます。
/usr/share/awstats/
設定ファイルは以下です。
/etc/awstats/
以下のサンプルファイルを参考にCGIラッパーのphpを実行環境にコピーします。
/usr/share/awstats/tools/nginx/awstats-fcgi.php
1 |
# cp /usr/share/awstats/tools/nginx/awstats-fcgi.php /usr/share/awstats/wwwroot/cgi-bin/fcgi.php |
2.設定ファイルの修正
(1)awstats用の設定ファイルメンテ
設定ファイルの確認をします。
1 2 3 4 |
#ls -la /etc/awstats -rw-r--r-- 1 root root 62805 Jan 28 15:36 awstats.gtrt7.com.conf -rw-r--r-- 1 root root 62815 Mar 2 2016 awstats.localhost.localdomain.conf -rw-r--r-- 1 root root 62815 Mar 2 2016 awstats.model.conf |
インストール時に、ドメインを見て勝手に「awstats.gtrt7.com.conf」を作ってくれたようです。awstats.localhost.localdomain.confは不要ですので削除します。
# rm -f /etc/awstats/awstats.localhost.localdomain.conf
自動作成された「awstats.gtrt7.com.conf」を元にしてメンテします。
この設定ファイルは、「awstats.ドメイン名.conf」として作成しなくてはならないようです。ドメイン名はconfファイル内のSiteDomainの値と等しい必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
# vi /etc/awstats/awstats.gtrt7.com.conf LogFile="/var/log/nginx/www.gtrt7.com-access.log" #←ログファイルパスを指定する SiteDomain="gtrt7.com" #←自動で設定されます。必要に応じて変更 DNSLookup=2 ↓ DNSLookup=1 #←アクセス元の名前解決を行う(アクセス元をIPアドレスではなくホスト名で表示する) DirCgi="/awstats" ↓ DirCgi="/cgi-bin" #cgiの実行ディレクトリをデフォルトのcgi-binに変更します。。 #LoadPlugin="geoipfree" ↓ LoadPlugin="geoipfree" #←コメント解除(アクセス元国情報を詳細に取得) |
(2)Nginx.confのメンテ
以下のサンプル設定ファイルを参考にNginx用のConfファイルを作成します。
今回はサブドメイン運用をする前提でconfファイルを作成しました。
/usr/share/awstats/tools/nginx/awstats-nginx.conf
AWStats実行環境の安全性を高める為、SSL通信としBASIC認証とIPアクセス制限を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# vi /etc/nginx/conf.d/awstats.conf server { listen 443; listen [::]:443; server_name aws.gtrt7.com; access_log /var/log/nginx/aws.gtrt7.com-access.log main; error_log /var/log/nginx/aws.gtrt7.com-error.log info; root /usr/share/awstats/wwwroot; index index.html; ssl on; ssl_certificate /etc/letsencrypt/live/aws.gtrt7.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/aws.gtrt7.com/privkey.pem; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS; add_header Strict-Transport-Security 'max-age=15768000;includeSubDomains;preload'; # Restrict access ←Basic認証設定 auth_basic "Restricted"; auth_basic_user_file /etc/awstats/htpasswd; # IP ACCESS CONTROL ←IPアドレス制限 allowのみ許可 allow 127.0.0.1; allow 10.8.0.0/24; allow xxx.xx.xx.xx/YY; ←アクセス可能なIPサブネットを登録 deny all; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # Static awstats files: HTML files stored in DOCUMENT_ROOT/awstats/ location /awstats/classes/ { alias /usr/share/awstats/wwwroot/classes/; } location /awstats/css/ { alias /usr/share/awstats/wwwroot/css/; } location /awstats/icon/ { alias /usr/share/awstats/wwwroot/icon/; } location /awstats-icon/ { alias /usr/share/awstats/wwwroot/icon/; } location /awstats/js/ { alias /usr/share/awstats/wwwroot/js/; } # Dynamic stats. location ~ ^/cgi-bin/(awredir|awstats)\.pl { gzip off; fastcgi_pass 127.0.0.1:9000; #fastcgi_pass php-handler; fastcgi_param SCRIPT_FILENAME /usr/share/awstats/wwwroot/cgi-bin/fcgi.php; fastcgi_param X_SCRIPT_FILENAME /usr/share/awstats/wwwroot$fastcgi_script_name; fastcgi_param X_SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; } } |
cgi-binがnginxでアクセスできるように設定します。
# chown -R nginx:nginx /usr/share/awstats/
nginxを再起動して設定ファイルを読み込みます。
# systemctl restart nginx
(3)ログローテーション設定
nginxのログファイル切替え時、AWStatsのデータベースに取り込んでから切替えを行うようにします。prerotate行にスクリプトを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# vi /etc/logrotate.d/nginx /var/log/nginx/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 nginx adm sharedscripts prerotate `rpm -ql awstats|grep "awstats_updateall\.pl"` now -confdir="/etc/awstats" -awstatsprog="`rpm -ql awstats|grep "awstats\.pl"`" >/dev/null endscript postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript } |
(4)geoipfreePluginの導入
awstats用の設定ファイル「awstats.gtrt7.com.conf」で有効にしたgeoipfreePluginを導入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# yum -y install perl-CPAN #インストール # perl -MCPAN -e shell CPAN.pm requires configuration, but most of it can be done automatically. If you answer 'no' below, you will enter an interactive dialog for each configuration option instead. Would you like to configure as much as possible automatically? [yes] ←Enter応答 What approach do you want? (Choose 'local::lib', 'sudo' or 'manual') [local::lib] ←Enter応答 Autoconfigured everything but 'urllist'. Now you need to choose your CPAN mirror sites. You can let me pick mirrors for you, you can select them from a list or you can enter them by hand. Would you like me to automatically choose some CPAN mirror sites for you? (This means connecting to the Internet) [yes] ←Enter応答 ... Would you like me to append that to /root/.bashrc now? [yes] commit: wrote '/root/.cpan/CPAN/MyConfig.pm' You can re-run configuration any time with 'o conf init' in the CPAN shell Terminal does not support AddHistory. cpan shell -- CPAN exploration and modules installation (v1.9800) Enter 'h' for help. cpan[1]> install Geo::IPfree ←Geo::IPfree応答(モジュールインストール) cpan[2]> quit ←quit応答 Terminal does not support GetHistory. Lockfile removed. *** Remember to restart your shell before running cpan again *** |
(5)日本の検索エンジン対応
日本の検索エンジンが検索エンジンとして集計されるようにします。search_engines.pmを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# vi /usr/share/awstats/lib/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.確認
(1)URLアクセス可否確認
以下のURLにアクセスします。
https://aws.gtrt7.com/cgi-bin/awstats.pl?config=gtrt7.com
下記のように結果が表示されれば成功です。
(2)cron.houelyの存在確認
インストール時に作成されている、毎時更新スクリプトが存在するか確認します。あればスクリプトを表示します。これは毎時AWStats用のDBを更新するスクリプトになっています。
1 2 3 4 5 6 |
# ls -la /etc/cron.hourly/awstats -rwxr-x--- 1 root root 172 Mar 2 2016 /etc/cron.hourly/awstats # less /etc/cron.hourly/awstats #!/bin/bash exec /usr/share/awstats/tools/awstats_updateall.pl now -configdir="/etc/awstats" -awstatsprog="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl" >/dev/null exit 0 |
(3)AWStatu用のDB
インストール時に作成されAWStats設定ファイルが正しければAWStats用のDBが以下のディレクトリに作成されます。
/var/lib/awstats
1 2 |
# ls -la /var/lib/awstats rw-r--r-- 1 root root 8428 Jan 30 00:01 awstats012017.gtrt7.com.txt |
なければ、上記「/etc/cron.hourly/awstats」を実行してみましょう。
作成されれば設定ファイルは正常です。作成されない場合、設定ファイルに間違いがありますので修正しましょう。
4.アクセス統計ページHTML版作成
万が一AWStatsのデータベースが失われた場合、アクセス統計が見れなくなってしまうため、アクセス統計ページをHTMLで作成するようにする。
(1)ディレクトリ作成
1 |
# mkdir /var/www/awstatsreport #←HTML版格納ディレクトリ作成 |
(2)設定ファイル変更
アクセス統計ページHTML版にアクセスできるようにnginx用のconfファイルにlocation設定を追加します。
1 2 3 4 5 6 |
# vi /etc/nginx/conf.d/awstats.conf # 以下を追加 location /awstatsreport/ { alias /var/www/awstatsreport/; index index.html; } |
(3)スクリプト作成
アクセス統計ページHTMLを作成するスクリプトを作成します。といってもこちらのCentosで自宅サーバさんからスクリプトは全て流用させていただきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# vi awstatsreport.sh #!/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 # 個別ページリンク切れ対処(ここから) sed -i "s/href=\"${site}/href=\"awstats.${site}/g" \ $dir/awstats.$site.$YEAR$MONTH.html # 個別ページリンク切れ対処(ここまで) 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 |
スクリプトに実行権限を付与し実行してみます。
1 2 |
# chmod 700 awstatsreport.sh # ./awstatsreport.sh gtrt7.com /var/www/awstatsreport |
(4)静的HTML確認
アクセス統計版HTMLにアクセスしてみます。
https://aws.gtrt7.com/awstatsreport/
レポートが表示されたら成功です。
(5)cronへの登録
毎日0:00に実行するよう、cronへ登録します。
1 |
# echo "00 00 * * * root /root/awstatsreport.sh gtrt7.com /var/www/awstatsreport > /dev/null" > /etc/cron.d/awstatsreport |
これで毎時AWStats用DBが更新され、1日1回表示用のHTMLが作成されるようになります。