Nginx 構成の場所の一致ルールの例の説明

Nginx 構成の場所の一致ルールの例の説明

nginx の設定命令のスコープは、main、server、location の 3 種類に分けられます。実際、これら 3 つは順番に含まれているのではなく、互いに独立しています。たとえば、main レベルのスコープのみを持つディレクティブは、server または location に記述できません。モジュールの特定の命令は、main、server、location スコープを同時に持つことができます。また、各モジュールには、main、srv、loc の 3 つのレベルの設定があります。モジュールの main レベルの設定は、すべてのサーバーと場所で共有され、srv レベルの設定はすべての場所で共有されます。location には、独自の独立した loc レベルの設定のみがあります。そのため、モジュールの srv レベルと loc レベルの設定はマージする必要があり、main レベルの設定はマージする必要はありません。少しわかりにくいように思われるかもしれませんが、形容詞と名前の違いに似て、スコープレベルとサブジェクトとして main、server、location を区別することで、nginx の設定関係を理解するのは難しくありません。

一般的に言えば、リクエスト URL が来ると、nginx はそれを特定の場所に解析して処理します。この解析プロセスは、実際には、場所の構成に応じて、文字列一致と正規表現一致の 2 つのタイプに分けられます。場所を整理する最も簡単な方法は、それらを直接リンクリストとして保存することです。URL を解析するときに、それらを 1 つずつトラバースすることで、対応する場所を見つけることができます。ただし、これは非効率すぎるため、nginx のような高性能サーバーにはまったく望ましくありません。nginx は、文字列が一致する場所を 3 本柱の文字列ソート ツリーに整理し、ツリーを確立するときにツリーのバランスも考慮します。ソースコードの実装については、記事の後半で詳しく紹介します。

