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 {
}
proxy_set_header ホスト $host
2. 上記の設定では、Wireshark 経由でパケットをキャプチャし、クライアントは nginx プロキシにアクセスします。つまり、要求されたホストが 1.1.1.1:2001 の場合、proxy_set_header が設定されていない場合、nginx は nginx プロキシにアクセスします。バックエンドサーバーのホストの場合、Host:backend1
; proxy_set_header 接続を閉じる;host が設定されている場合、nginx がバックエンド サーバーにアクセスするために使用するホストは 1.1.1.1 です。いずれの場合も、バックエンド サーバーがセキュリティ上の理由からリクエスト パケットのホスト フィールドを制限している場合 (2.2.2.2 のみ、つまりサーバー自体のアドレスが適切である場合)、ホスト フィールドへの不正なアクセスはすべて拒否されます。リダイレクトなどの処理が行われると正常にアクセスできなくなるため、この問題が発生したとき、バックエンドサーバーが制限をかけているのではないかと考え始めました。$
proxy_set_header ホスト
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 経由でプロキシすることはできません。 。
解決策
$
host:$server_portで、nginxがリッスンするポートを追加します。
追記').addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i今回はサーバーのHostフィールドの制限の影響を受けないことが判明しましたが、Nginx関係者が推奨しているホストフィールドの制限も注目に値すると個人的には思います。違法なホストは直接拒否されます。
').text(i)); }; $numbering.fadeIn(1700); }); });
上記では、nginx のページが完全にロードされていない、または 502 bad Gateway が表示され、nginx リバース プロキシのポート番号が欠落していることを紹介しました。Bad Gateway の内容も含めて、PHP チュートリアルに興味のある友人に役立つことを願っています。