[nginx] awstatsをnginxで動かす


nullpopopo96x96WEBサーバをnginxで運用している人は多いかと思いますが、アクセス解析もちゃんとやりたいところです。Google Analyticsなどのサービスを使ってもよいのですが、ログは採りっぱなしじゃ勿体ないので、ここは王道のawstatsを使うことにします。今回も環境はCentos 6.4 x86_64、nginxはnginxリポジトリからのインストール、awstatsはrpmforgeからインストールしています。

■ nginxのログフォーマットについて

デフォルトのログフォーマットは、 /etc/nginx/nginx.conf でこうなっています。

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

Apacheのアクセスログで使われるcombined形式に、http_x_forwarded_forを付け加えた形式となっています。nginxがプロキシの配下にない場合は、最後のフィールドを削っても構わないでしょう。書き方としてはこうなります。

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent";

また、ロードバランサやリバースプロキシの配下にある場合は、逆にremote_addr がプロキシサーバのアドレスでしか表示されないので、むしろhttp_x_forwarded_forを1フィールド目にしたほうがよいでしょう。

    log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent"';

 

■ アクセス解析用のバーチャルホストを作成する

アクセス解析用のバーチャルホストですが、awstatsがPerlでできているため、こちらを参考に、CGIを動かせるようにしておきます。 他人からはURLでawstats であることを類推されないよう、 http://awstats.example.com/stats/ 配下で動かすこととし、ベーシック認証をかけることにします。いずれもserverディレクティブの中のコンテキストとして書いてあげましょう。

ロケーションは通常のバーチャルホストと同じで構いません。

    location / {
        root   /home/vhosts/admin.example.com/public_html;
        index  index.pl index.cgi index.php index.html index.htm;
    }

次に /stats ですが /var/www/awstats のシンボリックリンク /var/www/stats を作ってから設定を書いてあげます。

[ (っ´∀`)っ@友の会 ~]$ sudo ln -s /var/www/awstats /var/www/stats
    location ~ /stats {
        gzip off;
        root  /var/www;
        auth_basic "admin only";
        auth_basic_user_file /home/vhosts/admin.example.com/.htpasswd;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8999;
        fastcgi_index awstats.pl;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

あとは拡張子 .pl や .cgi が動くようにしてあげます。

    location ~ .pl$ {
        gzip off;
        root   /home/vhosts/admin.example.com/public_html;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8999;
        fastcgi_index index.pl;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ .cgi$ {
        gzip off;
        root   /home/vhosts/admin.example.com/public_html;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:8999;
        fastcgi_index index.cgi;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

当初、これだけで動かそうとしたのですが、グラフの画像がうまく表示されませんでした。ですので、↑のCGI設定の上に、以下の記述を追加しています。

    location /awstatsclasses {
        alias /var/www/awstats/classes;
    }
    location /awstatscss {
        alias /var/www/awstats/css;
    }
    location /awstatsicons {
        alias /var/www/awstats/icon;
    }

最後に、ベーシック認証のパスワードファイルを作成し、nginxをリロードすればおしまいです。nginxでベーシック認証を行うには、opensslコマンドを使ってパスワードを暗号化します。

[ (っ´∀`)っ@友の会 ~]$ echo "awstats:$(openssl passwd -apr1 PASSWORD_IS_HERE)" > /home/vhosts/awstats.example.com/.htpasswd
[ (っ´∀`)っ@友の会 ~]$ sudo /etc/init.d/nginx reload

あとはawstats側ですが、ログファイルのPATHやデータディレクトリのPATH、ホスト名などを適宜設定します。以上で、こんな風にawstatsが見れるようになりました。

awstats

ね、簡単でしょう?