Nginx★定義済み変数を出力して中身を確認しよう!

Nginxの設定方法を調べていると、$uriとか$argsなどの定義済み変数が登場してきます。漠然とはわかってもこれが具体的に何が格納されているのかわからない!!
という訳でNginxで使われている定義済み変数を確認することにしました。自分で定義した変数も確認することが出来ると思います。
HTTPヘッダに出力する方法
HTTPヘッダに定義済み変数の内容を出力されせば、中身が確認できます。試してみましょう。
HTTPヘッダに変数の内容を出力させる為には?
nginx.confにadd_headerディレクティブを追記して、HTTPヘッダに出力できるようにします。
add_headerディレクティブの設定
add_headerディレクティブに出力させる変数、またはHTTPヘッダに記述したい内容を設定します。
add_headerが指定できるコンテキスト(記述できる場所)にも注意しましょう。
add_header addheader名の指定 変数の指定or記述したい内容
指定できるコンテキスト | http server location |
location / {
add_header v_uri $uri; # uri
add_header v_args $args; # uriの付加情報
add_header v_time $time_local; # 時刻
add_header v_test test; # 記述したい内容(任意)
}
HTTPヘッダを出力して確認しよう
実際にHTTPヘッダを出力して変数の値が出力されるか確認してみます。
まずはNginxの設定ファイルを変更したらリスタートします。
systemctl restart nginx
もしエラーが出たら次のコマンドで確認しましょう。
nginx -t
HTTPヘッダの内容を出力させる為のコマンドは次の通りです。
curl -I localhost/index.html?x=abc
curl -I 対象のURL
HTTPレスポンスヘッダーを出力に含める
すると次のような内容で出力されます。
【HTTPヘッダ出力結果】
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Sun, 22 Dec 2019 00:47:15 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
v_uri: /index.html
v_args: abc=x
v_time: 22/Dec/2019:00:47:15 +0000
v_test: test
Accept-Ranges: bytes
設定した内容(v_uri, v_args, v_time, v_test)が出力されているのが確認できます。
ログに出力する方法
ログに変数を出力させる方法を確認したいと思います。
ログに定義済み変数を出力させるには?
nginx.confにlog_formatディレクティブ・access_logディレクティブを追記して、ログに出力できるようにします。
log_formatディレクティブの設定
log_formatディレクティブはログ出力の対象となる変数や文字列(記述したい内容)を設定します。但し、log_formatは必ずhttpコンテキスト内で指定しなければなりません。
log_format logformat名の指定 “変数の指定or記述したい内容";
指定できるコンテキスト | http |
http {
log_format debug_val_format "uri[$uri] " # uri
"args[$args] " # uriの付加情報
"time[$time_local] " # 時刻
"status[$status]"; # ステータス
}
access_logディレクティブの設定
access_logディレクティブではログ出力するファイルの指定と出力対象(log_formatで設定した内容)の設定を行います。
access_log ログファイルのパス logformat名;
指定できるコンテキスト | http server location |
server {
access_log /var/log/nginx/debug_val.log debug_val_format;
}
ログにユーザー定義変数を出力させるには?
nginx.confにsetディレクティブを追記してユーザー定義変数の内容を記載します。
ログに出力させるためにはlog_formatディレクティブに定義した変数を記載します。access_logディレクティブは上記と同様です。
setディレクティブの設定
setディレクティブにより変数に値を設定します。
ログ出力する為にはlog_formatでの指定も必要です。
set $ユーザー定義変数名 “定義したい値or定義済み変数"
指定できるコンテキスト | server location |
※setで指定したユーザー定義変数はlog_formatで指定する必要があります。
server {
set $debug_val "hostname[$hostname]" # 追記
access_log /var/log/nginx/debug_val.log debug_val_format;
}
# log_formatにはユーザー定義変数(ここでは$debug_val)を追記します。
http {
log_format debug_val_format "uri[$uri] " # uri
"args[$args] " # uriの付加情報
"time[$time_local] " # 時刻
"status[$status] " # ステータス
"$debug_val"; # ユーザー定義変数を追記
}
ログに出力して確認しよう
実際にログに出力して変数の値が記載されるか確認してみます。
まずはNginxの設定ファイルを変更したらリスタートします。
systemctl restart nginx
もしエラーが出たら次のコマンドで確認しましょう。
nginx -t
ログ確認(ログファイルへの出力)の為のコマンドは次の通りです。
curl -I localhost/index.html?x=abc
指定したログファイルを開いて確認してみましょう。次のような内容が記載されているはずです。
【ログ出力結果】
uri[/index.html] arg[abc=x] time[20/Dec/2019:00:33:01 +0000] status[200] # ユーザー定義変数が無い時
uri[/index.html] arg[abc=x] time[21/Dec/2019:07:06:21 +0000] status[200] hostname[localhost.localdomain] # ユーザー定義変数がある時
ちゃんと出力されていました。めでたしめでたし。