情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Nginxのアクセスログに独自HTTPヘッダを出すための変数記法についてメモ

Apache (6) LTSV (1) Nginx (13)

リバースプロキシとして利用しているNginxのログをLTSV形式に変更するにあたってnginx.confを編集して、何をログに出すかを検討していました。

その中で、自分で裏側のWebサーバー(upstream)に送っている独自のHTTPヘッダをどうやってログ出力すれば良いんだろう、といろいろログに設定できる変数について調べていました。それについてメモしておきます。

Nginxのアクセスログの定義方法

Nginxのアクセスログの形式は、「log_format」を使って定義します。

httpコンテキスト(http{...})内に「log_format ltsv "time:$time_local\thost:$remote_addr...";」のように書いて、ログのフォーマット「ltsv(フォーマットの名前)」を定義しておき、ログの出力場所を定義する際に、「access_log /var/log/nginx/access.log ltsv;」のようにして、末尾でフォーマットを指定します。

今回の問題は、「log_format」で、どんな変数が使えるのか、という話です。

upstreamに送信している独自ヘッダをログに残したい

今回やり方が気になったのは、Nginxからupstreamのサーバーに送信した独自ヘッダ(proxy_set_headerで定義)をログに残す方法です。

独自ヘッダをログに出すための記法($http_、$sent_http_、$upstream_http_)

いろいろ調べてみると、独自で定義(命名)したヘッダを残すための変数の記法として、「$http_*」「$sent_http_*」「$upstream_http_*」という記法がある、ということが分かりました。

これらの変数は、例えば「X-Cache」というHTTPヘッダがあったとしたら「$http_x_cache」「$send_http_x_cache」「$upstream_http_x_cache」のように、ヘッダ名を小文字+アンダースコアにした状態で後ろにくっつけると、変数として利用できる、という仕組みです。

これら何が違うのかというと、そのHTTPヘッダが、誰から誰へ送信されたHTTPヘッダなのか、が違います。

説明が見やすくなるように、「ブラウザ→Nginx→Apache」という登場人物で考えると、それぞれの違いはこうなります:

  • $http_:ブラウザ→Nginxのヘッダを指定したいとき
  • $upstream_http_:Apache→Nginxのヘッダを指定したいとき
  • $sent_http_:Nginx→ブラウザのヘッダを指定したいとき

なので例えば「$upstream_http_x_cache」変数には、Nginxの裏側のサーバーが返してきたX_Cacheの値が入りますが、「$sent_http_x_cache」とすると、Nginxがクライアントブラウザに返す(返した)X_Cacheの値が入ります。X_Cacheを設定した主体が変わってくるので注意が必要です(LTSV.orgでは、$upstream_http_x_cacheのほうをcacheという名前にしている)。

Nginx→Apacheがなさそう

ただ、これを見て分かるとおり3種類しかなく、Nginx→Apacheの経路用のヘッダ指定用の変数は用意されていないようでした。

参考(超便利・変数リスト):Alphabetical index of variables

変数がかなり自由に使えるのでそれで

ただ、いろいろ試してみると、そもそも自分が使っていた独自ヘッダは「proxy_set_header X-Is-Mobile $mobile;」のようにlocationコンテキストで定義していたのですが、この「$mobile」というlocationコンテキストで定義した変数をそのままlog_formatでも利用して、「mobile:$mobile」のようにログフォーマット内で利用することができました。

なので、とりあえずNginx→Apacheの独自ヘッダはproxy_set_headerでNginx自体が指定していることもあり、この方法で問題なさそうでした。

4つの経路のうち3つしか見当たらないのは、このあたりの「Nginx→Apacheはなんとかなるでしょ」的な発想があるのかもしれません。

参考

コメント(0)

新しいコメントを投稿