次の文書の内容。
ディレクティブとブロック
- ディレクティブ: 設定項目、セミコロンで終わるコマンドライン風構文だが、改行は空白扱い(自由フォーマット)。先頭がディレクティブ名、パラメータ〈アーギュメント〉が空白区切りで続く。パラメータが名前構文ならクォート不要。クォートがあってもよい。
- ブロック: ディレクティブとサブブロックの集まりをグループ化する。入れ子構造の構文、ブロック名 { ‥‥ } の形。ブロックの終端記号は不要。ブロック名もまたディレクティブと呼ばれる。単純〈コマンド風〉ディレクティブとブロックディレクティブがある、ということなんだろう。
- serverブロック: おそらく一番重要なブロック
ブロックとディレクティブは記述順に強く影響される。
デフォルトサーバー
サーバーは“概念的サーバー”のこと。リクエスト・ディスパッチ処理が失敗したとき、nginxが選ぶサーバーがデフォルトサーバー。設定ファイルの記述順で最初に出現するserverブロックがデフォルトサーバー記述だが、分かりにくいので明示的に次のように書くべき。
server { listen 80 default_server; server_name example.net www.example.net; ... }
デフォルトサーバーはIPアドレス+ポート番号ごとに1つ指定する。ただし、IPアドレスは省略可能。
また、server_name の省略も許されるが、これもやめたほうがいい。とにかく明示的に書く。デフォルト規則に頼らない。
“Host” ヘッダが未定義のリクエストを処理させたくない場合に、リクエストを単にドロップさせるデフォルトサーバの設定は以下:
server { listen 80 default_server; server_name _; # 省略できない! return 444; # 特別な標準外コード }
listenディレクティブ
listenディレクティブは、IPアドレスとポート番号を指定する。IPアドレスは省略可能。これは、TCP/IPレベルの情報で、HTTPとは無関係。同一のIPアドレス+ポート番号を持ったサーバー達は概念的なグループを形成して、そのなかに1つだけデフォルトサーバーがある。
IPアドレス+ポート番号でのマッチングの後で、HTTP特有の情報である“Host”ヘッダの文字列とのマッチングがなされる。
マッチング
マッチング処理方式は3種類。
マッチング処理でのヒットしたサーバーが選択される。このマッチング処理アルゴリズムが肝。
まず、サーバー名指定の構文による優先順位があり:
文字列が複数のサーバー名指定にマッチ(ヒット)するときは記述順で最初のサーバーが選ばれる。
サーバー名指定構文
ワイルドカード構文は、特殊文字〈ワイルドカード文字〉アスタリスクとドットだが、出現位置は先頭か末尾に限られる。
- 最初がアスタリスク: アスタリスクが、“1つ以上のセグメント名”とマッチする。
- 最後がアスタリスク: アスタリスクが、“1つ以上のセグメント名”とマッチする。
- 最初がドット: .example.org は、完全一致名 example.org とワイルドカード名 *.example.org の両方にマッチ。これは、パッと見で誤解されるリスクがあるので、example.org *.example.org と空白区切りで書いたほうが良い。
完全一致名は、特殊文字(最初のアスタ、最後のアスタ、最初のドット)を含まない名前。IPアドレスは完全一致名の一種で、IPアドレスを表す番号文字列そのもの。
Perl互換の正規表現が使え、最初がチルダだが、単純なサイトではややこしい正規表現は使わない。
空文字列 "" は、“Host” ヘッダ無しのリクエストを処理させたい場合に指定する。
server_name ディレクティブへの複数パラメータ指定は、パターンのORに相当する。
server_name example.org www.example.org "";
最初の2つのパラメータは .example.org で間に合う。
次の書き方もできる。
server_name example.org www.example.org "" 192.168.1.1 ;
次の注意事項がある。
キャッチオール名を指定したり server_name ディレクティブを使用したデフォルトサーバを指定したりする方法はないことに注意してください。
server_name_in_redirect ディレクティブを使うとのこと。