Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

やりたいこと

  • アクセスログからユニークユーザを特定したい。
    • 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"

以上、こんな感じです。

akiko-pusu
コツコツと学習しながらのメモを書いています。Redmineのプラグイン開発に関連するものが多めです。記事にご興味を持っていただけたら嬉しいです!
https://daily-postit.hatenablog.com
infra-workshop
インフラ技術を勉強したい人たちのためのオンライン勉強会です
https://wp.infra-workshop.tech/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした