nginxの設定 その3(バーチャルサーバ構築に必要な設定)

メモ:

「nginxの設定 その1、その2」と、インストール時に作成されるnginxの設定ファイルについて一つずつ確認してきましたが、ここでは実運用に必要になりそうな設定について確認していきたいと思います。

indexディレクティブ(省略時に使われるインデックスファイルの設定)

indexディレクティブは、リクエストのURIにファイルが指定されていない場合にインデックスとして使われるファイル名を設定します。indexディレクティブは、httpコンテキスト、serverコンテキスト、locationコンテキストに記述することができます。

例えば、index.phpも省略時の対象としたい場合、次のように記述します。

index index.html index.php;

try_filesディレクティブ(ファイルの存在確認を行う設定)

try_filesディレクティブは、存在をチェックするファイルやディレクトリと存在しなかったときにリダイレクトするURIのパスを設定したりステータスコードを設定することができます。チェックするファイルやディレクトリは、スペースで区切って複数記述でき順に存在確認が行われます。いずれも存在しない場合、最後のパラメータで指定したURIへ内部リダイレクトが行われます。

try_filesディレクティブの設定は、次のフォーマットで記述します。

try_files ファイル ... uri;
try_files ファイル ... =code;

実際の使用例として、例えばPHP-FPMと連携したい場合、次のような設定をしました。

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

この例では、次のような処理が行われます。

  1. URLのパスにファイルが存在するか?
  2. 1 がなかった場合、URLのパスにディレクトリが存在するか?
  3. 1も2もなかった場合、指定したロケーションにリダイレクトする。

error_pageディレクティブとlocation

「nginxの設定 その2」で少しふれたのですが、もう少し詳細にerror_pageディレクティブの使い方を確認していきます。

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

error_page コード ... [=[レスポンスコード]] uri;

コードにはHTTPステータスコードを複数記述できます。「=レスポンスコード」は、オプションとなっており設定した場合はレスポンスコードを返します。「=」だけを指定した場合は、内部リダイレクト先から受け取ったステータスコードを返します。URIの部分には、パスだけを指定したりフルで指定する事ができます。

例えば、500番台のサーバエラーが発生した時に「/50x.html」ページへ内部リダイレクトしたい場合は、次のように設定します。

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root   /var/www/public/error;
}

allowディレクティブ,denyディレクティブ(アクセス制御の設定)

allow、denyディレクティブは、IPアドレスやネットワークアドレス単位でアクセス制御を行うように設定できます。allow、denyディレクティブの設定は、次のフォーマットで記述します。

allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;

例えば、次の例ではIPアドレスが192.168.1.1を除いて192.168.1.0./24及び10.1.1.0/16へアクセスが許可されIPv6の2001:0db8::/32にもアクセスが許可されます。最後にそれ以外は、すべて拒否となります。 このアクセス制御は、条件が一致するものが見つかるまで順にチェックされていきます。

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

internalディレクティブ

internalディレクティブは、指定したロケーションを内部リダイレクトにのみ使いたい場合に設定します。外部から直接アクセスすることはできなくなります。

例えば、次の例では404エラーが発生したときに/404.htmlに内部リダイレクトしますが、外部から直接このページのURI(/404.html)を指定してアクセスしてきても見ることはできません。

error_page 404 /404.html;

location /404.html {
    internal;
}