Nginx がリクエストを処理する際のマッチングルールの詳細な分析

Nginx がリクエストを処理する際のマッチングルールの詳細な分析

nginx はリクエストを受信すると、まず server_name でサーバーを照合し、次にサーバー内の場所を使用して照合を続行します。

server_name に一致

nginx では、server_name によって、リクエストを受信したときにどのサーバーが使用されるかが決まります。nginx は、リクエスト ヘッダーの Host フィールドを使用して server_name と照合します。server_name を定義するときは、フル ネーム、ワイルドカード名、または正規表現名を使用できます。照合順序は次のとおりです。

  • 完全一致
  • 文字列の前のワイルドカード文字、つまり *.example.org
  • ワイルドカードマッチング後、例: mail.*
  • 正規表現マッチング

一致するものが見つからない場合は、default_server が処理に使用されます。定義されていない場合は、最初に定義されたものが使用されます。例として 3 つの単純なサーバーを使用し、ポート 80 を listen し、server_name をそれぞれ *.org、*.net、*.com に設定します。

サーバー{
 聞く 80;
 サーバー名 example.org www.example.org;
 401 を返します。
}

サーバー{
 聞く 80;
 サーバー名 example.net www.example.net;
 402 を返します。
}

サーバー{
 聞く 80;
 サーバー名 example.com www.example.com;
 403 を返します。
}

上記の設定では、デフォルト サーバーは最初のサーバーです。存在しないサーバーにアクセスすると、401 が返されます。ただし、default_server を使用して手動でデフォルト ホストを設定できます。default_server は、次のように listen フィールドで設定されます。

サーバー{
 80 default_server をリッスンします。
 サーバー名 example.net www.example.net;
}

再度マッチングを行った際に、一致するものが見つからない場合は、このサーバーが使用されます。

アクセスが拒否されました

ホスト フィールドのないリクエストを禁止する場合は、次のサーバーを定義できます。

サーバー{
 聞く 80;
 サーバー名 "";
 444を返します。
}

server_name は空の文字列として定義されます。Host フィールドが空であるか存在しない場合は、このサーバーが一致し、404 ステータス コードが返されます。

Nginx の 444 ステータスは特殊です。444 が返された場合、Web サイトに接続できないのと同様に、クライアントはサーバーから返された情報を受け取らず、ブラウザには直接 502 が表示されます。ただし、リバース プロキシを使用している場合は、通常のステータス コードが表示されます。

存在しないホストへのアクセスを禁止したい場合は、次のように定義できます。

サーバー{
 80 default_server をリッスンします。
 サーバー名_;
 444を返します。
}

_ には特別な意味はありません。ドメイン名は _ 内には表示されないため、実際のドメイン名と同じにはなりません。他の不正な文字についても同様です。

IPとserver_nameの両方に一致

次に、異なるリスニング IP と異なる server_name の混在を処理する方法を見てみましょう。

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.org www.example.org;
}

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.net www.example.net;
}

サーバー{
 192.168.1.2:80 を聴く;
 サーバー名 example.com www.example.com;
}

この設定では、nginx は最初に IP を照合し、次に server_name を照合します。一致する server_name がない場合、デフォルトのサーバーが使用されます。たとえば、ドメイン名 www.example.com のリクエストが 192.168.1.1:80 から送信され、192.168.1.1:80 でリッスンしているサーバーが 2 つしかなく、どちらも www.example.com に一致しない場合は、2 つのサーバーのデフォルトのホストが使用されます。リスナーの定義に default_server が使用されていないため、デフォルトは最初のサーバー www.example.org です。もちろん、default_server を定義することもできます。

サーバー{
 192.168.1.1:80 を聴く;
 サーバー名 example.org www.example.org;
}

サーバー{
 192.168.1.1:80 default_server をリッスンします。
 サーバー名 example.net www.example.net;
}

サーバー{
 192.168.1.2:80 default_server をリッスンします。
 サーバー名 example.com www.example.com;
}

一致する場所

nginx はサーバーに一致した後、場所を介してリクエストの処理を続行します。次に例を示します。

