ホームページ  >  記事  >  バックエンド開発  >  nginx ページが完全にロードされていないか、502bad ゲートウェイが表示され、nginx リバース プロキシ ポート番号がありません。LeTV 502 不正なゲートウェイ dnf 502 不正なゲートウェイとはどういう意味ですか?

nginx ページが完全にロードされていないか、502bad ゲートウェイが表示され、nginx リバース プロキシ ポート番号がありません。LeTV 502 不正なゲートウェイ dnf 502 不正なゲートウェイとはどういう意味ですか?

WBOY
WBOYオリジナル
2016-07-29 08:53:572093ブラウズ

Nginx リバース プロキシ モードでは、ページが完全にロードされないか、502 不正なゲートウェイが直接発生する可能性があります。

502 不正なゲートウェイが発生する状況は数多くありますが、その主な原因は nginx 関連のタイムアウト設定の問題です。以下では、注意が必要な比較的まれな状況について説明します。

外観環境

nginx はリバース プロキシ モードで動作し、80 以外のポートをリッスンします (これは非常に重要です。80 以外のポートをリッスンするということは、多くの場合、ユーザーが複数の仮想ホストを構成する準備をしていることを意味しますが、これに限定されません)状況)、IP アクセスの形式で(ドメイン名アクセスの下にも存在する必要がありますが、これは検証されていません)。

具体的な問題

複数の要素を含むページ (静的な HTML ページだけでなく、クライアントは画像、CSS 形式などの複数の要素をサーバーに要求することがよくあります) を含むページにアクセスする場合、クライアントがアクセスするページは不完全であり、画像スタイルなどの要素が欠如しており、502 不正なゲートウェイ エラーが返されます。

問題分析

私が最初にこの問題に遭遇したとき、ホストフィールドの値が不正でバックエンドサーバーによってブロックされたためだと思いました。その理由は次のとおりです。 1. nginx リスニング アドレスが 1.1.1.1:2001、プロキシ アドレスが 2.2.2.2、プロキシ サーバーが次のようにアップストリームに構成されていると仮定します。 listen 1.1.1.1:2001;

アップストリーム バックエンド1 {

サーバー 2.2.2.2

}

proxy_set_header ホスト $host

プロキシパス http://backend1

2. 上記の設定では、Wireshark 経由でパケットをキャプチャし、クライアントは nginx プロキシにアクセスします。つまり、要求されたホストが 1.1.1.1:2001 の場合、proxy_set_header が設定されていない場合、nginx は nginx プロキシにアクセスします。バックエンドサーバーのホストの場合、Host:backend1

(Nginx 公式ドキュメントには、プロキシサーバーに渡されるリクエストヘッダーにフィールドを再定義または追加できると記載されています。値には、テキスト、変数、およびそれらの組み合わせを含めることができます。これらのディレクティブは次のとおりです。現在のレベルで proxy_set_header ディレクティブが定義されていない場合にのみ、前のレベルから継承されます。デフォルトでは、次の 2 つのフィールドのみが再定義されます。 proxy_set_header ホスト $proxy_host
; proxy_set_header 接続を閉じる;



proxy_set_header ホスト

$
host が設定されている場合、nginx がバックエンド サーバーにアクセスするために使用するホストは 1.1.1.1 です。いずれの場合も、バックエンド サーバーがセキュリティ上の理由からリクエスト パケットのホスト フィールドを制限している場合 (2.2.2.2 のみ、つまりサーバー自体のアドレスが適切である場合)、ホスト フィールドへの不正なアクセスはすべて拒否されます。リダイレクトなどの処理が行われると正常にアクセスできなくなるため、この問題が発生したとき、バックエンドサーバーが制限をかけているのではないかと考え始めました。

3. よく考えてみると、バックエンド サーバーがアクセス パッケージのホスト フィールドを実際に制限しているのであれば、特定の要素を制限し、他の要素を制限していないサーバーはほとんどありません。さらなるパケット キャプチャ分析を通じて、クライアントが複数の要素を含むページに初めてアクセスした後、サーバーはそのページに含まれる他の要素のアドレスをクライアントに伝えるため、クライアントは引き続き Web ページの取得を要求できます。完全な情報が得られ、サーバーは、クライアントの他の要素のアドレスの ip:port が、nginx がサーバーと通信するために使用するホスト フィールドとまったく同じであることを伝えます (nginx がリバース プロキシを実行することは理解できます)。ポートがホストに設定されておらず、デフォルトは 80 です (これが、nginx がポート 80 をリッスンすることが多い理由です。問題ありません)。クライアントは、この返されたアドレスに基づいてページ要素を取得します。 4. 上記の状況では、proxy_set_header Host $host が設定されている場合、クライアントがページの他の要素にアクセスするためのアドレスは http://1.1.1.1/… となることがわかります。プロキシですが、ここで問題が発生します。nginx リスニング ポートは 1.1.1.1:2001 で、新しいアクセスは 1.1.1.1:80 (http ポートのデフォルトは 80、https のデフォルトは 443) であるため、リクエストを nginx 経由でプロキシすることはできません。 。
解決策

解決策も非常に簡単で、proxy_set_header Host

$

host:

$server_portで、nginxがリッスンするポートを追加します。

追記

今回はサーバーのHostフィールドの制限の影響を受けないことが判明しましたが、Nginx関係者が推奨しているホストフィールドの制限も注目に値すると個人的には思います。違法なホストは直接拒否されます。

')​​.addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i

').text(i)); }; $numbering.fadeIn(1700); }); });

上記では、nginx のページが完全にロードされていない、または 502 bad Gateway が表示され、nginx リバース プロキシのポート番号が欠落していることを紹介しました。Bad Gateway の内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。