serverブロックとlisten, server_nameディレクティブ

次の文書の内容。

ディレクティブとブロック
  • ディレクティブ: 設定項目、セミコロンで終わるコマンドライン風構文だが、改行は空白扱い(自由フォーマット)。先頭がディレクティブ名、パラメータ〈アーギュメント〉が空白区切りで続く。パラメータが名前構文ならクォート不要。クォートがあってもよい。
  • ブロック: ディレクティブとサブブロックの集まりをグループ化する。入れ子構造の構文、ブロック名 { ‥‥ } の形。ブロックの終端記号は不要。ブロック名もまたディレクティブと呼ばれる。単純〈コマンド風〉ディレクティブとブロックディレクティブがある、ということなんだろう。
  • 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. 完全一致
  2. ワイルドカード・マッチング
  3. 正規表現マッチング

マッチング処理でのヒットしたサーバーが選択される。このマッチング処理アルゴリズムが肝。

まず、サーバー名指定の構文による優先順位があり:

  1. 完全一致名
  2. アスタリスクで始まるワイルドカード名: *.example.org
  3. アスタリスクで終わるワイルドカード名: mail.*
  4. 正規表現

文字列が複数のサーバー名指定にマッチ(ヒット)するときは記述順で最初のサーバーが選ばれる。

サーバー名指定構文
  1. ワイルドカードパターン
  2. 完全一致名
  3. IPアドレス
  4. 正規表現パターン
  5. 空文字列

ワイルドカード構文は、特殊文字ワイルドカード文字〉アスタリスクとドットだが、出現位置は先頭か末尾に限られる。

  1. 最初がアスタリスクアスタリスクが、“1つ以上のセグメント名”とマッチする。
  2. 最後がアスタリスクアスタリスクが、“1つ以上のセグメント名”とマッチする。
  3. 最初がドット: .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 ディレクティブを使うとのこと。