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)

推薦する

MySQL Installer 8.0.21 インストール チュートリアル (画像とテキスト付き)

1. 理由新しいシステムに MySQL を再インストールする必要があったので、将来詳細を忘れた場合...

JavaScript の Set データ構造の詳細な説明

目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...

Vue で wangeditor リッチテキスト編集を使用する際の問題

wangEditor は、JavaScript と CSS に基づいて開発された Web リッチ テ...

Nginx をベースに特定の IP への短期アクセス数を制限する

特定の期間内に特定の IP へのアクセス回数を制限する方法は、特に悪意のある DDOS 攻撃に直面し...

ElasticSearch と ElasticSearch-Head の Docker デプロイメントの実装

この記事では主にDockerを使ってElasticSearch:バージョン6.8.4をデプロイする方...

コーディングスキルを向上させるためのJavaScriptのヒント

目次1. 一意の値をフィルタリングする2. 短絡評価2.1 シナリオ例3. ブール変換4. 文字列を...

Vueがsweetalert2プロンプトコンポーネントを統合する際の問題についてお話ししましょう

目次1. プロジェクト統合1. CDNインポート方法: 2. 箱の梱包を確認する3. 迅速な箱詰め4...

プロセスのすべての情報を表示するLinuxメソッドの例

サーバー上にタスク プロセスがあります。 ps -ef | grep task を使用して表示すると...

html5 の新しいメソッドを使用して JavaScript で要素クラス名を操作する方法の詳細な説明

目次1. classList属性2. 実用化以前の JavaScript では、最初にクラス属性を取...

関数の分類の詳細な説明とJavascriptでのこのポイントの例

JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...

mysql5.7.19 winx64 インストールおよび構成方法のグラフィック チュートリアル (win10)

mysql 5.7.19 winx64のインストールチュートリアルは以下のように記録され、みんなと...

Centos8 に nginx をインストールするための詳細なチュートリアル (画像とテキスト)

Nginx (「エンジン エックス」と発音) は、インターネット上の最大規模のサイトの負荷を処理す...

CSS の inline-block の最小幅値の詳細な説明

序文最近、私は夜に時間を取って「CSS World」という本を読んでいます。この本は非常に興味深く、...

VMware WorkStation 14 pro インストール Ubuntu 17.04 チュートリアル

この記事では、VMware Workstation14 ProにUBuntu17.04をインストール...

MySQL リンクを表示し、異常なリンクを削除する方法

序文:データベースの運用や保守の際には、リンクの総数がいくつあるか、アクティブなリンクがいくつあるか...