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

2021年6月4日

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の設定
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
【例】log_formatの設定
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の設定
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コンテキストに追記
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] # ユーザー定義変数がある時

ちゃんと出力されていました。めでたしめでたし。

Nginx

Posted by Bright_Noah