nginx サーバーでの 502 不正なゲートウェイ エラーの原因のトラブルシューティング

nginx サーバーでの 502 不正なゲートウェイ エラーの原因のトラブルシューティング

パブリックアカウントのファンデータを同期してバッチプッシュするときに、サーバーがエラー502を報告します

エラーメッセージによると、バックエンドの問題であると判断できます。502 エラーの原因はさまざまですが、一般的にはサーバーが処理できないことが原因です。

1.まずサーバーログを確認する
1) まず nginx ログを確認します。詳しくない場合は、nginx.conf から error_log のパスを取得し、次のようにしてエラーを見つけることができます。

ここに画像の説明を挿入

nginxプロセスによって処理される接続数が十分ではなく、単一のプロセスによって処理される接続数がnginx.confで設定されたworker_connections値を超えていることが判明しました。

ここに画像の説明を挿入

通常、worker_connections の値は、単一のプロセスによって開かれる接続の最大数を参照できます。コマンドは次のとおりです: ulimit -n
ulimit -a すべての制限パラメータを表示します。現在開いているファイルの最大数は 65535 です。worker_connections を 51200 に設定できます。

nginxを再起動します。nginx -s reload

現在の TCP 接続ステータスを表示します。netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'

2) php-fpm ログを確認します。ログの場所がわからない場合は、php-fpm.conf から確認できます。php7 以降の設定ファイルは、php-fpm.d ディレクトリの下の www.conf ディレクトリに配置されていることに注意してください。

php-fpm.log を表示

ここに画像の説明を挿入

pm.max_children が十分ではないことが分かりました。これは、php-fpm プロセスの最大数が小さすぎることを示しています。php 設定ファイル ww.conf を確認し、パラメータ pm.max_children=100 を変更します。

php-fpmは主にいくつかのパラメータを調整します
pm = dynamic 子プロセスを制御する方法。オプションは静的と動的です。

pm.max_children: 静的モードで開かれる php-fpm プロセスの数 pm.max_requests: php-fpm 子プロセスが処理できるリクエストの最大数 pm.start_servers: 動的モードで開始される php-fpm プロセスの数 pm.min_spare_servers: 動的モードでの php-fpm プロセスの最小数 pm.max_spare_servers: 動的モードでの php-fpm プロセスの最大数

1. pm.max_children と pm.max_spare_servers の適切な値は何ですか?

原則として、この値が大きいほど良いです。php-cgi プロセスが多いほど、処理が速くなり、キューに入れられるリクエストが少なくなります。
「max_children」の設定も、サーバーのパフォーマンスに応じて設定する必要があります。

メモリ/30Mで数値を取得することもできます。例えばメモリが8GBの場合は100に設定できるので、php-fpmが消費するメモリを2G~3G程度に抑えることができます。

256M メモリの VPS などメモリの少ないサーバーの場合、20M のメモリ容量で計算しても、10 個の php-cgi プロセスで 200M のメモリを消費するため、システムがクラッシュするのは正常です。

したがって、php-fpm プロセスの数を制御し、他のアプリケーションによって占有されているメモリを大まかに把握する必要があります。
小さな静的量を割り当てると、システムの安定性が向上します。あるいは動的メソッドを使用する、
動的メソッドは不要なプロセスを終了し、メモリの一部を再利用するため、メモリが少ないサーバーや VPS で使用することをお勧めします。具体的な最大値はメモリ/30Mで算出されます。

pm.start_servers のデフォルト値の計算式は、min_spare_servers + (max_spare_servers - min_spare_servers) / 2 です。

たとえば、512M の VPS があり、php-fpm に最大 250M を割り当てる場合は、pm.max_spare_servers を 250/30、つまり約 8 に設定することをお勧めします。 pm.min_spare_servers については、サーバーの負荷に応じて設定することをお勧めします。たとえば、サーバーに PHP 環境のみが展開されている場合、より適切な値は 2 〜 5 です。

