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 文字セットの変更に関する実践的なチュートリアル

推薦する

1 つ以上の Linux インスタンスから SSH キー ペアのバインドを解除します。

キーペアの分離1 つ以上の Linux インスタンスから SSH キー ペアのバインドを解除します。...

ウェブ クラスターの Docker Stack 展開方法の手順

Docker はますます成熟し、その機能もますます強力になっています。 Docker Stack を...

MySQL フルテキスト検索の中国語ソリューションとサンプルコード

MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...

フロントエンドの上級者向けコースでは、JavaScript のストレージ機能の使い方を学習します。

目次序文背景実施計画の考え方js ストレージ機能ソリューション設計やっと要約する序文どの SaaS ...

タグのターゲットリンクを iframe に向ける方法

コードをコピーコードは次のとおりです。 <iframe id="myFrameId&...

HTML tbody の使用

構造化テーブル (IExplore のみ) 1) 行ごとにグループ化<thead> .....

Ubuntuのバックアップ方法(4種類)のまとめ

方法1:リスピンを使用するには、次の手順に従ってください。 sudo add-apt-reposit...

テーブルリストを破棄するには、標準のdl、dt、ddタグを使用します。

現在、ますます多くのフロントエンド開発者が、元のテーブル レイアウトを xHTML + CSS に置...

Link と @import の違いを詳しく見る

ページで CSS を使用する主な方法は、スタイル属性値をインラインで追加する方法、ページ ヘッダーで...

MySql 自動切り捨て例の詳細な説明

MySql 自動切り捨て例の詳細な説明友人が質問しました。プロジェクト内で挿入または更新ステートメン...

Tomcatにデプロイされたアプリケーションがフロントエンドページにアクセスできない問題について

最近、実践的なトレーニング プロジェクトを実行する際に ssm フレームワークを使用しました。プロジ...

Linuxで新しいユーザーを作成し、指定されたディレクトリへの権限を付与する

1 ユーザーを作成し、ユーザーのルートパスとパスワードを指定します useradd -d /home...

Centos7 で Java8 と MySQL をインストールしてデプロイする

通常、Java の学習とプロジェクトのデプロイはローカルで行われますが、実稼働環境は Linux 環...

Docker ベースの GitLab 環境をデプロイする方法と手順

注意:仮想マシンのメモリは2G以上が推奨され、 Alibaba Cloudのアクセラレーションイメー...

写真とテキストによる MySQL 8.0.21 インストール チュートリアル

1. ダウンロードリンクをダウンロードするダウンロードをクリックします。Oracle アカウントにロ...