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

推薦する

Vue双方向バインディングの詳細な説明

目次1. 双方向バインディング2. 他のタグを選択した場合にも同じ結果になりますか? 答えはもちろん...

MySQL InnoDB ReplicaSet の簡単な紹介

目次01 InnoDBレプリカセットの紹介02 InnoDBレプリカセットの制限03 導入前に知って...

CSS 要素の非表示の原則と display:none および visibility:hidden

1. CSS 要素の非表示<br />CSS では、要素を非表示にする (つまり、画面の...

VirtualBox の仮想ディスク vdi ファイルの容量を拡張する方法 (グラフィック チュートリアル)

VirtualBoxのインストールディレクトリを見つけます。ディレクトリ内には容量を拡張するために...

フレームセットの共通プロパティ(フレームとウィンドウの分割)

フレームとは、Web ページ画面を複数のフレームに分割したもの(複数の Web ページという形で表示...

MySQLは実際に分散ロックを実装できる

序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...

Vue はアップロードした画像に透かしを追加できるようになりました (アップグレード版)

vueプロジェクトでは、アップロードした画像に透かしを追加して参照できるようにするアップグレード版...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

Python 仮想環境のインストールとアンインストールの方法と発生する問題

Ubuntu16.04 のインストールとアンインストール pip実験環境Ubuntu 16.04; ...

Dockerの急速な拡張の高度な方法

1. コマンド方式作成された Swarm クラスターで nginx サービスを実行し、--repli...

Mysql sql スロークエリ監視スクリプトコード例

1. my.cnfを変更する #全体的な効果としては、グローバルがオンになっている場合はテーブルとロ...

Nginxの書き換えモジュールの詳細な説明

書き換えモジュールは ngx_http_rewrite_module モジュールです。その主な機能は...

VMware に CentOS7 をインストールし (静的 IP アドレスを設定)、Docker コンテナ経由で mySql データベースをインストールする (非常に詳細なチュートリアル)

2 年生から、これらのインストールと設定の仕方を尋ねられました。簡単なチュートリアルを作成し、ここ...

CSSでemを開く正しい方法の詳細な説明

「通常 1em=16px」と言うのはなぜですか?ユーザーのブラウザによってレンダリングされるデフォル...