ここで別の問題があります。php-fpm は、一部のサードパーティ ライブラリが原因でメモリ リークを引き起こす可能性があります。時間が経つにつれて、メモリを多く占有するようになります。たとえば、当社のサーバーは現在約 50m を占有しています。幸い、pm.max_requests パラメータがあり、このパラメータは、プロセスを再起動する前に php-fpm 子プロセスが実行される回数を指定します。実際の状況に応じて調整する必要があるかもしれません。

計算は次のようになります。

一般的に言えば、通常の状況では、サーバー上の各 PHP-CGI によって消費されるメモリは約 20M ~ 30M なので、私は "max_children" を 40、つまり 20M*40=800M に設定しました。つまり、ピーク時には、すべての PHP-CGI によって消費されるメモリは 800M 以内となり、有効メモリの 2Gb よりも低くなります。

「max_children」が 5 ~ 10 などの小さい値に設定されている場合、php-cgi は「非常に疲れた」状態になり、処理速度が非常に遅くなり、待機時間が長くなり、CPU 使用率が高くなります。

リクエストが長時間処理されない場合、504 Gateway Time-out エラーが表示され、処理中の php-cgi に問題が発生すると、502 Bad gateway エラーが表示されます。

max_childrenを設定する最良の方法は、req/sに基づくことです。
(スループット、単位時間あたりにサーバーが処理するリクエストの最大数、単位req/s)を設定する。
プログラムの処理能力が 100 リクエスト/秒の場合、100 に設定するのが適切です。これは動的に調整されます。

2. 適切な request_terminate_timeout 値は何ですか?

計算は次のようになります。

サーバーのパフォーマンスが十分に良好で、帯域幅リソースが十分であり、PHP スクリプトにループやバグがない場合は、「request_terminate_timeout」を直接 0 秒に設定できます。 0s は、PHP-CGI が時間制限なしで実行し続けることを意味します。

これができない場合、つまり、PHP-CGI にバグがあるか、帯域幅が十分でないか、その他の理由で PHP-CGI がハングしている場合は、サーバーのパフォーマンスに応じて設定できる「request_terminate_timeout」に値を割り当てることをお勧めします。

一般的に、パフォーマンスが良ければ高いほど、設定できる時間は長くなりますが、20 分から 30 分程度で十分です。私のサーバーの PHP スクリプトは長時間実行する必要があり、一部は 10 分を超える可能性があるため、900 秒に設定しました。これにより、PHP-CGI が停止して 502 Bad gateway エラーが発生することはありません。

最適化されたパラメータ

/usr/local/php/etc/php-fpm.d/www.conf を編集します。
サーバー構成: 2コア 8G
pm = ダイナミック
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 100

リクエスト終了タイムアウト=1200

サービスのプロセスIDを調べる
ps 補助 |grep php-fpm
kill -9 プロセスIDはゾンビプロセスを強制終了するのによく使用されます

nginx の 502 エラーの原因をまとめます

2. プロキシ バッファが小さすぎます。nginx リバース プロキシを使用している場合、ヘッダーが大きすぎてデフォルトの 1k を超えると、上記のアップストリームが大きすぎるヘッダーを送信します (簡単に言うと、nginx は外部リクエストをバックエンドに送信して処理しますが、バックエンドから返されるヘッダーが大きすぎて nginx が処理できず、502 が発生します)。

