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 のインストールと設定方法のグラフィック チュートリアル

ブログ    

推薦する

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

Alipay の Java 決済インターフェースを開発するための詳細な手順

目次最初のステップステップ2ステップ3ステップ4 Alipay 決済インターフェースへの接続に関する...

MySQL でよく使われる型変換関数の概要 (推奨)

1. Concat関数。よく使用される接続文字列: concat 関数。たとえば、SQLクエリ条件...

Vueシャトルボックスは上下の動きを実現します

この記事の例では、vueシャトルボックスを上下に動かすための具体的なコードを参考までに共有しています...

VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

CentOS7 システムを使用するのは今回が初めてで、ネットワーク構成を行う際に多くの問題が発生し...

JavaScript で二分探索木を実装する

JavaScriptでの検索二分木実装は参考までに。具体的な内容は以下のとおりです。バイナリ検索木 ...

Linux statコマンドの使用

1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...

MySQL での外部キーの作成、制約、削除

序文MySQL バージョン 3.23.44 以降では、InnoDB エンジン タイプのテーブルは外部...

MySQLパスワードを変更するいくつかの方法

序文:データベースを日常的に使用すると、パスワードが単純すぎて変更する必要がある場合、パスワードの有...

海外の無料写真素材サイトベスト9

良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...

マウスを傾けた状態でのフリップナビゲーションの問題に関する研究

この記事では、マウス フリップナビゲーションの制作についてまだ疑問を持っている友人の役に立つことを期...

フレックスレイアウトの互換性の問題の概要

1. W3C バージョンの flex 2009年版フラグ: display: box; または bo...

Nginx でバージョン番号を隠す方法

Nginx はバージョン番号を非表示にする実稼働環境では、セキュリティ上の脆弱性の漏洩を避けるために...

MySQL 8の新機能である降順インデックスの基礎となる実装の詳細な説明

降順インデックスとは何ですか?インデックスについてはよくご存知かもしれませんが、降順インデックスにつ...

VMware 仮想マシンのネットワークの問題の解決方法

目次1. 問題の説明2. 問題解決1. 仮想マシンシステムのインストール時にネットワークがない場合2...