ネットワーク

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&param=value から "/main.html?id=123&param=value" を返します
$args リクエストの uri パラメーターを取得します http://example.com/main.html?id=123&param=value から "id=123&param=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 の設定は変数を使用することで、できることが大幅に広がりますので、是非、活用してください。

この記事に関連する製品・サービス