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-ID
und“ behandelt X-CORRELATION-ID
und diese sowohl auf der Nginx- als auch auf der PHP-Seite den Protokollen hinzugefügt.
RequestId
sollte zu Beginn jeder Anfrage auf einen zufälligen Wert gesetzt werden (ich verwende UUID) und CorrelationId
bei jeder Benutzerinteraktion auf einen zufälligen Wert gesetzt werden. Für kleine Websites gibt es normalerweise nur einen RequestID
und einen CorrelationId
. Wenn Sie Microservices verwenden, generiert jeder Microservice seinen eigenen RequestId
, der jedoch CorrelationId
zwischen 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_timeout
sowie verwenden slowlog
- siehephp-fpm-Konfigurationsdokumente- sollte Ihnen einen Stacktrace aller lang laufenden php-fpm-Prozesse bereitstellen, einschließlich ihrer PID.