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 データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用

この記事では、ビュー、トランザクション、インデックス、自己接続、ユーザー管理など、MySQL データ...

Dockerコンテナ起動時に固定IPを設定する実装

Dockerインストール後のネットワークタイプ [root@insure updev]# docke...

Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項

/************************ * Linux メモリ管理 *********...

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に...

意外と知らないJSのループ速度テストのいろいろを徹底解説

目次序文1. forループ2. whileループとdo-whileループ3. forEach、map...

Linux での Hbase のインストールと設定のチュートリアル

目次Linux での Hbase のインストールと設定1. Hbaseインストールパッケージをダウン...

docker-composeの詳細なインストールと使用方法

Docker Compose は、複雑なアプリケーションを定義および実行するための Docker ツ...

Mysql データベース ストアド プロシージャの基本構文の説明

プロシージャ sp_name を削除します//これまで、MYSQL 構文の基礎知識について説明して...

JavaScript 構造化代入の詳細な説明

目次コンセプト配列の分割値を個別に宣言して割り当てるデフォルト値の構造化解除変数値の交換関数によって...

MySQL 5.7.18 のインストール中に MySQL サービスの起動に失敗する問題の解決策

MySQL は非常に強力なリレーショナル データベースです。しかし、初心者の中には、インストールや設...

AngularとIonicのライフサイクルとフック関数を素早く理解するための記事

目次角度成し遂げる呼び出し順序知らせイオニックionic はページのライフサイクルをどのように処理し...

CentOS に Redis と MySQL をインストールする

1|0MySQL(MariaDB) 1|11. 説明MariaDB データベース管理システムは My...

マインスイーパゲームを実装するための jQuery プラグイン (1)

この記事では、jQueryプラグインを使用したマインスイーパゲームの最初の記事の具体的なコードを参考...

Linux/Mac MySQL パスワードを忘れた場合の対処方法

Linux/Mac の MySQL パスワードを忘れた場合はどうすればいいですか?心配しないでくださ...

Windows に異なる (2 つの) バージョンの MySQL データベースをインストールする詳細なチュートリアル

1. 原因: SQL ファイルをインポートする必要があるのですが、インポートできません。この文を実行...