まず、nginx wiki (http://wiki.nginx.org/HttpCoreModule#location) の例を使用して、場所の種類と一致ルールを簡単に紹介します。

場所の優先順位の公式ドキュメント

  • クエリに正確に一致する = プレフィックスを持つディレクティブ。見つかった場合は、検索が停止します。
  • 残りのすべてのディレクティブは、従来の文字列で、最も長い一致が最初に表示されます。この一致に ^~ プレフィックスが使用されている場合、検索は停止します。
  • 構成ファイルでの定義順の正規表現。
  • #3 が一致した場合はその結果が使用されます。そうでない場合は、#2 の一致が使用されます。

= プレフィックスはこのクエリと完全に一致します。見つかった場合は検索を中止します。

残りのすべての通常の文字列の中で、最も長い一致。この一致の前に ^~ が付いている場合、検索は停止します。

構成ファイルで定義された順序での正規表現。

ルール 3 が一致した場合は、その結果が使用されます。それ以外の場合は、ルール 2 と同じルールが使用されます。

例えば

場所 = / { 
 # 「/」のみに一致します。 
 [ 構成A ]  
} 
位置 / { 
 # すべてのリクエストは "/" で始まるため、どのリクエストにも一致します。# ただし、より長い文字の一致または正規表現の一致が優先されます [ 構成 B ]  
} 
場所 ^~ /images/ { 
 # /images/ で始まるリクエストに一致し、他の場所との一致は停止します 
 [ 構成 C ]  
} 
場所 ~* \.(gif|jpg|jpeg)$ { 
 # gif、jpg、またはjpegで終わるリクエストに一致します。  
 # ただし、/images/ ディレクトリへのすべてのリクエストは [構成 C] によって処理されます。   
 [ 構成 D ]  
}

上記の例では、5 つの異なる種類の場所があることがわかります。「~」プレフィックスが付いた 4 番目の場所は、通常の一致が必要な場所です。Nginx は、URL を解析するときに、これら 5 つの異なる種類の場所に異なる優先ルールを持っています。一般的なルールは次のとおりです。

1. 文字列が「=」で始まる場所と完全に一致する場合は停止し、この場所の構成を使用します。

2. 文字列は、残りの非正規の場所と非特殊な場所に一致します。「^~」プレフィックスが付いた場所が一致した場合は停止します。

3. 通常のマッチングでは、マッチング順序は構成ファイル内で場所が出現する順序になります。通常の場所が一致する場合は停止してこの場所の構成を使用します。それ以外の場合は、手順 2 で取得した文字列の一致が最大となる場所の構成を使用します。

たとえば、次のリクエストの場合:

1, / -> 最初の場所と完全に一致し、一致が停止し、構成Aを使用する

2. /some/other/url -> まず、文字列のプレフィックス部分が 2 番目の場所と一致し、次に正規表現の一致が実行されます。明らかに一致するものはないので、2 番目の場所の構成 B が使用されます。

3. /images/1.jpg -> まず、文字列のプレフィックス部分が 2 番目の場所と一致しますが、その後 3 番目の場所もプレフィックスと一致します。この時点で、設定ファイル内のこの URL に対する最大の文字列一致であり、場所には "^~" プレフィックスがあるため、正規表現のマッチングは実行されず、最終的に設定 C が使用されます。

4. /some/other/path/to/1.jpg -> まず、同じ文字列のプレフィックス部分が 2 番目の場所と一致し、次に正規表現が一致します。正規表現が一致した場合は、構成 D が使用されます。

リクエスト URI の例:

/ -> 構成Aに準拠
/documents/document.html -> 構成 B に一致
/images/1.gif -> 構成Cに一致
/documents/1.jpg -> 構成 D に一致
@location 例 error_page 404 = @fetch;

場所 @fetch(
proxy_pass http://fetch;
)

位置マッチングコマンド

  • ~ #波線は通常の一致を示し、大文字と小文字が区別されます
  • ~* # は大文字と小文字を区別せずに通常の一致を実行することを示します
  • ^~ #^~ は通常の文字の一致を示します。このオプションが一致する場合、このオプションのみが一致し、他のオプションは一致しません。通常はディレクトリの一致に使用されます。
  • = # 共通文字の完全一致を実行します
  • @ #"@" は、error_page、try_files などの内部ターゲットに使用される名前付き場所を定義します。

場所のマッチングの優先順位(設定ファイル内の場所の順序に関係なく)

= 完全一致が最初に処理されます。完全一致が見つかった場合、nginx はそれ以上の一致の検索を停止します。

通常の文字マッチング、正規表現ルール、長いブロックルールはクエリマッチングよりも優先されます。つまり、アイテムが一致する場合、正規表現の一致とより長い一致があるかどうかを確認する必要があります。

^~ はこのルールにのみ一致するため、nginx は他の一致の検索を停止します。それ以外の場合、nginx は他の場所の指示の処理を続行します。

最後に、「~」と「~*」を含む命令が一致します。対応する一致が見つかった場合、nginx は他の一致の検索を停止します。正規表現がない場合、または正規表現が一致しない場合は、一致度が最も高い逐語的一致命令が使用されます。

nginx 構成の場所のマッチング ルールの例に関するこの記事はこれで終わりです。nginx 構成の場所のマッチング ルールに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 1 つの記事で Nginx ロケーション マッチングの実装を理解する
  • Nginx 設定場所のマッチング優先順位の簡単な分析
  • Nginx ロケーション設定(ロケーションのマッチング順序)の詳細な説明
  • nginx のロケーションと書き換えの使用法の詳細な説明
  • Nginx におけるサーバーとロケーションのマッチングロジックの詳細な理解

<<:  auto.jsを使用して毎日の自動チェックイン機能を実現する

>>:  MacOS での MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル

推薦する

HTML テーブル マークアップ チュートリアル (48): CSS で変更されたテーブル

<br />では、CSS 構文を巧みに使用してテーブルを美しくする方法を見てみましょう。...

MySQL は制限を使用してページング例メソッドを実装します

1. 制限の基本的な実装一般的に、クライアントは、pageNo (ページ番号) と pageSize...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

Linux curl フォームのログインまたは送信と Cookie の使用に関する詳細な説明

序文この記事では主に、curl を介してフォーム送信ログインを実装する方法について説明します。単一の...

スプレッド演算子のサンプルコードと JavaScript での応用

スプレッド演算子を使用すると、式をある時点で展開できます。スプレッド演算子は、複数のパラメーター (...

arcgis.js は、マップ本体の表示範囲を制御し、領域を超えた場合に自動的にバウンスするようにします (実装のアイデア)

目次背景効果アイデア背景少し前に、会社のプロジェクトで問題が発生しました。地図のベースマップ領域の範...

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

JavaScript 配列の Reduce() メソッドの構文と例の分析

序文Reduce() メソッドは関数を累積器として受け取り、配列内の各値 (左から右へ) が単一の値...

MySql マスタースレーブレプリケーションの実装原理と構成

データベースの読み取りと書き込みの分離は、トラフィック量の多い大規模システムやインターネット アプリ...

Podmanはコンテナを自動的に起動し、Dockerと比較します

目次1. podmanの紹介2. Dockerと比較した利点3. 互換性4. バックグラウンド サー...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows)

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカ...

MySQL スロークエリログの役割と公開

序文MySQL スロー クエリ ログは、MySQL が提供するログ レコードの一種です。これは、応答...

スペース均等互換性の問題を解決する2つの方法についての簡単な説明

flex は 2009 年のリリース以来、ほぼすべてのブラウザでサポートされています。シンプルでレス...

よく使用される MySQL 関数の完全なリスト (分類および要約)

1. 数学関数ABS(x) xの絶対値を返します。 BIN(x) xの2進値を返します(OCTは8...

HTML(CSSスタイル仕様)を読む必要があります

CSS スタイル仕様1. クラスセレクター2. タグセレクター3. IDセレクター4. CSSスタイ...