ホームページ  >  記事  >  運用・保守  >  nginx 502 Bad Gatewayエラーを解決する方法

nginx 502 Bad Gatewayエラーを解決する方法

WBOY
WBOY転載
2023-05-20 15:16:064718ブラウズ

nginx 502 のトリガー条件

502 エラーの最も一般的な発生は、バックエンド ホストのクラッシュです。アップストリーム設定には、proxy_next_upstream という設定があります。この設定は、nginx がバックエンド ホストからデータをフェッチするときに発生するエラーの種類を指定します。次のバックエンド ホストに移動します。そこに書かれている内容はすべてです。 502 秒が表示されますが、状況に応じて、デフォルトはエラー タイムアウトになります。エラーはクラッシュ、切断などを指します。タイムアウトは読み取りブロックのタイムアウトを指し、理解しやすいです。通常はすべて次のように書きます:

proxy_next_upstream error timeout valid_header http_500 http_503; ただし、http_500 項目を削除する必要があるかもしれません。http_500 は、バックエンドが 500 エラーを返したときにホストに転送することを指定します。 jsp error その場合、スタックトレース エラー メッセージが大量に出力されるはずですが、現在は 502 に置き換えられています。しかし、会社のプログラマーはそうは考えていません。nginx にエラーがあると信じています。彼らに 502 の原則を説明する時間がありません...

503 エラーは保持される可能性があります。バックエンドは通常 Apache 樹脂なので、Apache がクラッシュするとエラーになりますが、Resin がクラッシュしても 503 だけなので、やはり保持する必要があります。

解決策

502 問題が発生した場合は、次の 2 つの手順に従って解決することを優先できます。

1. 現在の php fastcgi プロセスの数が十分であるかどうかを確認します:

コードをコピーします コードは次のとおりです:

netstat -anpo | grep "php-cgi " | wc -l

実際に使用される「fastcgi プロセス数」が事前設定された「fastcgi プロセス数」に近い場合、「fastcgi プロセス数」が十分ではないことを意味しますそして増やす必要がある。

2. 一部の PHP プログラムの実行時間が nginx の待機時間を超えています。nginx.conf 構成ファイルで fastcgi のタイムアウト時間を適切に増やすことができます。例:

コードをコピーコードは次のとおりです。

