ホームページ  >  記事  >  運用・保守  >  Nginx のサーバーと場所のマッチング ロジックは何ですか?

Nginx のサーバーと場所のマッチング ロジックは何ですか?

WBOY
WBOY転載
2023-05-12 11:10:251722ブラウズ

サーバー マッチング ロジック

nginx がリクエストを実行するサーバー ブロックを決定するとき、主にサーバー ブロックの listen フィールドと server_name フィールドに焦点を当てます

listen コマンド

listen フィールドは、サーバー応答の IP とポートを定義します。listen フィールドが明示的に設定されていない場合、デフォルトの listen は 0.0.0.0:80 (root) または0.0.0.0:8080 (非ルート)

listen は次のように構成できます:

  1. IP とポートの組み合わせ

  2. 単一の ip、デフォルトはポート 80 をリッスンします

  3. 単一ポート、デフォルトはすべての IP インターフェースをリッスンします

  4. Unix ソケット パス

最後の項目は通常、異なるサーバー間でリクエストを渡すためにのみ使用されます

使用するサーバーを選択するためのルールは次のとおりです:

  1. nginx まず、listen フィールドのないすべての「不完全な」 listen 命令を listen 0.0.0.0:80 に、listen 1.1.1.1 を listen 1.1.1.1:80 に、などに変換します。

  2. nginx は、要求された IP とポートに基づいてリクエストに最も一致するサーバー ブロック リストを作成します。最初に特定の IP を指定するサーバー ブロックと一致し、次にリッスンするサーバー ブロックを選択します。ただし、どちらの場合であっても、ポートは完全に一致する必要があります

  3. 最適一致が 1 つだけの場合は、一致するサーバー ブロックが応答に使用されますそれ以外の場合は、各サーバー ブロックのserver_name ディレクティブが評価されます

繰り返しになりますが、server_name ディレクティブは、listen ディレクティブが最適な一致を見つけられなかった場合にのみ評価されます。 ##たとえば、example.com ドメイン名が 192.168.0.1 を指しており、192.168.0.1 にある nginx には次の 2 つのサーバー ブロックのみがあると想定します:

# server block 1server {
  listen 192.168.0.1;
  server_name other.com
  ...
}

# server block 2server {
  listen 80;
  server_name example.com
  ...
}

server_name ディレクティブ

listen ディレクティブに従って最適な一致が取得できない場合は、server_name ディレクティブの解析が開始されます。nginx はリクエストの「host」ヘッダーをチェックします。この値には、ドメイン名または IP アドレスが含まれていますクライアントは実際にリクエストを試みています。nginx はこの値に基づいて server_name ディレクティブと一致します。一致ルールは次のとおりです:

    nginx は、この値に正確に一致するサーバー ブロックを見つけようとします。 server_name と host の値。複数の完全一致が見つかった場合は、最初に一致したサーバー ブロックが使用されます
  1. 完全に一致するサーバー ブロックが見つからない場合、nginx は、server_name のサーバー ブロックを見つけようとします。 * で始まります。複数のサーバー ブロックが見つかった場合は、最も長く一致するサーバー ブロックが選択されます。
  2. If で始まるサーバー ブロックが見つからない場合は、で終わるサーバー ブロックが検索されます。複数の一致がある場合は、最も長い一致が選択されます。
  3. #* に一致するサーバー ブロックが見つからない場合は、正規表現 (開始) を使用して、server_name を定義するサーバー ブロックを検索します。複数の一致が見つかった場合は、最初の一致が使用されます
  4. 正規表現の一致が見つからないサーバー ブロックの場合、nginx は listen フィールドに一致するデフォルトのサーバー ブロックを選択します. 各 IP とポートの組み合わせは、1 つだけのデフォルトの default_server ブロックで構成できます。そうでない場合は、使用可能なリストの最初のものが選択されます。サーバー (この時点での選択はランダムであり、順序は固定されていません)
  5. 例は次のとおりです。

(1) 正確なサーバー名一致、例:

server {
   listen    80;
   server_name www.domain.com;
   ...
}

(2) * ワイルドカードで始まる文字列:

server {
   listen    80;
   server_name *.domain.com;
   ...
}

(3) * ワイルドカードで終わる文字列:

server {
   listen    80;
   server_name www.*;
   ...
}

(4) 一致する正規表現:

server {
   listen    80;
   server_name ~^(?.+)\.domain\.com$;
   ...
}

(5) 上記のいずれにも一致しない場合は、default_server が使用されます。 default_server が指定されていない場合、最初に利用可能なサーバーが選択されます。一致するホスト値がない場合に、クライアントにエラーが返されるように指定できます。他のユーザーがスパム トラフィックを Web サイトにリダイレクトするのを防ぐために使用できます。

server {
  listen 80  default_server;
  server_name _;  return 444;
}

nginx の非標準エラー コード 444 を返すことで、nginx がブラウザから切断されるようにします。

ロケーション マッチング ロジック

location 構文分析

location optional_modifier location_match {
  ...
}
利用可能な修飾子は次のとおりです

Nginx のサーバーと場所のマッチング ロジックは何ですか?決定ルール

1. nginx は最初に Prefixed に基づいてチェックします位置の一致 (つまり、正規表現を含まない一致)

2. 要求された URL と完全に一致する = 修飾子を使用した位置ブロックがある場合、その位置は要求に応答するために直ちに使用されます。

3. = 修飾子と一致するロケーション ブロックが見つからない場合、不正確なプレフィックスが計算され続け、指定された URI に基づいて最長一致するプレフィックスが検索され、次の処理が実行されます。 :

(1) 最長一致する場所に ^~ 修飾子があり、nginx はすぐにこの場所を使用してリクエストに応答する場合

(2) 最長一致する場所に ^~ 修飾子がない場合^~ 修飾子を使用すると、nginx は match. を一時的に保存し、その後のマッチング

4 を継続します。最長一致するプレフィックスの場所ブロックを決定して保存した後、nginx は正規表現の一致する場所 (大文字と小文字を区別します) を引き続きチェックします。 /case-insensitive). 正規表現がある場合 必要な一致が満たされた場合、リクエストされた URI に一致する最初の正規表現の場所がリクエストに応答するために選択されます

5. 正規表現がない場合要求された URI に一致する場所が見つかった場合は、以前の場所が使用されます。最長保存されたプレフィックス ロケーション応答リクエスト

補足

通常、リクエストに応答するために特定の場所を使用することを選択すると、リクエストは他の場所に関係なく、その場所内で処理されます。ただし、その場所での特定の指示により、次のような新しい場所の一致がトリガーされます。

(1)try_files

(2)rewrite

(3)error_page

以上がNginx のサーバーと場所のマッチング ロジックは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。