nginx でクライアントの "Accept-Encoding"
をログ出力する必要があったので調べた。
ログ出力の基本
ngx_http_log_module モジュールでログ出力する。
nginx.conf
の log_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