サーバー{
 172.17.0.3:80を聴く;
 サーバー名_;

 位置 / {
 401 を返します。
 }

 場所 ~*\.(gif|jpg|png)$ {
 402 を返します。
 }
 
 場所 ~*\.(gif|jpg|png)$ {
 404 を返します。
 }

 場所 /api {
 403 を返します。
 }
}

Nginx は最初にすべての場所でプレフィックスを検索して一致させます。プレフィックスを一致させた後、正規表現で定義された場所を順番に一致させます。一致した場合は終了します。一致しない場合は、前にプレフィックスと一致した場所を使用して処理します。以下は、特定の一致の例です。

  • /x.gif リクエストは、最初にプレフィックス / と一致し、次に残りの x.gif と場所の正規表現を使用して一致し、最初に場所 ~*\.(gif|jpg|png)$ と一致し、402 を返します。
  • /x.pdf リクエストは、x.pdf が一致しないため、場所 / を使用して処理されます。
  • /api/x.gif は、最初にプレフィックス /api と一致し、次に残りの x.gif と場所の正規表現を使用して一致し、最初に場所 ~*\.(gif|jpg|png)$ と一致し、402 を返します。
  • /api/x.pdf へのリクエストは、x.pdf が一致しないため、場所 /api を使用して処理されます。

参照する

  • nginxがリクエストを処理する方法
  • サーバー名

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Nginx ロケーションマッチングルールの詳細な説明
  • Nginxサーバのロケーションディレクティブマッチングルールの詳細な説明
  • Nginx ロケーションマッチングルールの例
  • nginx マッチングルールの簡単な概要 (推奨)
  • Nginx のロケーション マッチング ルールの概要
  • Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要

<<:  MySQL マスターとスレーブの不整合とその解決策の詳細な説明

>>:  {{ }} で関数を直接使用する WeChat アプレットの例

推薦する

Keepalived は Nginx の負荷分散と高可用性のサンプル コードを実装します

第1章: keepalivedの紹介VRRP プロトコルの目的は、静的ルーティングの単一点障害問題を...

Redission-tomcatは、単一マシンから複数マシンへの展開を迅速に実装します。

序文一部のプロジェクトの初期段階では、シンプルさとスピードのために、開発と展開は単一のマシンで行われ...

虫眼鏡の詳細のJavaScript実装

目次1. レンダリング2. 実施原則3. まとめ1. レンダリング 2. 実施原則幅と高さが等しい拡...

MySQL の NULL と空の文字列

最近、MySQL に触れました。昨日、テーブル構造情報を格納するための新しいテーブルを作成しました。...

MySQLステートメントを監視する方法の詳細な説明

クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...

Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

序文Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上さ...

CSS3アニメーションジャミングソリューションについての簡単な説明

なぜ詰まっているのでしょうか?言及しなければならない前提があります。フロントエンド開発者は皆、ブラウ...

MySQL 同時実行制御の原則に関する知識ポイント

Mysql は、高性能なデータ ストレージ サービスを提供する主流のオープン ソース リレーショナル...

CSS3アニメーションを使用した簡単な指クリックアニメーションの実装例

この記事では主に、CSS3 アニメーションで簡単な指クリックアニメーションを実装する例を紹介し、皆さ...

Linux ファイルディレクトリ管理コマンドの概要

タッチコマンドこれには 2 つの機能があります。1 つは、既存のファイルの時間タグを現在のシステム時...

React+TS を使用したシンプルな Jira プロジェクトを実装するためのベスト プラクティス

トレーニングのための一連のプロジェクト反応+ts内容は少ないですが、フックのカプセル化、ts ジェネ...

スライダー効果を実装するミニプログラム

この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...

Vue3 での watchEffect の使用に関する簡単な分析

序文誰もが vue2 の watch API に精通している必要があります。vue2 の vue イ...

検索ナビゲーションバー付きの CSS サンプルコード

この記事では、CSS を使用して検索機能付きのナビゲーション バーを作成する方法を説明します。以下の...

WeChatミニプログラム開発のためのコンポーネント設計仕様

WeChat ミニプログラム コンポーネント設計仕様コンポーネントベースの開発という考え方は、私の開...