nginxでリクエスト/レスポンスヘッダーをログ出力

nginx
nginx でクライアントの "Accept-Encoding" をログ出力する必要があったので調べた。

ログ出力の基本

ngx_http_log_module モジュールでログ出力する。
nginx.conflog_format で指定。

Ubuntu では nginx.conf/etc/nginx/nginx.conf にある。

書式

リクエスト/レスポンスヘッダーともに log_format$prefix_{field_name} で指定する。

prefix はリクエスト/レスポンスで異なる

field_name は正規化しなければいけない。

  • 大文字は小文字にする
  • ハイフンはアンダースコアにする

リクエストヘッダーのログ出力

prefix は http
Accept-Encoding の場合 $http_accept_encoding となる。
ドキュメントのどこかに明示的にかかれているのかな?今回はこの仕様がわからず少し苦労した。

レスポンスヘッダーのログ出力

prefix は sent_http
Content-Type の場合 $sent_http_content_type となる。

The headers, transmitted to client, begin from the prefix “sent_http_”, for example, $sent_http_content_range.
http://nginx.org/en/docs/http/ngx_http_log_module.html

Samples

nginx.conf の設定例

log_format gzip '"$request" $status $bytes_sent '
                '"$sent_http_content_type" '
                '"$http_accept_encoding" '
                '"$http_accept_language" '
                '"$http_user_agent"';

/var/log/nginx/access.log の出力例

"GET /index.html HTTP/1.1" 200 473 "text/html" "gzip,deflate,sdch" "en-US,en;q=0.8" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36"
  • $sent_http_content_type(Response ヘッダーの Content-Type) => text/html
  • $http_accept_encoding(Request ヘッダーの Accept-Encoding) => gzip,deflate,sdch

というように、期待通りにログ出力されている。

その他

リクエスト/レスポンスヘッダーの一覧は次のページを参照。
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Chrome の URL 欄に chrome://net-internals/#events を入力すると通信内容を確認できる。
http://www.chromium.org/developers/design-documents/network-stack/debugging-net-proxy

Leave a comment