nginxの設定 その2

メモ:

「nginxの設定 その1」からの続きとなります。ここでは、インストール時に作成されるnginxの設定ファイルについて一つずつ確認していきたいと思います。serverディレクティブやlocationディレクティブを中心に確認していきます。

httpコンテキストの中

まずは、httpコンテキストの中に記述されている設定について確認していきます。 serverディレクティブの中でどのような設定が行われているのか1つずつ確認していきます。

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
     # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

serverディレクティブ(バーチャルサーバの用意)

serverディレクティブは、バーチャルサーバ(バーチャルホスト)の設定を記述します。中括弧({})で囲まれた範囲がserverコンテキストとなります。

nginxでは、複数のサーバを動作させることができ、複数のバーチャルサーバを運用するときには、serverディレクティブを複数作成します。バーチャルサーバの区別は、serverディレクティブ内に設定されるlistenディレクティブとserver_nameディレクティブで行い、IPアドレスや名前でバーチャルサーバを区別します。

server {
    ...
}

例えば、名前ベースでバーチャルサーバーを複数用意する場合は、次のように設定します。

server {
    listen      80;
    server_name hoge.org www.hoge.org;
    ...
}

server {
    listen      80;
    server_name fuga.net www.fuga.net;
    ...
}

server {
    listen      80;
    server_name bnote.net www.bnote.net;
    ...
}

listenディレクティブ

listenディレクティブは、バーチャルサーバがリクエストを受け付けるIPアドレスやポート番号、UNIXドメインソケットの設定をします。

listenディレクティブには、IPアドレスとポートの組み合わせで設定するのですが、この例ではIPアドレスが省略されており、すべてのインターフェイスアドレスに対してポート80でリクエストを受け付ける設定となっています。また、2行目の設定は、IPv6の設定となります。

default_serverパラメータは、指定されたアドレス:ポートのサーバがデフォルトサーバになるという設定です。

listen       80 default_server;
listen       [::]:80 default_server;

ちなみに、UNIXドメインソケットを使用する場合は次のようにパスを指定します。

listen unix:/var/run/nginx.sock;

server_nameディレクティブ(バーチャルサーバの名前を設定)

server_nameディレクティブは、バーチャルサーバの名前を設定します。

nginxは、HTTPリクエストに対して、どのサーバでリクエストを処理すべきかをリクエストヘッダ中の Host フィールドとserver_nameディレクティブに設定した名前で決定します。

この例では、アンダースコアが指定されているので、すべての名前に対応することになります。

server_name  _;

上記以外にも設定方法があるので、いくつか確認しておきます。

サーバ名を一つだけ指定する場合は、次のように記述します。

server_name hoge.net

複数のサーバ名を記述する場合は、次のようにスペースで区切って記述します。

server_name hoge.net www.hoge.net;

サブドメイン全て一致させたい場合は、次のように記述します。

server_name .hoge.net;

または、

server_name *.hoge.net;

他にも正規表現を使った設定ができるようです。

server_name ~^(www\.)?(.+)$;

rootディレクティブ(ドキュメントルートの設定)

rootディレクティブは、ドキュメントのルートディレクトリを設定します。httpコンテキストやserverコンテキスト、locationコンテキスト、location内のifコンテキストに記述することができます。

この例では、/usr/share/nginx/htmlディレクトリをドキュメントのルートディレクトリとして設定しています。

root         /usr/share/nginx/html;

locationディレクティブ

locationディレクティブは、リクエストURIのパスがこのlocationディレクティブのパスの条件に一致した場合、このlocationコンテキストに記述した設定が適応されます。

locationディレクティブには、優先順位があったりlocationの中にlocationディレクティブを記述してネストすることもできます。

この例では、リクエストURIのパスの先頭が「/」に一致した場合に適応されます。すべてのパスは「/path/to/page.html 」のように「/」で始まるため、他のlocationディレクティブの条件に一致しない場合は、このlocationディレクティブが適用されます。

location / {
}

基本的な部分としてlocationディレクティブは、URIのパスの前に”=“, “~“, “~*“, “^~“の4種類のプレフィックスを付けることができます。

prefix 意味
= 完全一致
~ 正規表現 (大文字小文字を区別)
~* 正規表現(大文字・小文字を区別しない)
^~ 前方一致(後方参照なし)
prefixなし 前方一致(後方参照あり)

locationディレクティブは、少し複雑なので別途確認していきたいと思います。

error_pageディレクティブ

error_pageディレクティブは、指定したエラーコードが発生したときに表示するページのURIを設定します。

この例では、エラーコード404が発生したときに内部的にリダイレクトして/404.htmlが返されます。

error_page 404 /404.html;

locationディレクティブに記述する設定は、沢山あり優先順位など複雑なので、今回はここまでとしてより詳細なところは別途確認したいと思います。