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

推薦する

Ubuntu16.04にCUDA9.0をインストールするための詳細なチュートリアル

序文:この記事は、CUDA 9.0 をインストールした経験に基づいています。CUDA 9.0 は現在...

Docker イメージのインポートとエクスポートのコード例

Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...

ウェブデザインでテキストのサイズを合わせる方法: 小さなテキスト、大きな体験

iPadなどのモバイル端末の普及により、人々がモバイル端末で読書に費やす時間はますます長くなり、読...

JavaScript におけるシリアル操作と並列操作

目次1. はじめに2. es5メソッド3. 非同期関数のシリアル実行4. 非同期関数の並列実行5. ...

制限およびオフセット ページング シナリオを使用すると速度が遅くなるのはなぜですか?

質問から始めましょう5 年前、私が Tencent にいたとき、ページング シナリオでは MySQL...

LinuxシステムにDockerをインストールするプロセス

このブログでは、Docker をインストールするプロセスを簡単な手順で説明します。Docker のイ...

Alibaba Cloud イメージリポジトリの Docker 構成変更の実装

docker リポジトリ自体は非常に遅いですが、中国の Alibaba Cloud ミラー リポジト...

ECMAScript の演算子を理解するための記事

目次単項演算子ブール演算子乗算演算子加法演算子関係演算子等価演算子条件演算子代入演算子カンマ演算子要...

MySQLのデッドロックとログに関する詳細な説明

最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...

Vueでデータ例を定義する方法

序文開発プロセスにおいて、変数の定義は非常に頻繁かつ基本的なタスクです。変数の使用シナリオと範囲に応...

Windows での Tomcat サーバーのインストールに関するチュートリアル

1 ダウンロードして準備するまず、公式ウェブサイトからTomcatをダウンロードする必要があります。...

CSS スティッキーレイアウトを使用してヘッダーを上部に配置する方法

適用シナリオ:新しい要件の 1 つはアンケート調査を行うことですが、必然的に多くの質問が含まれ、1 ...

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...

CSSタグの表示モードの詳細な説明

ラベル表示モード(重要) divタグとspanタグ1. スタイルはまったく同じですが、ラベルが異なり...

自動ウェブページ更新と自動ジャンプのサンプルコード

ウェブページの自動更新: <head></head> の間に次のコードを追加...