サーバ名
ワイルドカード名 正規表現名 その他の名 国際化された名 仮想サーバの選択 最適化 互換性 |
サーバ名は、server_name ディレクティブを使用して定義され、特定のリクエストにどのserver ブロックを使用するかを決定します。「nginxによるリクエスト処理方法」も参照してください。完全一致名、ワイルドカード名、または正規表現を使用して定義できます。
server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name *.example.org; ... } server { listen 80; server_name mail.*; ... } server { listen 80; server_name ~^(?<user>.+)\.example\.net$; ... }
名前で仮想サーバを検索する場合、名前が指定された複数のバリアント(ワイルドカード名と正規表現の両方が一致するなど)と一致する場合、次の優先順位で最初に一致したバリアントが選択されます。
- 完全一致名
- アスタリスクで始まる最長のワイルドカード名(例:「
*.example.org
」) - アスタリスクで終わる最長のワイルドカード名(例:「
mail.*
」) - 最初に一致した正規表現(設定ファイルでの出現順)
ワイルドカード名
ワイルドカード名は、名前の先頭または末尾、およびドットの境界でのみアスタリスクを含めることができます。「www.*.example.org
」や「w*.example.org
」という名前は無効です。ただし、これらの名前は正規表現を使用して指定できます(例:「~^www\..+\.example\.org$
」と「~^w.*\.example\.org$
」)。アスタリスクは、複数の名前部分を一致させることができます。「*.example.org
」という名前は、www.example.org
だけでなく、www.sub.example.org
にも一致します。
「.example.org
」形式の特別なワイルドカード名は、完全一致名「example.org
」とワイルドカード名「*.example.org
」の両方に一致するために使用できます。
正規表現名
nginxで使用される正規表現は、Perlプログラミング言語(PCRE)で使用される正規表現と互換性があります。正規表現を使用するには、サーバ名はチルダ文字で始まる必要があります。
server_name ~^www\d+\.example\.net$;
そうでない場合は、完全一致名として扱われます。または、式にアスタリスクが含まれている場合は、ワイルドカード名(そしてほとんどの場合、無効なワイルドカード名)として扱われます。「^
」と「$
」のアンカーを設定することを忘れないでください。構文上は必須ではありませんが、論理的には必要です。また、ドメイン名のドットはバックスラッシュでエスケープする必要があることにも注意してください。「{
」と「}
」を含む正規表現は引用符で囲む必要があります。
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
そうしないと、nginxの起動に失敗し、エラーメッセージが表示されます。
directive "server_name" is not terminated by ";" in ...
名前付き正規表現キャプチャは、後で変数として使用できます。
server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; } }
PCREライブラリは、次の構文を使用して名前付きキャプチャをサポートしています。
nginxの起動に失敗し、エラーメッセージが表示された場合
?<
name
>Perl 5.10互換構文(PCRE-7.0以降でサポート) ?'
name
'Perl 5.10互換構文(PCRE-7.0以降でサポート) ?P<
name
>Python互換構文(PCRE-4.0以降でサポート)
pcre_compile() failed: unrecognized character after (?< in ...
これは、PCREライブラリが古く、「?P<
」構文を試す必要があることを意味します。キャプチャは、数値形式でも使用できます。name
>
server { server_name ~^(www\.)?(.+)$; location / { root /sites/$2; } }
ただし、このような使い方は簡単な場合(上記のような場合)に限定する必要があります。数値参照は簡単に上書きされる可能性があるためです。
その他の名
特別に扱われるサーバ名がいくつかあります。
デフォルトでないserverブロックで「Host」ヘッダーフィールドのないリクエストを処理する必要がある場合、空の名前を指定する必要があります。
server { listen 80; server_name example.org www.example.org ""; ... }
serverブロックにserver_nameが定義されていない場合、nginxは空の名前をサーバ名として使用します。
0.8.48までのnginxバージョンでは、この場合、マシンのホスト名がサーバ名として使用されていました。
サーバ名が「$hostname
」(0.9.4)として定義されている場合、マシンのホスト名が使用されます。
サーバ名ではなくIPアドレスを使用してリクエストが行われた場合、「Host」リクエストヘッダーフィールドにはIPアドレスが含まれ、リクエストはIPアドレスをサーバ名として使用して処理できます。
server { listen 80; server_name example.org www.example.org "" 192.168.1.1 ; ... }
キャッチオールサーバの例では、「_
」という奇妙な名前が見られます。
server { listen 80 default_server; server_name _; return 444; }
この名前には特別な意味はなく、単に無数の無効なドメイン名の1つであり、実際のどの名前とも交差することはありません。「--
」や「!@#
」などの他の無効な名前も同様に使用できます。
0.6.25までのnginxバージョンは、誤ってキャッチオール名として解釈された特別な名前「*
」をサポートしていました。キャッチオールサーバ名またはワイルドカードサーバ名として機能したことはありません。代わりに、現在server_name_in_redirectディレクティブによって提供されている機能を提供していました。特別な名前「*
」は現在非推奨となっており、server_name_in_redirectディレクティブを使用する必要があります。server_nameディレクティブを使用して、キャッチオール名またはデフォルトサーバを指定する方法はないことに注意してください。これはlistenディレクティブのプロパティであり、server_nameディレクティブのプロパティではありません。「nginxによるリクエスト処理方法」も参照してください。ポート*:80と*:8080をリッスンするサーバを定義し、一方をポート*:8080のデフォルトサーバに、もう一方をポート*:80のデフォルトサーバにすることができます。
server { listen 80; listen 8080 default_server; server_name example.net; ... } server { listen 80 default_server; listen 8080; server_name example.org; ... }
国際化された名
国際化ドメイン名(IDN)は、server_nameディレクティブでASCII(Punycode)表記を使用して指定する必要があります。
server { listen 80; server_name xn--e1afmkfd.xn--80akhbyknj4f; # пример.испытание ... }
仮想サーバの選択
まず、デフォルトサーバコンテキストで接続が作成されます。次に、サーバ名は、次のリクエスト処理段階で決定できます。各段階は、サーバ設定の選択に関与しています。
-
SSLハンドシェイク中、事前に、SNIに従って
-
リクエスト行の処理後
-
Host
ヘッダーフィールドの処理後 -
リクエスト行の処理後、または
Host
ヘッダーフィールドからサーバ名が決定されなかった場合、nginxは空の名前をサーバ名として使用します。
これらの各段階で、異なるサーバ設定を適用できます。そのため、特定のディレクティブは注意して指定する必要があります。
- ssl_protocolsディレクティブの場合、プロトコルリストは、SNIを介して要求された名前に従ってサーバ設定を適用する前に、OpenSSLライブラリによって設定されます。そのため、プロトコルはデフォルトサーバに対してのみ指定する必要があります。
- client_header_buffer_sizeおよびmerge_slashesディレクティブはリクエスト行の読み込みの前に関与するため、これらのディレクティブはデフォルトサーバ設定またはSNIによって選択されたサーバ設定を使用します。
- ignore_invalid_headers、large_client_header_buffers、およびunderscores_in_headersディレクティブ(リクエストヘッダーフィールドの処理に関与)の場合、リクエスト行または
Host
ヘッダーフィールドに従ってサーバ設定が更新されたかどうかにさらに依存します。 - エラーレスポンスは、現在リクエストを処理しているサーバのerror_pageディレクティブで処理されます。
最適化
完全一致名、アスタリスクで始まるワイルドカード名、アスタリスクで終わるワイルドカード名は、リッスンポートにバインドされた3つのハッシュテーブルに格納されます。ハッシュテーブルのサイズは設定フェーズで最適化されるため、名前をCPUキャッシュミスが最小限で検索できます。ハッシュテーブルの設定の詳細については、別のドキュメントを参照してください。
最初に完全一致名のハッシュテーブルが検索されます。名前が見つからない場合は、アスタリスクで始まるワイルドカード名のハッシュテーブルが検索されます。そこで名前が見つからない場合は、アスタリスクで終わるワイルドカード名のハッシュテーブルが検索されます。
ワイルドカード名のハッシュテーブルの検索は、名前がドメイン部分ごとに検索されるため、完全一致名のハッシュテーブルの検索よりも遅くなります。「.example.org
」という特別なワイルドカード形式は、完全一致名のハッシュテーブルではなく、ワイルドカード名のハッシュテーブルに格納されていることに注意してください。
正規表現は順次テストされるため、最も遅い方法であり、スケーラブルではありません。
これらの理由から、可能であれば完全一致名を使用する方が良いでしょう。たとえば、サーバの最も頻繁に要求される名前がexample.org
とwww.example.org
の場合、明示的に定義する方が効率的です。
server { listen 80; server_name example.org www.example.org *.example.org; ... }
簡略化された形式を使用するよりも
server { listen 80; server_name .example.org; ... }
多数のサーバ名が定義されている場合、または異常に長いサーバ名が定義されている場合、httpレベルでserver_names_hash_max_sizeおよびserver_names_hash_bucket_sizeディレクティブを調整する必要がある場合があります。server_names_hash_bucket_sizeディレクティブのデフォルト値は、CPUキャッシュラインサイズに応じて、32または64、または別の値になる場合があります。デフォルト値が32で、サーバ名が「too.long.server.name.example.org
」として定義されている場合、nginxは起動に失敗し、エラーメッセージが表示されます。
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
この場合、ディレクティブの値を次の2の累乗に増やす必要があります。
http { server_names_hash_bucket_size 64; ...
多数のサーバ名が定義されている場合、別のエラーメッセージが表示されます。
could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32
そのような場合は、まずserver_names_hash_max_sizeをサーバ名の数に近い数値に設定してみてください。それでも効果がない場合、またはnginxの起動時間が許容できないほど長い場合にのみ、server_names_hash_bucket_sizeを増やしてみてください。
サーバがリッスンポートの唯一のサーバである場合、nginxはサーバ名をまったくテストしません(そして、リッスンポートのハッシュテーブルを作成しません)。ただし、例外が1つあります。サーバ名がキャプチャを含む正規表現の場合、nginxはキャプチャを取得するために式を実行する必要があります。
互換性
- 特別なサーバ名「
$hostname
」は、0.9.4以降サポートされています。 - デフォルトのサーバ名値は、0.8.48以降、空の名前""です。
- 名前付き正規表現サーバ名キャプチャは、0.8.25以降サポートされています。
- 正規表現サーバ名キャプチャは、0.7.40以降サポートされています。
- 空のサーバ名""は、0.7.12以降サポートされています。
- ワイルドカードサーバ名または正規表現は、最初のサーバ名として使用する目的で、0.6.25以降サポートされています。
- 正規表現サーバ名は、0.6.7以降サポートされています。
- ワイルドカード形式
example.*
は、0.6.0以降サポートされています。 - 特別な形式
.example.org
は、0.3.18以降サポートされています。 - ワイルドカード形式
*.example.org
は、0.1.13以降サポートされています。
著者:Igor Sysoev 編集:Brian Mercer |