NGINX+PHP-FPM: Ist es möglich, PHP-FPM-PID zuzuordnen, um auf Protokolleinträge zuzugreifen?

NGINX+PHP-FPM: Ist es möglich, PHP-FPM-PID zuzuordnen, um auf Protokolleinträge zuzugreifen?

Wir haben NGINX und php-fpm verwendet.

Wir haben festgestellt, dass einige Anfragen lange Zeit hängen bleiben (10+, 20+ Minuten...) überSpitzeBefehl.
Außerdem wurden im Zugriffsprotokolleintrag (NGINX) einige verdächtige Anfragen (ich meine Bots) erkannt, aber ich bin nicht sicher, ob diese verdächtigen Anfragen etwas mit den Anfragen zu tun haben, die hängen bleiben oder nicht.

Meine Hauptfrage ist also:

Ist es möglich (über die Konfiguration oder was auch immer), die php-fpm-PID mit einem URL-Eintrag im Zugriffsprotokoll zu verknüpfen?
Oder gibt es ein Tool, das mir bei dieser Aufgabe helfen könnte?

Zusatzinfo:
Wir verfügen über den Quellcode, da wir die Hauptentwickler sind.

Dank im Voraus!

Antwort1

Es ist problematisch, den richtigen PHP-FPM-Prozess von der Nginx-Seite aus zu identifizieren, da Sie im Wesentlichen über einen Unix-Socket oder einen TCP-Socket mit einer Blackbox kommunizieren, von Threads ganz zu schweigen.

Sie können das Problem von der PHP-Seite aus angehen. Sie können getmypid() aus Ihrem PHP-Skript verwenden, oder, wenn dies nicht Ihr Code ist, können Sie die Option php_value auto_prepend_file in der PHP-FPM-Konfiguration verwenden. Auf diese Weise können Sie Ihren eigenen Code am Anfang jeder PHP-Datei einfügen und die PID zusammen mit dem entsprechenden REQUEST_URI nach Wunsch protokollieren. Sie haben die gewünschte Verbindung. Bereiten Sie sich jedoch auf große IOPS auf einer stark frequentierten Site vor ...

Wenn Sie nur die PID benötigen, ist es möglicherweise einfacher, den PHP-Status zu aktivieren, wie hier dokumentierthttps://easyengine.io/tutorials/php/fpm-status-page/und überprüfen Sie yourserver/php-status?full

Antwort2

Im Allgemeinen werden Probleme dieser Art mithilfe eines sogenannten „ RequestId Setzen Sie einfach zwei Header: X-REQUEST-IDund“ behandelt X-CORRELATION-IDund diese sowohl auf der Nginx- als auch auf der PHP-Seite den Protokollen hinzugefügt.

RequestIdsollte zu Beginn jeder Anfrage auf einen zufälligen Wert gesetzt werden (ich verwende UUID) und CorrelationIdbei jeder Benutzerinteraktion auf einen zufälligen Wert gesetzt werden. Für kleine Websites gibt es normalerweise nur einen RequestIDund einen CorrelationId. Wenn Sie Microservices verwenden, generiert jeder Microservice seinen eigenen RequestId, der jedoch CorrelationIdzwischen ihnen geteilt wird.

Die Implementierung hängt von Ihrer Infrastruktur ab, eine einfache Implementierung könnte jedoch folgendermaßen aussehen:

# 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

Dann protokollieren Sie einfach Ihre PID in PHP:

# 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);
...

Antwort3

Wenn Sie die php-fpm-Statusseite aktiviert haben, können Sie den Vollmodus aktivieren, um PIDs zu verfolgen. Verwenden Sie beispielsweisehttp://example.com/phpfpm-status?fullEs sollte möglich sein, herauszufinden, was passiert. (Sicherheitshinweis: Solche Statusseiten sollten niemals öffentlich zugänglich sein.)

Antwort4

Sie sollten PHP-FPMs slow-log: Einstellung request_slowlog_timeoutsowie verwenden slowlog- siehephp-fpm-Konfigurationsdokumente- sollte Ihnen einen Stacktrace aller lang laufenden php-fpm-Prozesse bereitstellen, einschließlich ihrer PID.

verwandte Informationen