NGINX Plus における変数について
nginx の設定を見ると、良く $XXXX という記述を見かけませんか?
今回は $XXXX について解説していきます。
こんにちは naraiです。
プログラムをかじったことがある人ならすぐわかると思いますが、$XXXX は変数です。
NGINX ではこの変数を活用することで、かなり柔軟な設定ができるようになります。
今回はそんな変数について詳しく解説していきます。
NGINX Plus の変数
NGINX Plus (NGINX) では、変数を使用することで、リクエストやレスポンスの情報を参照、操作することができます。
また、Config 上で任意の変数を指定することもできます。
早速ですが、以下に NGINX で使える基本的な変数を紹介します。
| 変数 | 概要 | 例 |
|---|---|---|
| $remote_addr | 送信元 IP を取得します | |
| $host | Host ヘッダの値を取得します | http://example.com/ から "example.com" を返します |
| $request_uri | リクエストのURIを取得します | http://example.com/main.html?id=123¶m=value から "/main.html?id=123¶m=value" を返します |
| $args | リクエストの uri パラメーターを取得します | http://example.com/main.html?id=123¶m=value から "id=123¶m=value" を返します |
| $http_"name" | 任意のヘッダを取得します | $http_x_forwarded_for の場合、X-Forwarded-For ヘッダの値を返します |
| $cookie_"name" | 任意のCookieを取得します | $cookie_JSESSIONID の場合、JSESSIONID Cookie の値を返します |
ここで紹介するのは変数のごく一部です。
利用できる変数の一覧は公式サイトを見てください。
HTTP リクエストのヘッダ取得について
HTTP リクエストのヘッダ情報を取得する場合、上記に記載しました通り、$http_ という形式で、ヘッダ名を指定しますが、その際に使用できる文字列は小文字とアンダースコアのみになります。
そのため、X-Forwarded-For のように大文字やハイフンは $http_x_forwarded_forのように変換する必要があります。
また、クライアントへのレスポンスやアップストリームサーバーからのレスポンスにおけるヘッダ情報を取得する場合、以下のような変数を使用します。
| 変数名 | 送信元 | 宛先 | 概要 |
|---|---|---|---|
| $http_ | Client | NGINX | HTTP Request |
| $senthttp | NGINX | Client | HTTP Response |
| $upstreamhttp | upstream server | NGINX | HTTP Response |
このようにどこからどこ宛の通信を取得するかで変数が変わります。
サンプル設定
それでは、$http_ を使用したサンプル設定を見てみましょう。
map ディレクティブを使用して、 TED-env ヘッダの値を元にバランシング先を切り替えております。
upstream backend1 {
server nginx-app1:80;
}
upstream develop1 {
server dev-app1:80;
}
map $http_ted_env $origin_pool {
default backend1 ;
"dev" develop1;
}
server {
location / {
proxy_pass http://$origin_pool;
add_header upstream $origin_pool;
}
}
解説
リクエストの TED-env ヘッダの値を見て、dev なら開発ようのサーバーに、それ以外なら本番サーバーに振り分ける設定です。
このように、お客様環境独自の HTTP ヘッダを使用した負荷分散も可能です。
独自変数
NGINX では独自に変数を定義することもできます。
独自変数は以下のように set ディレクティブを使用することで定義できます。
この設定では、変数 $val に hogehoge という値を挿入しています。
set $val hogehoge;
まとめ
今回紹介したのは一部の変数の例ですが、他にも多くの変数存在します。
NGINX の設定は変数を使用することで、できることが大幅に広がりますので、是非、活用してください。
