next up previous contents
Next: 6.2 IPによるバーチャルサーバ Up: 6. バーチャルサーバ Previous: 6. バーチャルサーバ

6.1 名前によるバーチャルサーバ

nginxは HTTP リクエストに対して、最初にどのサーバでそれを処理すべきか を決定します。その際に用いられるのが、リクエストヘッダ中の Host フィールド です。以下の例では、このHost フィールドと server_name が一致した 場合、該当するサーバ設定が採用されます。

server {
    listen 80;
    server_name www.test.jp  w3.test.jp;
    ...
}
server {
    listen 80;
    server_name www2.test.jp;
    ...
}

一方、もしこれらの server_name と Hostフィールドの名前が一致 しなかった場合には、デフォルトのサーバでリクエストは処理されます。 デフォルトのサーバは、最初に定義されているサーバになります。 従って、上の例では、www.test.jp が該当します。

もし、デフォルトサーバを一番目のサーバではなく、指定したサーバで 処理させたい場合には、default_server パラメータを listen ディレクティブ に用いることが出来ます。

    server {
        listen 80  default_server;
        server_name www2.test.jp;
        ...

ちなみに、もしもあるサーバを一時的に閉鎖し、アクセス不能にするには、 以下のように code 444 を返すとコネクションを切断するように出来ます。

    server {
        listen 80;
        server_name www.test.jp;
        return 444;
    }

あるいは、該当エラーに対してエラーページを返す場合には、以下のようにします。

    server {
        listen 80;
        server_name www.test.jp;
        error_page 404   /404.html
        error_page 500 502 503 504   /50x.html
    }

ここで、error_page ディレクティブは以下の構文を持っています。

error_page code ... $[=[$response$]]$ uri;

uri に指定したファイルが該当コードのエラーに対して 返されます。error_page は、http, server, location, if in location などのブロックに書くことが出来、設定がなければ上位の設定を継承します。 "=response" を使うと、応答コードを変更することが出来ます。
   error_page  404 =200 /empty.gif
uri にはURLを書くことでリダイレクトも可能ですが、リダイレクトに ついては別の章で扱います。

サーバ名をサーバのホスト名にしたい場合には、$hostname 変数が使えます。

    server {
        server_name $hostname;
    }

一方、もしリクエストが、サーバ名の代わりにIPアドレスを利用していた 場合、Host ヘッダにはIPアドレスが使われるでしょう。そのような場合には、 IPアドレスを server_name に指定しておかなければなりません (あるいは、default_server が適切に設定されていることが必要です)。

    server {
        server_name $hostname  192.168.1.1;
    }

また、もし Host ヘッダがないリクエストが来た場合には、サーバ名は空(empty name) として扱われます。このような場合にについて対応したい場合には、サーバ名に "" を利用します。

    server {
        server_name $hostname  ""  192.168.1.1;
    }

あるいは、もしも server_name ディレクティブがサーバブロックに なかった場合には、nginx はサーバ名として空である("")と考えます。

一方、全てにマッチするサーバ名は提供されておらず、default_serverを 利用することが推奨されています。

参考

nginx の ロケーションにおける root ディレクティブは、Apacheと異なり、 リクエストパスが追加される仕組みになっています。もし、Aapcheのような 動作を欲する場合には、alias ディレクティブが用意されています。

    location /photo/ {
        alias /data/images/;
    }

この場合、URI /photo/1.jpg のリクエストに対して、 ファイル /data/images/1.jpg が返されるようになっています。



Noriyo Kanayama