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 にログインするチュートリアル

推薦する

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

JavaScript実行メカニズムの詳細な紹介

目次1. プロセスとスレッドの概念2. ブラウザの原則3. 同期と非同期4. 実行スタックとタスクキ...

Linux Samba サーバーの超詳細なインストールと構成 (問題解決付き)

目次Samba サーバーの紹介Samba サーバー コンポーネントSamba サーバー関連の設定ファ...

Windows システムに mysql5.7.21 をインストールするための詳細なチュートリアル

MySQL インストーラーは、MySQL ソフトウェアのあらゆるニーズに対応する、使いやすいウィザー...

Windows で nginx を素早くインストールし、自動的に起動するように設定する

目次1. Windows システムでの Nginx のインストールと起動プロセス: 2. 起動時にN...

CSS でハニカム/六角形アトラスを実装するためのサンプルコード

理由は分かりませんが、UIではハニカム効果(手を広げたような効果)のデザインが好まれます。 1. 六...

JavaScript で同時実行制御を実装する方法

目次1. 同時実行制御の概要1.1 フェーズ1 1.2 フェーズ2 1.3 フェーズ3 2. 同時実...

MySQL の時間設定に関する考慮事項の詳細な要約

時間は本当に存在するのでしょうか?時間は人間が考え出した概念に過ぎず、物事の変化を測る基準に過ぎない...

HTMLはBaidu百科事典のナビゲーションドロップダウンメニュー機能を模倣します

HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...

Docker-compose を使用して GitLab をデプロイする方法

Docker-compose は GitLab をデプロイします1. Dockerをインストールする...

Vue での ElementUI の使用に関する詳細な説明

ログイン + セッションストレージエフェクト表示ログインに成功すると、ユーザー ID がフロントエン...

NODE.JS を使用して WEBSERVER を作成する手順

目次Node.jsとはNodeJSをインストールするNode を使用して Hello World を...

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...

WeChatアプレットは記録機能を実装します

この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...

Linux でリモート サーバー ファイルの状態を表示する方法

以下のように表示されます。 test コマンドはファイルが存在するかどうかを判断します。 ssh u...