Articles

Nginx502Bad gateway:PHP-FPM

tip/nginx/502bad gateway/php

編集者の注意:php-fpmは、その主なプロセスを記述するために”マスター”という用語を使用します。 Datadogはこの用語を使用しません。 このブログ記事では、特定のプロセス名を参照する必要がある場合を明確にするために、これを”プライマリ”と呼びます。この投稿は、NGINX502Bad Gatewayエラーのトラブルシューティングに関するシリーズの一部です。 PHP-FPMを使用していない場合は、gunicornをバックエンドとして使用したNGINX502sのトラブルシューティングに関する他の記事をチェックしてください。PHP-FastCGI Process Manager(PHP-FPM)は、PHPアプリケーションのwebサーバー要求を処理するためのデーモンです。 本番環境では、PHP-FPMは多くの場合、NGINX webサーバーの背後にデプロイされます。 NGINXはwebリクエストをプロキシし、PHPアプリケーションを実行するPHP-FPMワーカープロセスに渡します。

ブラウザからNGINXへのリクエストの流れをPHP-FPMに戻して示した図です。

NGINXは、PHP-FPMへのリクエストを正常にプロキシできない場合、またはPHP-FPMが応答に失敗した場合、502Bad Gatewayエラーを返します。 この記事では、NGINX/PHP-FPMスタックの502エラーの一般的な原因をいくつか調べ、これらのエラーの解決に役立つ情報をどこで見つけることができるかについDatadogを使用して、nginx502Bad Gatewayエラーの背後にあるメトリック、ログ、およびトレースを調べます。

502sのいくつかの考えられる原因

このセクションでは、次の条件によりNGINXが502エラーを返す可能性がある方法について説明します。

  • PHP-FPMが実行されていません
  • NGINXはPHP-FPMと通信できません
  • PHP-FPMがタイムアウトしています

NGINXがPHP-fpmと通信できない場合

NGINXがPHP-fpmと通信できない場合

FPMこれらの理由のいずれかのために、アクセスログ(/var/log/nginx/access)にこれを記録して、502エラーで応答します。ログ)この例に示すように:

アクセス。NGINXのアクセスログには502エラーの原因は説明されていませんが、そのエラーログ(/var/log/nginx/error。ログ)詳細をご覧ください。 たとえば、502エラーの原因は、おそらくPHP-FPMが実行されていないため、ソケットが存在しないことを示すNGINXエラーログの対応するエントリがあります。 (次のセクションでは、この問題を検出して修正する方法を見ていきます。

エラー。PHP-FPMが実行されていません

注意:このセクションには、”マスター”という用語を使用するプロセス名が含まれています。”特定のプロセスを参照する場合を除いて、この記事では代わりに”プライマリ”という用語を使用します。

PHP-FPMが実行されていない場合、NGINXはPHPアプリケーションに到達するための要求に対して502エラーを返します。 502sが表示されている場合は、最初にPHP-FPMが実行されていることを確認してください。 たとえば、Linuxホストでは、次のようなpsコマンドを使用して、PHP-FPMプロセスの実行を探すことができます。

Copy
sudo ps aux | grep 'php'

PHP-FPMは、ワーカープロセスをプールと呼ばれるグループに整理します。 以下のサンプル出力は、PHP-FPMプライマリプロセスが実行されており、デフォルトプール内の2つのワーカープロセス(wwwという名前)が実行されてい:P>

Copy
root 29852 0.0 2.2 435484 22396 ? Ssl 16:27 0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)www-data 29873 0.0 1.5 438112 15220 ? Sl 16:27 0:00 php-fpm: pool wwwwww-data 29874 0.0 1.6 438112 16976 ? Sl 16:27 0:00 php-fpm: pool www

