33
34

More than 5 years have passed since last update.

PHPアプリのユーザIDをnginxのアクセスログに記録する方法

Posted at

自分への備忘録を兼ねて。

はじめに

ユーザに関する様々なデータを分析してサービス改善に役立てるというのは、サービスを提供する上でよくある方法です。
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だけでなく色々と応用できると思いますので、覚えておいて損はないと思います。

参考

33
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
34