nginx リバース プロキシの魔法のスラッシュについての簡単な説明

nginx リバース プロキシの魔法のスラッシュについての簡単な説明

nginx リバース プロキシを設定する場合、location と proxy_pass のスラッシュによってさまざまな問題が発生する可能性があります。スラッシュが 1 つ多いか少ないかによって、結果がまったく異なります。そのため、location と proxy_pass の後にスラッシュがある場合とない場合を特別に整理して組み合わせ、完全なテストを実施して原理を解明し、姿勢レベルを向上させました。

0. 環境情報

2台のnginxサーバー

nginxA: 192.168.1.48

nginxB: 192.168.1.56

1. 試験方法

nginx A で異なるルールを設定し、nginx A にリクエストします: http://192.168.1.48/foo/api

ログの$requestフィールドを表示して、nginx Bが受信したリクエストを観察します。

2. テストのプロセスと結果

ケース1

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/;
}

nginx B が受信したリクエスト: /api

ケース2

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/;
}

nginx B が受信したリクエスト: //api

ケース3

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/;
}

nginx B が受信したリクエスト: /foo/api

ケース4

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/;
}

nginx B が受信したリクエスト: /foo/api

ケース5

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/bar/;
}

nginx B が受信したリクエスト: /bar/api

ケース6

nginx A 構成:

場所 /foo {
  プロキシパス http://192.168.1.56/bar/;
}

nginx B が受信したリクエスト: /bar//api

ケース7

nginx A 構成:

場所 /foo/ {
  プロキシパス http://192.168.1.56/bar;
}

nginx B が受信したリクエスト: /barapi

ケース8

nginx A 構成:

場所 /foo {
  プロキシパス http://192.168.1.56/bar;
}

nginx B が受信したリクエスト: /bar/api

これを見て目が回りませんか?実はパターンがあるんです。

これらのケースを表に並べると、結果はnginx Bが受信したリクエストを示します。

表1

場合位置プロキシパス結果
1 /フー/ http://192.168.1.48/ /api
2 / フーhttp://192.168.1.48/ //API
3 /フー/ http://192.168.1.48 /foo/api
4 / フーhttp://192.168.1.48 /foo/api

表2

場合位置プロキシパス結果
5 /フー/ http://192.168.1.48/バー/ /バー/api
6 / フーhttp://192.168.1.48/バー/ /バー//api
7 /フー/ http://192.168.1.48/バー/バラピ
8 / フーhttp://192.168.1.48/バー/バー/api

3. 分析

元のリクエストパス: この記事では「/foo/api」と同じ名前を使用します

場所: 上記の表の場所の列

proxy_pass: 上記の表のproxy_pass列

新しいリクエストパス: nginxが元のリクエストパスを処理した後の文字列

proxy_passの分析に焦点を当てます。proxy_passは3つの形式に分けられます。

そして、文字列の後にip:portが続くかどうかによって、2つのカテゴリに分類されます。「/」も文字列なので、1は1つのカテゴリに分類され、2と3は1つのカテゴリに分類されます。以下では、この2つのカテゴリについて説明します。

proxy_pass ip:port の後に文字列が続かない場合、ケース 3 および 4 のように、nginx は元のリクエスト パスをそのまま次の nginx に転送します。

proxy_pass の ip:port の後に文字列が追加されると、nginx は元のリクエスト パスから場所を削除し、残りの文字列を proxy_pass に連結して新しいリクエスト パスを生成し、新しいリクエスト パスを次のステーション nginx に転送します (上記の状況は、削除された文字列が空の文字列であることを除いて、実際にはこれと同じです~~)

最も混乱しやすい例、ケース 7 を見てみましょう。 proxy_pass の ip:port の後に文字列 "/bar" が続くため、場所 "/foo/" は元のリクエスト パス "/foo/api" から削除され、"api" になります。次に、"api" が proxy_pass: http://192.168.1.48/bar に連結され、新しいリクエスト URL "http://192.168.1.48/barapi" が生成されます。そのため、次の段階で nginx が受信するリクエストは "/barapi" になります。

