proxy_pass を設定した後に Nginx が 404 を返す問題を解決する

proxy_pass を設定した後に Nginx が 404 を返す問題を解決する

1. proxy_pass を設定した後に Nginx が 404 を返す問題のトラブルシューティングと特定

1.1. 問題

複数の転送を伴う本番構成では、要件は次の図のようになります。
proxy_pass を設定した後、www.djx.com を直接リクエストすると、他の例外なしで 404 が返されます。 ただし、バックエンド www.baidu.com に直接リクエストすると、正常に応答します。これはとても奇妙です。 ログを見ると、リクエストは www.baidu.com にも転送されていることがわかります。しかし、リクエスト応答は 404 です。

1.2. 問題の原因を見つける

デフォルトのNginx proxy_set_header設定は

proxy_set_header ホスト $host;
  • サーバー: 192.168.2.189
  • サーバー 1: 192.168.1.180 Nginx1
  • サーバー2: 192.168.1.90 Nginx2

この設定を使用すると、Nginxの第1層(Nginx1)がプロキシしているときに、要求するドメイン名はwww.djx.comで、この要求のヘッダーから取得されるホスト値はwww.djx.comになります。

proxy_set_header ホスト $host;

ホスト値は転送された Host 値に設定されていますが、要求されたドメイン名はwww.baidu.comです。つまり、ヘッダー内のホスト フィールドは www.djx.com です。これは、要求されたドメイン名とヘッダー内の Host の不一致によって発生します。

1.3. proxy_set_header 公式情報

公式ドキュメント

デフォルト設定は

proxy_set_header ホスト $proxy_host;
proxy_set_header 接続を閉じる;

1.4 解決策

Host の値は$proxy_hostに設定されます。 $proxy_hostの値の詳細については、次の拡張機能を参照してください。

proxy_set_header ホスト $proxy_host;

2. 共通構成の拡張

1. $プロキシホスト

proxy_set_header ホスト $proxy_host; 
#デフォルト構成# 名前が示すように、リクエスト ヘッダーはプロキシの背後にあるドメイン名に設定されます。

例1:
アップストリームを設定する場合、$proxy_host の値はアップストリームの名前になります。

アップストリームオープン-hz8443{
サーバー 10.60.6.184:8000 max_fails=1 fail_timeout=3s weight=10;
}

ここでの $proxy_host の値は open-hz8443 です。

例2:
アップストリームを設定しない場合、 $proxy_host の値はproxy_pass後のアドレス ip とポートになります。 10.60.6.184:8000proxy_pass http://www.djx.com:8000; $proxy_host の値はwww.djx.com:8000になります。

場所 ^~ /wss/v1
{
 プロキシパス http://10.60.6.184:8000;
 proxy_set_header ホスト $proxy_host;
 proxy_set_header 接続「アップグレード」;
 proxy_set_header アップグレード $http_upgrade;
 tcp_nodelay オン; 
 
}

2. $ホスト

proxy_set_header ホスト $host;
# フィールドがリクエスト ヘッダーにない場合は渡すことができません。この場合、Host 変数を設定することで、Host 変数に値を割り当てることができます。

リクエスト ヘッダーに Host 値がない場合、server_name の値が直接使用され、それを埋めます。

リクエスト ヘッダー内の Host 値が受信されると、リクエスト ヘッダー内の Host 値が直接使用されます。

3. $ホスト:$プロキシポート

proxy_set_header ホスト $host:$proxy_port;

# サーバー名とポートはプロキシサーバーを介して一緒に渡されます。前の項目と比較すると、追加の $proxy_port があります。この $proxy_port は proxy_pass のポートです。ポートがない場合は、80 や 443 などです。 80/443 充填も使用します。 

例: 
proxy_pass http://www.baidu.com;

$host:$proxy_port = Baidu ip:80

4. $http_host

proxy_set_header ホスト $http_host; 
# 変更されない「Host」リクエスト ヘッダー フィールドは、次のように渡すことができます。

