Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
41
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@akiko-pusu

Nginxからトラッキング用のCookieを設定する

やりたいこと

  • アクセスログからユニークユーザを特定したい。
    • proxyを通してアクセスをさばいているので、複数ユーザ/クライアントのログが丸められてしまっている。
  • Cookieベースでユーザを特定できるといいな。
  • 専用ツールの利用は無し(あとから考えよう)。
  • Apacheではなく、Nginxを使いたい。
    • かつ、Apacheのmod_usertrackのようなことをしたい。

ログからのトラッキング以外に、現在はPiwikというOSSのツールも使っています。こちらもとても面白いものなので、いつか簡単にご紹介します!

Nginxのモジュール対応表

Nginxのモジュール対応表を見てみます。
mod_usertrackに対応するのは、ngx_http_userid_module だそうです。

下記は、nginxの設定例。default.confなどに記載します。

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # トラッキングIDをログの末尾にくっつける
    log_format app_main  '$remote_addr - $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$uid_got"';

    access_log /var/log/nginx/nginx-access.log  app_main;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/share/nginx/html/;
            index  index.html index.htm;
        }

        # トラッキングIDの設定
        userid          on;
        userid_name     app_uid;
        userid_domain   wp1.localhost;
        userid_path     /;
        userid_expires  365d;
    }
}

設定内容:

  • Cookie名を app_uid にする。
  • xxx.app.com に対して適用させる。
  • パスは/ (アプリケーションの特性にあわせて、/xxx のほうが良い場合もある) 。
  • 期限は365日。

Cookieの確認

上記の設定で実際にためしてみます。

  • NginxはVirtualBox / Vagrantで立ち上げたCentOS(ゲストOS)中で起動。
  • ホストOS側の /etc/hosts にwp1.localとしてゲストOSのIPを設定。(Vbox Privateネットワークで、192.168.33のネットワークになっています)
  • ホストOS側のFireFoxでアクセス。

wp-cookie.png

ログに出力させてみる

ログには、$uid_got で書き出すことができます。
下記は app_main という名前でカスタマイズしたログフォーマットの例です。
プロキシ経由でのアクセスが中心なので、以下のように proxy_add ... を指定しています

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

下記は、実際のログの出力です。

192.168.33.1 - 192.168.33.1 - - [05/Feb/2014:06:01:01 +0900] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:26.0) Gecko/20100101 Firefox/26.0" "-" "app_uid=0B21A8C0D851F1523E33BDBF02040303"

以上、こんな感じです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
41
Help us understand the problem. What are the problem?