サーバー{

聞く 80;
サーバー名 *.lxy.me;

位置 / {

次の3行を追加します
fastcgi_buffer_size 64k;
fastcgi_buffers 32 32k;
fastcgi_busy_buffers_size 128k;
次の3行を追加します
proxy_set_header ホスト $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
…………
}

3. php-cgi プロセスのデフォルトの数が少なすぎるため、インストール時および使用時に 502 の問題が発生する可能性があります。通常、これは php-cgi プロセスのデフォルトの数が 5 であるためです。502 は、phpcgi プロセスが不足していることが原因である可能性があります。/usr/local/php/etc/php-fpm.conf を変更し、max_children 値を適切に増やす必要があります。 max_requests 値が十分でない可能性もあります。これら 2 つの設定項目は大量のメモリを消費するので、サーバーの構成に応じて設定してください。そうしないと逆の効果が出る可能性があります。

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

5. Nginxの待機時間タイムアウトPHPプログラムによっては、実行時間がNginxの待機時間を超えてしまうことがあります。nginx.conf設定ファイルでFastCGIのタイムアウト時間を適切に増やすことができます。

http {
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

}

6. パブリックアカウントで作業している場合は、WeChat サーバーから自分のサーバーへのリクエストが多すぎることが原因である可能性があることに注意してください。php-fpm プロセスの数が最大プロセス数に達した場合は、php-fpm 構成ファイルを確認すると、エラー メッセージが表示されます。

nginx サーバー例外 502 不正ゲートウェイの原因のトラブルシューティングに関するこの記事はこれで終わりです。nginx サーバー例外 502 不正ゲートウェイに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx 502 Bad Gateway エラーの原因と解決策
  • Nginx 502 Bad Gateway エラーの 4 つの一般的な原因と解決策
  • 深掘り: Nginx 502 Bad Gateway エラーを修正する方法
  • フロントエンド例外 502 不正なゲートウェイの原因と解決策

<<:  Web データ ストレージ: Cookie、UserData、SessionStorage、WebSqlDatabase

>>:  MySQL 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

推薦する

nginxのインストールと設定の詳細なプロセス記録

目次1 nginxの紹介1 nginxとは何か2 つのアプリケーション シナリオ2 nginxのイン...

MySQLを水平から垂直に、垂直から水平に変換する方法

データの初期化 `test_01` が存在する場合はテーブルを削除します。 テーブル「test_01...

Tomcatアーキテクチャの原則をアーキテクチャ設計に分析する

目次1. 学習目標1.1. Tomcatアーキテクチャの設計と原則をマスターして社内スキルを向上させ...

Vue が Ref を使用してレベル間でコンポーネントを取得する手順

VueはRefを使用してレベル間でコンポーネントインスタンスを取得します例の紹介開発プロセスでは、レ...

HTML5+CSS3コーディング標準

黄金律プロジェクトに何人の人が取り組んでいるかに関係なく、すべてのコード行が同じ人によって書かれたよ...

入力ファイルのカスタムボタンの美化(デモ)

以前にも同じような記事を書いたことがありますが、js スクリプトを使用しており、ファイルパスを表示で...

Nginx 構成 クロスドメイン リクエスト Access-Control-Allow-Origin * 詳細な説明

序文403 クロスオリジン エラーが発生しNo 'Access-Control-Allow-...

MySQL 整合性制約の定義と例のチュートリアル

目次整合性制約整合性制約の定義整合性制約の分類主キー制約単一の主キーと複合主キーの違い主キーフィール...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

Springboot プロジェクトの Docker-compose イメージリリースプロセス分析

導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...

Alibaba Cloud ECSインスタンスのユーザールートパスワードとリモート接続方法を設定する方法

Alibaba Cloud サーバーを購入した後、新しいインスタンスが正常に動作できるようにするには...

Vueカスタムツリーコントロールの使い方の詳細な説明

この記事では、Vueカスタムツリーコントロールの使い方を参考までに紹介します。具体的な内容は次のとお...

HTMLでアンカーの位置を設定するためのいくつかの一般的な方法

HTML でアンカーの位置を設定する方法はいくつかあるので、ここで紹介します。 1. ID ポジショ...

CentOS 7 ブートカーネルの切り替えとブートモードの切り替えの説明

Centos7 スイッチブートカーネル注: 必要に応じて、最初にyum update -yを実行して...

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...