リクエスト ヘッダーに Host 値がない場合、server_name の値が直接使用され、それを埋めます。そしてポートを追加します。 80/443 の場合は追加しないでください。 実際には、URL 内の値を要求します。 http://server:port/v1

リクエスト ヘッダー内の Host 値が受信されると、リクエスト ヘッダー内の Host 値が直接使用されます。

  • サーバー: 192.168.2.189
  • サーバー 1: 192.168.1.180 Nginx1
  • サーバー2: 192.168.1.90 Nginx2

基本設定
192.168.1.180 nginx1

サーバ{
 聞く 80;
 サーバー名 www.djx.com;
 
 位置 / {
  proxy_pass http://www.baidu.com/;
 }
 
}

192.168.1.190 nginx2

サーバ{
 聞く 80;
 サーバー名 www.baidu.com;
 
 位置 / {
  プロキシパス http://192.168.1.80:8080/;
 }
 
}

** 基本設定の使用 **
つまり

proxy_set_header ホスト $proxy_host;

すると、http://192.168.1.80:8080/ へのヘッダーの値は www.baidu.com になります。

** $host を使用する **
つまり

proxy_set_header ホスト $host;

参考記事: https://cloud.tencent.com/developer/article/1557504

Nginx 構成 proxy_pass 後の 404 エラーに関するこの記事はこれで終わりです。Nginx 構成 proxy_pass に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx における accept lock の仕組みと実装の詳細な説明
  • Nginx SSL証明書設定エラーの解決策
  • Nginx 502 Bad Gateway エラーの原因と解決策
  • nginx の場所に複数の Proxy_pass メソッドがある
  • ファイルをダウンロードするための Nginx 設定サンプルコード
  • リクエストを転送したり、静的リソースファイルにアクセスしたりする複数の場所への nginx の実装
  • nginx 設定ファイルパスとリソースファイルパスを表示する方法
  • nginxプロセスロックの実装の詳細な説明

<<:  HTML フォームタグチュートリアル (5): テキストフィールドタグ

>>:  MySQL 文字セットの変更に関する実践的なチュートリアル

推薦する

Python ベースの MySQL レプリケーション ツールの詳細な説明

目次1. はじめに2回目の練習2.1 インストールと設定2.2 コアクラスの紹介2.3 使い方は? ...

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)

序文1. この記事ではMySQL 8.0バージョンを使用していますバージョン5.0と比較すると、パッ...

解析を実装するためにPostgreSQLデータベースを書き込むSQLスクリプト関数

この記事は主に、PostgreSQL データベースを記述して解析を実装する SQL スクリプト関数を...

MySQL 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

このエラーは初心者によく発生します。この記事では主に、エラー 2003 (HY000): '...

Window.nameはクロスドメインデータ転送の問題を解決します

<br />原文: http://research.microsoft.com/~hel...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

MySQL ロックブロッキングの詳細な分析

日常のメンテナンスでは、スレッドがブロックされることが多く、データベースの応答が非常に遅くなります。...

Vue ルーティング遅延読み込みの詳細

目次1. ルートの遅延読み込みとは何ですか? 2. ルートの遅延読み込みの使用1. ルートの遅延読み...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

Mybatis+mysqlはストアドプロシージャを使用してシリアル番号実装コードを生成します。

同時操作によるデータの重複を避けるために、データベースを操作するときにストアドプロシージャを使用して...

HTML でさまざまなスペースの特徴と表現を探る (推奨)

I. 概要HTML テンプレートを作成するときに、テキスト レイアウトの手段としてスペースが使用さ...

乱数、文字列、日付、検証コード、UUIDを生成するMySQLメソッド

目次乱数を生成する0から1までの乱数を生成する指定された範囲内で乱数を生成します6桁のモバイル認証コ...

MySQL は重複データを削除して最小の ID ソリューションを維持します

オンラインで検索して重複データを削除し、ID が最小のデータだけを残します。方法は次のとおりです。 ...