自分への備忘録を兼ねて。
はじめに
ユーザに関する様々なデータを分析してサービス改善に役立てるというのは、サービスを提供する上でよくある方法です。
Webシステムの場合、いわゆるアクセスログを元にして改善点やユーザ動向を見つけることもあるでしょう。
ユーザ動向を把握するという意味では、サービスが管理するユーザIDをログに記録することで、どのユーザがどんな動き方をしたかを残しておくことができます。
Apache + mod_phpの環境であればapache_noteを使ってPHPアプリケーションが管理するユーザIDをアクセスログに記録することができますが、nginx + php-fpm環境の場合はHTTPレスポンスヘッダを利用することで、比較的簡単にアクセスログに記録することができるようになります。
nginxでは特定のレスポンスヘッダをクライアントに送出しないようにすることもできますので、ユーザには見せたくない情報であってもログに残すことができます。
PHPアプリケーションの実装
PHPアプリケーションでは、ログに残したい情報を普通にレスポンスヘッダとして送出するだけです。
例
$userId = 'アプリケーションが管理するユーザID';
header('X-APP-USER-ID: ' .$userId);
nginxの設定
ログフォーマットの設定
アクセスログに残したいレスポンスヘッダを変数としてログフォーマットに含めます。
この際、変数名に変換するには
- "upstream_http_"を接頭辞として付ける
- 大文字 -> 小文字に変換する
- ハイフンはアンダースコアに変換する
のルールで変換する必要があります。
例(送出したヘッダが"X-APP-USER-ID"の場合)
'$upstream_http_x_app_user_id'
ユーザIDをクライアントに送出しない設定
送出したくないレスポンスヘッダのキーを以下の方法で指定します。
fastcgiとして実行している場合
fastcgi_hide_header "X-APP-USER-ID";
リバースプロキシを利用して実行している場合
proxy_hide_header X-APP-USER-ID;
まとめ
PHPに限らず、システムが管理する情報をあまり手間を掛けずにアクセスログに残すことができれば、fluentdなどと組み合わせることで色々な形で情報を活用することができると思います。
ユーザIDだけでなく色々と応用できると思いますので、覚えておいて損はないと思います。