ケース 6: proxy_pass の ip:port の後に文字列 "/bar/" が続くため、location: "/foo" は元のリクエスト パス "/foo/api" から削除されて "/api" になり、その後 "/api" が proxy_pass: http://192.168.1.48/bar/ に連結されて新しいリクエスト パス "http://192.168.1.48/bar//api" が生成されます。そのため、次の段階で nginx が受信するリクエストは /bar//api になります。

同じことが他のケースにも当てはまります。これでようやく理解できましたし、もう混乱する必要もありません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx 7層リバースプロキシと負荷分散についての簡単な説明
  • Kibanaのログイン認証機能を実装するためのNginxリバースプロキシの詳細説明
  • Nginx ダイナミック DNS リバース プロキシの書き方をいくつか詳しく説明します
  • Nginx を Node.js のリバース プロキシとして使用する方法
  • Nginx リバースプロキシのセカンダリドメイン名のバインド方法と注意事項
  • CentOS で nginx リバース プロキシに基づく負荷分散を実装する方法
  • nginx httpsリバースプロキシtomcatを実装する2つの方法
  • Nginx リバース プロキシを介して IP アクセス転送を実装するためのサンプル コード
  • PHPはNginxを使用してリバースプロキシを実装します
  • Nginx リバース プロキシとキャッシュおよびキャッシュのクリア方法

<<:  MySQLデーモンの起動に失敗したエラーの解決方法

>>:  Mysql 5.7.17 をインストールした後、MySQL にログインするチュートリアル

推薦する

Flexレイアウトを使用してヘッドの固定コンテンツ領域のスクロールを実現する方法

ページ ヘッダーの固定レイアウトは、以前は position:fixed を使用して実装されていまし...

MySQLグループクエリ最適化方法

MySQL はほとんどの場合、GROUP BY クエリと DISTINCT クエリを同様に処理します...

js は axios 制限リクエスト キューを実装します

目次背景は次のとおりです。何が起こるでしょうか?背景は次のとおりです。実際の開発では、ネットワークの...

MySQL コピーテーブルと許可分析の 3 つの実装方法

テーブルを素早くコピーする方法まず、テーブル db1.t を作成し、1000 行のデータを挿入します...

DELL R730 サーバーの構成 RAID とインストール サーバー システムとドメイン制御の詳細なグラフィック チュートリアル

最近、会社で DELL R730 サーバーを購入したのですが、偶然次のチュートリアルを見つけたので、...

Windows 10にOdoo12開発環境をインストールする方法

序文多くの友人は Mac コンピューターを持っていないと言っていますが、Windows 開発は実際に...

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

Nodejs-cluster モジュールの知識ポイントの概要と使用例

面接官から「NodeJS で複数のプロセスを開始する方法を教えてください」と尋ねられることがあります...

JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明

目次1. JavaScript がシングルスレッドなのはなぜですか? 2. タスクキュー3. イベン...

HTML TextArea でのフォーマット保存の問題の解決方法

textarea の形式は保存時にデータベースに保存できますが、表示時には /n と相互に変換できな...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

mysql binlog (バイナリログ) を表示する方法

たとえば、新しいテーブルを作成したり、既存のテーブルのデータを更新したりすると、これらのイベントは、...

JavaScript におけるイベント委譲メカニズムと深いコピーと浅いコピーの簡単な分析

目次1. イベントの委任イベントバブリングイベントキャプチャイベントの泡立ちの昇華考える2. 深いコ...

JavaScriptは、マウスが通過したときにドロップダウンボックスを表示するように実装します。

この記事では、マウスがドロップダウンボックスの上を通過するときにドロップダウンボックスを表示するため...

Baidu 入力メソッドが API を公開、自由に移植して使用できると主張

百度入力方式の担当者は、百度入力方式のオープンAPIの最大の利点は操作が便利であることであり、プラッ...