psコマンドの出力にPHP-FPMプライマリプロセスまたはプールプロセスが表示されない場合は、PHP-FPMを実行して502エラーを解決する必要があります。実稼働環境では、systemdを使用してPHP-FPMをサービスとして実行することを検討する必要があります。 これにより、サーバーの起動時または新しいインスタンスの起動時にPHP-FPMデーモンが自動的にPHPアプリの提供を開始するため、PHPアプリケーションの信頼性 PHP-FPMはPHPのソースコードに含まれているため、PHPを設定するときにPHP-FPMをsystemdサービスとして追加できます。

PHP-FPMプロジェクトがサービスとして設定されたら、次のコマンドを使用して、サーバーの起動時に自動的に開始されるようにすることができます。

Copy
sudo systemctl enable php7.2-fpm.service

次に、list-unit-filesコマンドを使用して、PHP-FPMプロジェクトに関する情報を表示できます。あなたのサービス:php7で

コピー
sudo systemctl list-unit-files | grep -E 'php*fpm'

2PHP-FPMがインストールされているサーバー(実行されていない場合でも)、このコマンドの出力は次のようになります。

Copy
php7.2-fpm.service enabled

PHP-FPMサービスに関する情報を表示するには、次のコマンドを使用します。

php7.2-fpm.service enabled

Php-FPMサービスに関する情報を表示するには、次のコマンドを使用します。

php7.2-fpm.service enabled
sudo systemctl is-active php7.2-fpm.service

このコマンドは、activeの出力を返す必要があります。 そうでない場合は、次のようにしてサービスを開始できます:Nginxはソケットにアクセスできません

PHP-FPMが起動すると、NGINX webサーバーと通信するために1つ以上のTCPまたはUnixソケットが作成されます。 PHP-FPMのワーカープロセスは、これらのソケットを使用してNGINXからの要求をリッスンします。

ソケットの設定ミスによって502エラーが発生したかどうかを判断するには、PHP-FPMとNGINXが同じソケットを使用するように構成されていることを確認 これらのファイルは/etc/php/7.2/fpm/poolにあります。d/. 各プールのソケットは、プールの設定ファイル内のlistenlistenディレクティブは、/run/php/mypoolにあるUnixソケットを使用するようにmypoolという名前のプールを設定します。

divconf

Copy
listen = /run/php/mypool.sock

NGINXが特定のプールのソケットにアクセスできない場合は、NGINXエラーログエントリでどのソケットに名前が付けられているかを確認することで、どのワーカープールが問題に関与しているかを判断することができます。 たとえば、PHP-FPMがmypoolワーカープールの開始に失敗した場合、NGINXは502を返し、そのエラーログエントリには次のようになります。

error。

コピー
connect() to unix:/run/php/mypool.sock failed (2: No such file or directory)

あなたのnginxをチェックしてください。関連するlocationブロックが同じソケットを指定することを確認するためのconfファイル。 以下の例には、PHP-FPMの一般的な設定情報をロードするincludeディレクティブと、mypoolで指定された同じUnixソケットを指定するfastcgi_passディレクティブが含まれています。上記のconfファイル。

nginx。unixソケットにはUnixファイルシステムのアクセス許可が適用されます。 PHP-FPMプールの設定ファイルは、

wwwのように、ソケットのモードと所有権を指定します。conf

Copy
listen.owner = www-datalisten.group = www-datalisten.mode = 0660

これらの権限により、NGINXを実行しているユーザーとグループがソケットにアクセスできる ソケットのアクセス許可が正しくない場合、NGINXはアクセスログに502エラーを記録し、エラーログに以下のようなメッセージを記録します:

error。

2020/02/20 17:12:03 3059#3059: *4 connect() to unix:/run/php/mypool.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

listen.ownerlisten.groupのデフォルト値は、NGINXを実行しているデフォルトの所有者とグループと一致し、listen.groupのデフォルト値は、NGINXを実行しているデフォルトの所有者とグループと一致していることに注意してください。

2020/02/20 17:12:03 3059#3059: *4 connect() to unix:/run/php/mypool.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

listen.grouplisten.grouplisten.modeのデフォルトは0660です。 これらのデフォルトを使用すると、NGINXはソケットにアクセスできるはずです。PHP-FPMがTCPソケットでリッスンしている場合、プールconifgurationのlistenaddress:portの形式の値を持ちます。

