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

推薦する

Tomcatの全体構造の簡単な紹介

Tomcat は Web コンテナとして広く知られています。Java を学び始めたときから現在の仕事...

vite+vue3+element-plus プロジェクトをビルドする手順

viteを使用してvue3プロジェクトを構築するターミナルで次のコマンドを実行すると、Vite を使...

JavaScriptエラーキャプチャの詳細な説明

目次1. 基本的な使い方とロジック2. 特徴3. エラーオブジェクト4. キャッチアンドスロー戦略の...

Ubuntu にグラフィック ドライバーが正常にインストールされたかどうかを確認する方法

次のコマンドを実行します: glxinfo | grep レンダリング結果が「はい」の場合、グラフィ...

Linuxカーネルスケジューラソースコード初期化の分析

目次1. はじめに2. スケジューラの基本概念2.1. 実行キュー (rq) 2.2 スケジューリン...

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

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

エレガントなJSコードの書き方

目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...

CSS 円形ホローイングの実装(クーポン背景画像)

この記事では主に、クーポンの背景画像などでよく使われる CSS 円形ホローイングについて紹介し、皆さ...

Mysql 5.7.18 MySQL proxies_priv を使用して同様のユーザーグループ管理を実装する

MySQL proxies_priv(シミュレートされたロール)を使用して同様のユーザーグループ管理...

Linux 上の Nginx に複数のバージョンの PHP をインストールする

サーバーの LNPM 環境をインストールして構成する場合、複数のバージョンの PHP の共存を考慮す...

mysql エラー 1033 を解決する方法: ファイル内の情報が正しくありません: 'xxx.frm'

問題の説明1. 収集ステーションのデータベース2. データが無い状態での移動は問題ありませんが、デー...

WindowsにOpenSSLをインストールし、OpenSSLを使用して公開鍵と秘密鍵を生成します。

1. OpenSSL公式サイト公式ダウンロードアドレス: https://www.openssl....

スライドドアを実装するための CSS サンプルコード

いわゆるスライディングドアテクノロジーとは、さまざまな長さのテキストに合わせてボックスの背景を自動的...

MySQLオンラインDDLの使用に関する詳細な説明

目次文章LOCKパラメータアルゴリズムパラメータCOPY TABLE プロセスIN-PLACEプロセ...

Tudou.comのホームページのデザイン方法

<br />私は数年間フロントエンドに取り組んできました。フロントエンドについて完全に理...