Nginx の場所と proxy_pass パスの設定の問題の概要

Nginx の場所と proxy_pass パスの設定の問題の概要

この記事では、場所の一致が/で終わるかどうか、および proxy_pass の一致が/で終わるかどうかをテストし、テスト プロセス全体を完全に復元します。具体的な状況を理解するのに役立ちます。

1. Nginxロケーションの基本設定

1.1 Nginx 設定ファイル

アップストリームテスト1{
サーバー 127.0.0.1:8000;
}
アップストリームテスト2{
サーバー 127.0.0.1:8000;
}
サーバ{
	サーバー名 test.com;
	聞く 80;
        access_log /usr/local/openresty/nginx/logs/test.com_access.log 最新;
        error_log /usr/local/openresty/nginx/logs/test.com.log エラー;
        proxy_set_header ホスト $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 3秒;
        proxy_read_timeout 120秒;
        proxy_send_timeout 120秒;
        proxy_next_upstream エラー タイムアウト invalid_header http_404 http_502 http_504 http_500;
	
        場所 /user/ {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			proxy_pass http://test1/;
		}
        位置 / {
                proxy_set_header 接続 "";
                プロキシ_http_バージョン 1.1;
                proxy_pass http://test2/;
        }
}

1.2 Pythonスクリプト

python2は実行できる

このスクリプトは、リクエストの内容を取得するために使用されます。 これはバックエンドとして機能し、proxy_pass プロキシのバックエンドになります。

#!/usr/bin/env python

SimpleHTTPServerをインポートする
SocketServerをインポートする

ポート = 8000

クラス GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        印刷(self.headers)
        自己.send_response(200, "")
    def do_POST(self):
        印刷(self.headers)
        content_length = self.headers.getheaders('content-length')
        length = int(content_length[0])、content_lengthの場合、それ以外の場合は0
        印刷(self.rfile.read(長さ))
        自己.send_response(200, "")

ハンドラ = GetHandler
httpd = SocketServer.TCPServer(("", ポート), ハンドラ)
httpd.serve_forever()

2. テスト

2.1、テスト場所

最後に/があり、proxy_pass の最後に/があります

