これまで基本的なnginxの設定についてみてきましたが、今回はset,ifディレクティブについてみていきます。
変数とset
nginxではコンフィグ内で変数を利用できます。setディレクティブをもといることで変数の定義が行えます。
set 変数名 値
システム自体が最初から定義している変数も多数あり、これらを利用することで柔軟な設定が可能です。
例えば1台のサーバーでユーザーごとに個別のサブドメインとドキュメントルートを用意したい場合などはバーチャルホストを複数設定することで解決することができます。
私はこの方法しかないと思っていましたが、変数を使えば一括で解決できますね。
下記のように書くことなどができます。
1 2 3 4 5 6 |
server{ server_name *.website.com; location /{ root /home/www/$host/htdocs } } |
$hostというのはもともとnginx内で定義されている変数です。
また特定IPを禁止する方法などは下記のように書くことで解決できます。
1 2 3 |
if( $remote_addr = 192.168.0.10 ){ return 403; } |
ちょっとしたプログラミングのようなことができますが、一般的なプログラミング言語ほどの自由度はありません。できることは下記のようなことに限られます。
= 変数の一致
~ 正規表現マッチ(大文字、小文字を区別)
~* 正規表現マッチ(大文字、小文字を区別しない)
-f 指定したファイルが存在する
-d 指定したディレクトリが存在する
-e 指定したファイル、ディレクトリまたはシンボリックリンクが存在するか
-x 指定したファイルに実行権限が存在するか
サーバー・インフラ徹底攻略にあった例を書かせていただきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
set $mnt false; if( -e /var/tmp/do_mnt){ set $mnt true; } if( $remote_addr = 管理者のIPアドレス){ set $mnt false; } location ^~ /{ if( $mnt = true){ error_page 503 = @maintenance return 503; } } location @maintenance{ rewrite ^(.*)$ /maintenance.html break; } |
上記は下記のような流れになっています。
- /var/tmp/do_mnt というファイルがあればメンテ画面maintenanceに飛ぶ
- 管理者のIPアドレスの場合はその判定を行わない
- maintenanceは名前付きlocation(後述)に飛ばす
代表的な変数としては下記のようなものが有名です。
1 2 3 4 5 6 7 8 |
$remote_addr クライアントリモートアドレス $time_local ローカルタイム $request_uri リクエストURI $status HTTPステータスコード $http_referer リファラ $http_user_agent ユーザーエージェント $host HOSTヘッダ $query_string クエリストリング |
さらに詳しく知りたい方はNginx入門が詳しいですね。辞書のように活用できるかと思います。
今まであまり説明していなかったerror_pageディレクティブと名前付きlocationについて
error_page
HTTPステータスコード400,500番台のエラー発生時に表示するページを指定できます。
例えば404エラーが発生した際に、/404.htmlを表示するには下記のように表示します。
1 |
error_page 404 /404.html |
また403がおきたときに404で返し、あたかもファイルが存在しないかの用に見せる方法もあります。
1 |
error_page 403 = 404 /404.html |
名前付きlocation
名前付きlocationはその名の通り、locationディレクティブに名前を付ける機能です。例えば次にしめす設定はfaviconがない代わりに代わりの画像を表示する機能です。
1 2 3 4 5 6 7 |
location = /favicon.ico{ error_page 404 = @empty } location @empty{ empty_gif; } |
上記の動きは下記のようになります。
- faviconがない場合は404エラー
- その際にerror_pageディレクティブで指定している@emptyが呼び出されます。
- @emptyではemtpy_gifディレクティブを利用し、ダミー画像を表示しています。※empty_gifというのはnginxに元々備わっている機能です。