www。Unixソケットと同じように、このソケットの場所がNGINX設定で指定された場所と一致することを確認することで、502エラーを防ぐことができます。

PHP-FPMはタイムアウトしています

アプリケーションが応答に時間がかかりすぎる場合、ユーザーはタイムアウトエラーが発生します。 プール設定のrequest_terminate_timeoutディレクティブで設定されているPHP-FPMのタイムアウト(デフォルトは20秒)がNGINXのタイムアウト(デフォルトは60秒)よりも小さい場合、NGINXは502エラーで応答します。 以下に示すNGINXエラーログは、その上流プロセス(PHP—FPM)が有効な応答を送信する前に接続を閉じたことを示しています。 つまり、これはPHP-FPMがタイムアウトしたときに表示されるエラーログです。

error。この場合、PHP-FPMログ(デフォルトでは/var/log/php7.2-fpmにあります。ログ)は、より詳細な情報を提供する相関メッセージを示します:

php7.2-fpm。log

Copy
 WARNING: child 2120, script '/var/www/html/index.php' (request: "GET /index.php") execution timed out (25.755070 sec), terminating

プールの設定ファイルを編集することでPHP-FPMのタイムアウト設定を上げることができますが、これは別の問題を引き起こす可能性があります。NGINXはPHP-FPMからの応答を受信する前にタイムアウトすることがあります。 デフォルトのNGINXタイムアウトは60秒です; PHP-FPMタイムアウトを60秒以上にした場合、PHPアプリケーションが時間内に応答していない場合、NGINXは504ゲートウェイタイムアウトエラーを返します。 NGINXのタイムアウトを上げることでこれを防ぐことができます。 以下の例では、/etc/nginx/nginxのhttpfastcgi_read_timeout項目を追加することで、タイムアウト値を90秒に上げました。conf:

nginx.

この変更を適用するには、NGINX設定をリロードします:

Copy
nginx -s reload

次に、PHP-FPMがタイムアウトした理由を判断するために、ログとアプリケーションパフォーマンス監視(APM)データを収集

ログの収集と分析

アプリケーションエラーのトラブルシューティングを行うには、ログを収集してログ管理サービスに送信します。 上記で調べたNGINXログに加えて、PHPはエラーやその他のイベントをログに記録することができます。 詳細については、PHPロギングガイドを参照してください。

PHPとNGINXのログをログ管理サービスに入れ、キャッシュサーバーやデータベースなどの関連技術のログと組み合わせると、webスタック全体のログを単一のプラDatadog Log Analyticsの棒グラフは、エラー、警告、情報などのさまざまなステータスのPHPとNGINXのログを視覚化します。

Datadogのログ分析には、複数のサービスのログがステータス別にグループ化されて表示されます。

WEBスタックからAPMデータを収集

APMは、ボトルネックを特定し、アプリのパフォーマンスに影響する502エラーなどの問題を解決するのに役立 以下のスクリーンショットは、Datadogで視覚化されたNGINXのAPMデータを示しています。 このビューは、NGINXベースのサービスの要求量、エラー率、および遅延をまとめたもので、502エラーなどのパフォーマンスの問題を調査するのに役立ちます。

Datadog APMのNGINXサービスのビューには、リクエストとエラーの量を示す棒グラフ、遅延分布を示すヒストグラム、時間の経過に伴う遅延値を示す折れ線グラフが含まれています。

200OK

アプリケーションの502エラーの診断と解決が速くなればなるほど、より良い結果が得られます。 Datadogを使用すると、インフラストラクチャ全体からメトリック、トレース、ログ、およびネットワークパフォーマンスデータを分析できます。 すでにDatadogのお客様であれば、NGINX、PHP-FPM、および400以上のその他のテクノロジの監視を開始できます。 まだDatadogアカウントをお持ちでない場合は、14日間の無料トライアルにサインアップして、数分で開始してください。