NGINX+PHP-FPM: php-fpm PID をアクセス ログ エントリに関連付けることは可能ですか?

NGINX+PHP-FPM: php-fpm PID をアクセス ログ エントリに関連付けることは可能ですか?

私たちはNGINXとphp-fpmを使用しています。

一部のリクエストが長時間(10分以上、20分以上...)ハングアップしていることに気付きました。コマンド。
また、アクセス ログ エントリ (NGINX) で疑わしいリクエスト (つまりボット) が検出されましたが、これらの疑わしいリクエストがハングしているリクエストと関係があるかどうかはわかりません。

私の主な質問は次のとおりです。

php-fpm PID をアクセス ログの URL エントリに関連付けることは (設定などを介して) 可能ですか?
または、このタスクに役立つツールはありますか?

追加情報:
私たちが主な開発者なので、ソースコードを持っています。

前もって感謝します!

答え1

基本的に、スレッドは言うまでもなく、UNIX ソケットまたは TCP ソケットを介してブラック ボックスと通信するため、nginx 側から正しい php-fpm プロセスを識別するのは困難です。

PHP 側から問題に取り組むこともできます。PHP スクリプトから getmypid() を使用するか、これが自分のコードでない場合は、PHP fpm 構成で php_value auto_prepend_file オプションを使用できます。この方法では、各 PHP ファイルの先頭に独自のコードを挿入し、必要に応じて対応する REQUEST_URI とともに pid をログに記録できます。必要な接続が確立されました。ただし、ビジーなサイトでは IOPS が大きくなることを覚悟してください...

pidだけが必要な場合は、ここに記載されているようにphp-statusを有効にする方が簡単かもしれません。https://easyengine.io/tutorials/php/fpm-status-page/yourserver/php-status?fullを確認してください

答え2

通常、この種の問題は、いわゆる と というRequestId 2 つのヘッダーを設定しX-REQUEST-IDX-CORRELATION-IDそれらを nginx 側と php 側の両方のログに追加することで処理されます。

RequestId各リクエストの開始時に をランダムな値 (UUID を使用) に設定し、各ユーザー操作時に をランダムな値に設定する必要があります。小規模な Web サイトの場合、 は通常 1 つと1 つCorrelationIdだけです。マイクロサービスを使用する場合、各マイクロサービスは独自の を生成しますが、それらの間で共有されます。RequestIDCorrelationIdRequestIdCorrelationId

実装はインフラストラクチャによって異なりますが、単純な実装は次のようになります。

# in nginx config
   location / {
      proxy_pass       http://upstream;
      proxy_set_header X-Request-Id $request_id; 
      ...
   }
# or
  location / {
    fastcgi_pass   unix:/path/to/socket;
    fastcgi_param  HTTP_X_REQUEST_ID $request_id;
    ...
  }

# This works because nginx generates a random string and stores it as $request_id

次に、PHP で pid をログに記録します。

# in php-fpm config
# %p - pid
access.format = "[%p][%{HTTP_X_REQUEST_ID}e] %R - %u %t \"%m %r\" %s"
# or in php application itself
# index.php
<?php
file_put_contents('somewhere.log', sprintf('[%s][%d]', $_SERVER['HTTP_X_REQUEST_ID'] ?? 'N/A', getmypid()), FILE_APPEND);
...

答え3

php-fpmステータスページが有効になっている場合は、PIDをトレースするためにフルモードをチェックすることを検討してください。たとえば、http://example.com/phpfpm-status?full何が起こっているのかを知ることはできるはずです。(セキュリティ関連の注意: このようなステータス ページをパブリックにアクセス可能なままにしないでください。)

答え4

PHP-FPMのスローログ:設定request_slowlog_timeoutも活用する必要がありますslowlog- 参照php-fpm 設定ドキュメント- 長時間実行されているすべての php-fpm プロセスのスタック トレースを、その PID を含めて提供します。

関連情報