http {
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
.. ....

php.iniのmemory_limitを低く設定するとエラーが発生するので、php.iniのmemory_limitを64mに修正してnginxを再起動したところ、問題なかったです。 phpのメモリが不足していることが判明しました。

この変更でも問題を解決できない場合は、次の解決策を参照してください:

1. max-children と max-requests

1 セットの nginx php (fpm) xcache がサーバー上で実行されており、1 日あたりの平均アクセス数は約 300w pv です。

最近、この状況がよく発生します。PHP ページを開くのが非常に遅くなり、CPU 使用率が突然非常に低いレベルに低下し、システム負荷が突然非常に高いレベルに上昇し、トラフィックを確認すると、ネットワーク カードの残量が突然非常に低いレベルに低下したこともわかります。この状態は数秒間続くだけで元に戻ります。

php-fpm のログ ファイルを確認すると、いくつかの手がかりが見つかりました。

コードをコピーします コードは次のとおりです:

sep 30 08:32:23.289973 [notice] fpm_unix_init_main()、271 行目: getrlimit(nofile): max:51200、cur:51200 sep 30 08: 32:23.290212 [通知] fpm_sockets_init_main()、行 371: 継承されたソケット fd=10、「127.0.0.1:9000」を使用 9 月 30 08:32:23.290342 [通知] fpm_event_init_main()、行 109: libevent: を使用していますepoll sep 30 08:32:23.296426 [notice] fpm_init(), line 47: fpm is running, pid 30587

これらの文の前に、子を閉じたり開いたりするためのログが 1,000 行以上あります。子供たち。

php-fpm にはパラメータ max_requests があり、各子が閉じられるまでに処理できるリクエストの最大数を指定することがわかりました。デフォルト設定は 500 です。 PHP は各子にリクエストをポーリングするため、トラフィックが多い場合、各子は max_requests に達するまでにほぼ同じ時間がかかり、そのためすべての子が基本的に同時に閉じられます。

この期間中、nginx は処理のために php ファイルを php-fpm に転送できないため、CPU が非常に低いレベルに低下し (SQL の実行はおろか、php を処理する必要もありません)、負荷が非常に低くなります。非常に高いレベルまで上昇し (子を閉じて有効にし、nginx は php-fpm を待機します)、ネットワーク カードのトラフィックも非常に低くなります (nginx はクライアントに送信するデータを生成できません)

この問題の解決策は非常に簡単です。子の数を増やし、max_requests を 0 未満または比較的大きな値に設定します。

/usr/local/php/etc/php-fpm.conf を開き、値を増やします。次の 2 つのパラメータ (サーバーの実際の状況によると、大きすぎると機能しません)

コードをコピーします コードは次のとおりです:


600

その後、php-fpmを再起動します。

2. バッファ容量を増やす

nginx エラー ログを開き、「上流からの応答ヘッダーの読み取り中に pstream が大きすぎるヘッダーを送信しました」のようなエラー メッセージを見つけます。情報を確認したところ、nginx のバッファーにバグがあり、Web サイトのページ消費によって占有されているバッファーが大きすぎる可能性があることが一般的に考えられます。外国人の方が書かれた改造方法を参考にバッファ容量の設定を増やし、502問題を完全に解決しました。その後、システム管理者はパラメータを調整し、クライアント ヘッド バッファと fastcgi バッファ サイズの 2 つの設定パラメータだけを保持しました。

3.request_terminate_timeout

502 が静的ページ操作で一般的ではなく、主に一部の投稿またはデータベース操作中に発生する場合は、php-fpm.conf 設定の 1 つを確認できます。

request_terminate_timeout

This値は max_execution_time で、fast-cgi のスクリプト実行時間です。

0s

0s は閉じられています。これは、無期限に実行されることを意味します。 (インストール中によく見ずに番号を変更してしまいました) 問題は解決され、しばらくの間エラーなく実行されます。 fastcgi を最適化する場合、この値を 5 秒間変更して効果を確認することもできます。

php-cgi プロセスの数が足りない場合、php の実行時間が長い場合、または php-cgi プロセスが停止した場合、502 エラーが発生します。

nginx 502 不正なゲートウェイ エラーの解決策 2

今日、私の vps で nginx 502 不正なゲートウェイ エラーが頻繁に表示され、vps を再起動すると再び表示されました。非常に迷惑です。少し混乱しています。Web サイトには過去 2 日間で 1290 件のアクセスがありましたが、問題はありませんでした。今回は、なぜ 502 不正なゲートウェイが表示されたのでしょうか?憂鬱だ! ! !長い間検索した結果、ようやく関連する回答がたくさん見つかりました。修正後にこのエラーが再び発生しないことを願っています。ああ、私は長い間インターネットで答えを探してきたので、次回再び Google にアクセスする必要がないように、もちろん役立つことは記録しなければなりません~

lnmp ワンクリック インストール パッケージ、問題が発生しました。まず公式フォーラムにアクセスして検索してください。素晴らしいです。このような公式の固定投稿があります。見てみましょう。

lnmp ワンクリック インストール パッケージ公式:

最初の理由: 現在、lnmp ワンクリック インストール パッケージで最も一般的な問題は 502 不正なゲートウェイです。ほとんどの場合、理由は以前にあります。 php をインストールすると、スクリプト内の一部の lib パッケージがインストールされず、PHP が正常にコンパイルされず、インストールされない可能性があります。
解決策: lnmp ワンクリック インストール パッケージのスクリプトに従って手動でインストールしてみて、どのようなエラーが発生したかを確認できます。

2 番目の理由:

php.ini では、eaccelerator 構成項目を zend オプティマイザー構成の前に配置する必要があります。そうしないと、502 Bad Gateway が発生する可能性があります。

3 番目の理由理由:

インストール中および使用中に 502 問題が発生します。一般に、デフォルトの php-cgi プロセスが 5 であるためです。502 問題が発生するのは、phpcgi プロセスが不十分であることが原因である可能性があります。 /usr/local/ etc/php-fpm.conf の max_children 値を適切に増やしてください。

4 番目の理由:

php 実行タイムアウト。/usr/local/php/etc/php.ini を変更して max_execution_time を 300 に変更します。

5 番目の理由:

mysql ログが多くのスペースを占有するなど、ディスクスペースが不十分です。

6 番目の理由:

php-cgi プロセスが実行されているかどうかを確認してください

一部のネチズンも別の解決策があります:

nginx 502 不正なゲートウェイは、要求された php-cgi が実行されたことを意味しますが、何らかの理由 (通常はリソースの読み取りの問題) により実行されず、結果として php- cgi プロセスが終了する 一般的に、nginx 502 のゲートウェイ不良は php-fpm.conf の設定に関連しています。

php-fpm.conf には 2 つの重要なパラメータがあります。1 つは max_children、もう 1 つは request_terminate_timeout ですが、この値は普遍的ではないため、自分で計算する必要があります。
インストール中および使用中に 502 問題が発生する場合、通常はデフォルトの php-cgi プロセスが 5 であることが原因です。502 を引き起こすほど十分な phpcgi プロセスがない可能性があります。 /usr/local/php/etc/php -fpm を変更する必要があります。conf により、max_children 値が適切に増加します。

計算方法は次のとおりです。

サーバーのパフォーマンスが十分に高く、ブロードバンド リソースが十分で、PHP スクリプトにループやバグがない場合は、request_terminate_timeout を直接次のように設定できます。 0秒。 0 の意味は、php-cgi を時間制限なく実行し続けることを意味します。これができない場合、つまり、php-cgi にバグがある可能性がある、帯域幅が十分でない、またはその他の理由で php-cgi がフリーズする場合は、値を割り当てることをお勧めします。この値はサーバーのパフォーマンスに応じて設定できます。一般に、パフォーマンスが優れているほど、20 分から 30 分の範囲で高く設定できます。
max_children の値はどのように計算されますか?基本的には値が大きいほど優れており、php-cgi プロセスが多いほど高速に処理され、キューに入るリクエストが少なくなります。 max_children の設定もサーバーの性能に合わせて設定する必要がありますが、一般的にサーバー上の php-cgi ごとに消費されるメモリは通常の状態で約 20m です。

公式の回答に従って、関連する可能性を確認し、ネチズンからの回答と組み合わせて、次の解決策を思いつきました。

1. php fastcgi のプロセス数 (max_children 値) を確認する

コード: netstat -anpo | grep "php-cgi" | wc -l

5 (表示されている場合 5)

2. 現在のプロセスを表示します

コード: top
fastcgi プロセスの数を観察します。使用されているプロセスの数が 5 以上の場合、 (マシンの実際の状況に従って) 増やす必要があることを意味します (状況によって異なります)

3. /usr/local/php/etc/php-fpm.conf の関連設定を調整します。

1060s
max_children は最大 10 個のプロセスを持つことができます。プロセスあたり 20MB のメモリ、最大 200MB。
request_terminate_timeout の実行時間は 60 秒、つまり 1 分です。

以上がnginx 502 Bad Gatewayエラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。