nginxの設定は次のとおりです

 場所 /user/ {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			プロキシパス http://test1/;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷される内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: f2bfe770-4f44-4ee9-91c4-060f59dfb26c
受け入れエンコーディング: gzip、deflate、br


127.0.0.1 - - [2021年4月10日 16:54:26] 「POST /test.html HTTP/1.1」 200 -

結論: proxy_pass アドレスに/が追加された場合、 test.com/user/test.htmlを要求する実際のリクエストはhttp://test1/test.htmlになります。

2.2. テスト場所

proxy_pass の末尾に/があり、末尾に/がありません

nginxの設定は次のとおりです

 場所 /user/ {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			プロキシパス http://test1;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷される内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: e33d0a2c-1965-4152-b87c-94fca50f2899
受け入れエンコーディング: gzip、deflate、br

127.0.0.1 - - [2021年4月10日 16:57:18] 「POST /user/test.html HTTP/1.1」 200 -

結論: proxy_pass アドレスに/がない場合、 test.com/user/test.htmlへの実際のリクエストはhttp://test1/user/test.htmlになります。

2.3. 3つの場所をテストする

末尾の/なし、proxy_pass 末尾の/なし

nginxの設定は次のとおりです

 場所 / ユーザー {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			プロキシパス http://test1;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷される内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: 31cd33c6-4c95-41b5-a095-28cdc7113dcd
受け入れエンコーディング: gzip、deflate、br

127.0.0.1 - - [2021年4月10日 16:59:34] 「POST /user/test.html HTTP/1.1」 200 -

リクエストtest.com/user/test.html実際のリクエストはhttp://test1/user/test.htmlです

2.4、場所が追加されていません

最後の/と proxy_pass と最後の/

nginxの設定は次のとおりです

  場所 / ユーザー {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			プロキシパス http://test1/;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: d0f4b83f-6482-41ba-8a01-c059eececc2d
受け入れエンコーディング: gzip、deflate、br

127.0.0.1 - - [2021年4月10日 17:00:21] 「POST //test.html HTTP/1.1」 200 -

リクエストtest.com/user/test.html実際のリクエストはhttp://test1//test.htmlです

2.5. ロケーション終了

パスの最後に/ proxy_passがあるので、最後に/を追加します

nginxの設定は次のとおりです

   場所 /user/ {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			proxy_pass http://test1/haha/;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷される内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: 6447cf0b-5988-4f96-81a4-2b621fe32604
受け入れエンコーディング: gzip、deflate、br

127.0.0.1 - - [2021年4月10日 17:03:27] 「POST /haha/test.html HTTP/1.1」 200 -

リクエストtest.com/user/test.html実際のリクエストはhttp://test1/haha/test.htmlです

2.6. 場所の終了

パスの最後には/ proxy_passがあり、最後には/がありません

nginxの設定は次のとおりです

 場所 /user/ {
			proxy_set_header 接続 "";
        	プロキシ_http_バージョン 1.1;
			proxy_pass http://test1/haha;
		}

リクエストURL

test.com/user/test.html

バックエンドコンテンツ

印刷される内容:

ホスト: test1
コンテンツの長さ: 0
ユーザーエージェント: PostmanRuntime/7.26.8
受け入れる: */*
郵便配達トークン: 32fb2a50-1e7c-4131-9804-1828e21ca841
受け入れエンコーディング: gzip、deflate、br

127.0.0.1 - - [2021年4月10日 17:05:03] 「POST /hahatest.html HTTP/1.1」 200 -

リクエストtest.com/user/test.html実際のリクエストはhttp://test1/hahatest.htmlです

結論

シリアルナンバーアクセスURL場所の設定proxy_pass 設定バックエンドで受信したリクエスト述べる
1 test.com/user/test.html /ユーザー/ http://test1/ /テスト.html
2 test.com/user/test.html /ユーザー/ http://テスト1 /user/test.html
3 test.com/user/test.html /ユーザーhttp://テスト1 /user/test.html
4 test.com/user/test.html /ユーザーhttp://test1/ //テスト.html
5 test.com/user/test.html /ユーザー/ http://test1/はは/ /haha/テスト.html
6 test.com/user/test.html /ユーザー/ http://test1/はは/ハハテスト.html

上記の表のバックエンドは、Python スクリプトに対応する Web サービスを指すことに注意してください。

日常的なウェブサイトの展開では、 nginxproxy_passリバースプロキシがよく使用されます。proxy_pass proxy_pass設定する際には、明確にする必要がある設定があります。

  • upstram_nameの後に/が現れた場合、それは絶対ルートパスと同等であり、 nginx locationで一致するパス部分をプロキシしません。
  • /がない場合、一致するパス部分もプロキシされます。

Nginx の location と proxy_pass パスの詳細な設定に関するこの記事はこれで終わりです。Nginx の location と proxy_pass パスの設定に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx における proxy_pass のさまざまな使用法の詳細な説明
  • nginx proxy_pass 設定で URL が / で終わる場合と / なしで終わる場合の違いの詳細な説明
  • nginx の場所に複数の Proxy_pass メソッドがある
  • nginx リバース プロキシでの proxy_pass の実装
  • nginx の 2 つのモジュールの proxy_pass の違い

<<:  25 個の CSS フレームワーク、ツール、ソフトウェア、テンプレートを共有

>>:  MySQL移行計画と落とし穴の実践記録

推薦する

MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法の詳細な説明

High Performance MySQL バージョン 3 (セクション 4.1.7) を見ると、...

MySQL マスター スレーブ データが矛盾しています。プロンプト: Slave_SQL_Running: 解決策はありません

この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...

AES_ENCRYPT() と AES_DECRYPT() を使用して MySQL を暗号化および復号化する正しい方法の例

序文最近、仕事でAES_ENCRYPT()関数を使用してプレーンテキストを暗号化し、MySQL に保...

MySQL 接続とコレクションの簡単な分析

結合クエリ結合クエリとは、2 つ以上のテーブル間のマッチング クエリを指し、一般的には水平操作と呼ば...

XHTMLはHTMLのいくつかの廃止された要素を使用しなくなりました

CSS ウェブページレイアウトを行う場合、XHTML1.0 仕様に準拠する必要があることは誰もが知っ...

Deepin で virtualenv をインストールして使用するチュートリアル

virtualenv は、分離された Python 仮想環境を作成するためのツールです。独立したディ...

サイトマップをウェブページの下部に配置するメリットと例

以前は、ほとんどすべての Web サイトに、すべてのページをリストしたサイトマップ ページがありまし...

Podmanはコンテナを自動的に起動し、Dockerと比較します

目次1. podmanの紹介2. Dockerと比較した利点3. 互換性4. バックグラウンド サー...

Windows 8 での MySQL Community Server 5.6 のインストールと設定のチュートリアル

この記事では、Windows 8 での MySQL5.6 のインストールと設定のチュートリアルを記録...

...

MySQLデータベースの一般的な最適化操作のまとめ(経験共有)

序文データ中心のアプリケーションの場合、データベースの品質はプログラムのパフォーマンスに直接影響する...

MySQLの一般クエリログとスロークエリログの分析

MySQL のログには、エラー ログ、バイナリ ログ、一般クエリ ログ、スロー クエリ ログなどが含...

読めばわかるVueの8つのヒント

1. v-forでは常に:keyを使用するデータを操作する必要があるときにプログラムを一定かつ予測可...

CSSを使用してAndroidシステムの読み込みアニメーションを実装する

Web には一般的な読み込みアイコンが 2 つあります。1 つは iOS の「菊」、もう 1 つは ...

MYSQL スロークエリとログの例の説明

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...