Detaillierte Erläuterung der Ideen zur Fehlerbehebung bei PHP+nginx-Dienstfehlern 500 502

Detaillierte Erläuterung der Ideen zur Fehlerbehebung bei PHP+nginx-Dienstfehlern 500 502

Überblick

Wenn beim Zugriff auf einen Onlinedienst ein Fehler 500 oder 502 auftritt, sind eine Notfallbearbeitung und Fehlerbehebung erforderlich. Was soll ich tun? Sie können das Problem lokalisieren, indem Sie einige Fehlerprotokolle analysieren oder den PHP-FPM-Prozess verfolgen.

nginx Fehlerprotokoll

nginx error_log ist in der nginx-Konfigurationsdatei definiert

Server {
 hören Sie 80;
 Servername localhost;
 Wurzel /var/www;

 Zugriffsprotokoll /Benutzer/jiao/logs/default.access.log;
 Fehlerprotokoll /Benutzer/jiao/logs/default.error.log;
 Standort / {
  index.html index.htm index.php;
  Autoindex aktiviert;
 }
 Standort = /info {
  127.0.0.1 zulassen;
  alles leugnen;
  umschreiben (.*) /.info.php;
 }
 Standort ~ \.php$ {
  Wurzel /var/www;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
  einschließen /usr/local/etc/nginx/fastcgi_params;
 }
}

Fehlerprotokoll anzeigen

➜ Ende /Benutzer/jiao/logs/default.error.log
17.07.2019 11:08:18 [Fehler] 77416#0: *76 kevent() hat eine geschlossene Verbindung gemeldet (54: Verbindung vom Peer zurückgesetzt) ​​beim Lesen des Antwortheaders vom Upstream, Client: 127.0.0.1, Server: localhost, Anfrage: „GET / HTTP/1.1“, Upstream: „fastcgi://127.0.0.1:9000“, Host: „localhost“

Es wird festgestellt, dass die Meldung „Verbindung vom Peer zurückgesetzt“ angezeigt wird. Die Verbindung wird zurückgesetzt. Zu diesem Zeitpunkt können Sie das Fehlerprotokoll von php-fpm überprüfen, um das Problem weiter zu analysieren.

php-fpm Fehlerprotokoll

Das error_log von php-fpm wird in der Konfiguration der Datei php-fpm.conf definiert

; Fehlerprotokolldatei
; Wenn es auf "syslog" eingestellt ist, wird das Protokoll an syslogd gesendet, anstatt geschrieben zu werden
; in einer lokalen Datei.
; Hinweis: Das Standardpräfix ist /usr/local/var
; Standardwert: log/php-fpm.log
Fehlerlog = log/php-fpm.log

Der Inhalt von error_log ist wie folgt

➜ tail /usr/local/var/log/php-fpm.log
[17-Jul-2019 10:49:54] HINWEIS: [pool www] child 81948 gestartet
[17-Jul-2019 11:08:18] WARNUNG: [Pool www] Kind 77537, Skript '/var/www/index.php' (Anforderung: "GET /index.php") Zeitüberschreitung bei der Ausführung (3,801267 Sek.), wird beendet
[17-Jul-2019 11:08:18] WARNUNG: [Pool www] Kind 77537 wurde beim Signal 15 (SIGTERM) nach 1503,113967 Sekunden ab Start beendet.
[17-Jul-2019 11:08:18] HINWEIS: [pool www] child 94339 gestartet

Sie können sehen, dass bei der Anforderung der Datei /var/www/index.php eine Zeitüberschreitung aufgetreten ist.

dtruss

dtruss ist ein dynamischer Tracking-Befehl, der Prozesse basierend auf PID und Namen verfolgen kann

Verwenden Sie dtruss in der Mac-Umgebung und strace und pstack in der Linux-Umgebung

➜ dFachwerk 
VERWENDUNG: dtruss [-acdefholLs] [-t Systemaufruf] { -p PID | -n Name | Befehl | -W Name }
  -p PID # diese PID untersuchen
  -n Name # diesen Prozessnamen untersuchen
  -t syscall # nur diesen Systemaufruf untersuchen
  -W name # auf einen Prozess mit diesem Namen warten
  -a # alle Details drucken
  -c # Anzahl der Systemaufrufe drucken
  -d # relative Zeiten drucken (us)
  -e # verstrichene Zeit ausgeben (us)
  -f # Kindern folgen
  -l # erzwingt das Drucken von pid/lwpid
  -o # CPU-Zeiten ausdrucken
  -s # Stapel-Backtraces drucken
  -L # pid/lwpid nicht drucken
  -b bufsize # dynamische variable Puffergröße

Zum Beispiel,

 dtruss df -h # "df -h" ausführen und untersuchen
 dtruss -p 1871 # PID 1871 untersuchen
 dtruss -n tar # alle Prozesse mit dem Namen "tar" untersuchen
 dtruss -f test.sh # test.sh ausführen und untergeordneten Elementen folgen

Ablaufverfolgung für php-fpm: sudo dtruss -a -n php-fpm

Besuchen Sie jetzt die Webseite und Sie können den Tracking-Inhalt sehen.

21416/0x3479b6: 1559 63 3 getrusage(0x0, 0x7FFEE1EC0760, 0x0) = 0 0
21416/0x3479b6: 1561 4 0 getrusage(0xFFFFFFFFFFFFFFFF, 0x7FFEE1EC0760, 0x0) = 0 0
21416/0x3479b6: 1627 77 17 Umfrage (0x7FFEE1EC08C0, 0x1, 0x1388) = 1 0
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
21416/0x3479b6: 1872 29 24 lstat64("/var/www/index.php\0", 0x7FFEE1ECFF38, 0x0) = 0 0
21416/0x3479b6: 1884 9 6 lstat64("/var/www\0", 0x7FFEE1ECFDF8, 0x0) = 0 0
21416/0x3479b6: 1889 6 3 lstat64("/var\0", 0x7FFEE1ECFCB8, 0x0) = 0 0
21416/0x3479b6: 1899 12 8 readlink("/var\0", 0x7FFEE1ED0090, 0x400) = 11 0
21416/0x3479b6: 1905 6 4 lstat64("/private/var\0", 0x7FFEE1ECFB78, 0x0) = 0 0
21416/0x3479b6: 1917 6 3 lstat64("/private\0", 0x7FFEE1ECFA38, 0x0) = 0 0
21416/0x3479b6: 2178 18 14 stat64("/var/www/.user.ini\0", 0x7FFEE1ED0240, 0x0) = -1 Fehler#2
21416/0x3479b6: 2217 5 1 setitimer(0x2, 0x7FFEE1ED07E0, 0x0) = 0 0
21416/0x3479b6: 2225 4 0 Signatur(0x1B, 0x7FFEE1ED0788, 0x7FFEE1ED07B0) = 0 0
21416/0x3479b6: 2237 5 1 sigprocmask(0x2, 0x7FFEE1ED0804, 0x0) = 0x0 0
21416/0x3479b6: 3643 48 40 open_nocancel(".\0", 0x0, 0x1) = 5 0
21416/0x3479b6: 3648 7 3 fstat64(0x5, 0x7FFEE1ED0110, 0x0) = 0 0
21416/0x3479b6: 3653 7 2 fcntl_nocancel(0x5, 0x32, 0x10F252158) = 0 0
21416/0x3479b6: 3661 12 7 close_nocancel(0x5) = 0 0
21416/0x3479b6: 3670 10 7 stat64("/usr/local/var\0", 0x7FFEE1ED0080, 0x0) = 0 0
21416/0x3479b6: 3681 11 8 chdir("/var/www\0", 0x0, 0x0) = 0 0
21416/0x3479b6: 3698 4 0 setitimer(0x2, 0x7FFEE1ED02D0, 0x0) = 0 0
21416/0x3479b6: 3710 6 3 fcntl(0x3, 0x8, 0x10F3FD858) = 0 0
21416/0x3479b6: 3733 9 6 stat64("/private/var/www/index.php\0", 0x7FFEE1ECFF10, 0x0) = 0 0
74904/0x332630: 723125 1073381 19 kevent(0x9, 0x0, 0x0) = 0 0
74902/0x332629: 770666 1073387 17 kevent(0x8, 0x0, 0x0) = 0 0
74904/0x332630: 723165 1061954 20 kevent(0x9, 0x0, 0x0) = 0 0
74902/0x332629: 770709 1061954 20 kevent(0x8, 0x0, 0x0) = 0 0
74904/0x332630: 723201 1074786 16 kevent(0x9, 0x0, 0x0) = 0 0
74902/0x332629: 770747 1074783 16 kevent(0x8, 0x0, 0x0) = 0 0
74904/0x332630: 723229 1069141 13 kevent(0x9, 0x0, 0x0) = 0 0
74902/0x332629: 770777 1069145 11 kevent(0x8, 0x0, 0x0) = 0 0
21416/0x3479b6: 3942 3902233 7 __semwait_signal(0x703, 0x0, 0x1) = -1 Fehler#4
74902/0x332629: 770814 103 25 Kill(21416, 15) = 0 0
dtrace: Fehler bei aktivierter Sonden-ID 2172 (ID 161: syscall::write:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
dtrace: Fehler bei aktivierter Sonden-ID 2172 (ID 161: syscall::write:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
74902/0x332629: 771325 7 2 sigreturn(0x7FFEE1ECFC40, 0x1E, 0xC1A4B78E0404663A) = 0 Err#-2
74902/0x332629: 771336 7 3 kevent(0x8, 0x0, 0x0) = 1 0
dtrace: Fehler bei aktivierter Sonden-ID 2174 (ID 159: syscall::read:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
74902/0x332629: 771352 11 7 wait4(0xFFFFFFFFFFFFFFFF, 0x7FFEE1ED0748, 0x3) = 21416 0
dtrace: Fehler bei aktivierter Sonden-ID 2172 (ID 161: syscall::write:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
74902/0x332629: 773511 1957 1899 fork() = 28060 0
28060/0x3754c5: 125: 0: 0 fork() = 0 0
28060/0x3754c5: 128 9 2 bsdthread_register(0x7FFF6774C418, 0x7FFF6774C408, 0x2000) = -1 Fehler#22
dtrace: Fehler bei aktivierter Sonden-ID 2172 (ID 161: syscall::write:return): ungültiger Kernelzugriff in Aktion Nr. 13 bei DIF-Offset 68
74902/0x332629: 773737 4 1 wait4(0xFFFFFFFFFFFFFFFF, 0x7FFEE1ED0748, 0x3) = 0 0
74902/0x332629: 773742 6 3 lesen(0x5, "\0", 0x1) = -1 Err#35
28060/0x3754c5: 320 4 0 getpid(0x0, 0x0, 0x0) = 28060 0
28060/0x3754c5: 328 7 2 __mac_syscall(0x7FFF67758A17, 0x4, 0x7FFEE1ED0208) = -1 Fehler#45
28060/0x3754c5: 332 5 2 csops(0x6D9C, 0xB, 0x7FFEE1ED0248) = -1 Fehler#22
28060/0x3754c5: 755 14 11 dup2(0x1, 0x2, 0x0) = 2 0
28060/0x3754c5: 797 89 22 schließen(0x4) = 0 0
28060/0x3754c5: 806 11 6 dup2(0x7, 0x0, 0x0) = 0 0
28060/0x3754c5: 817 4 0 geteuid(0x0, 0x0, 0x0) = 501 0
28060/0x3754c5: 820 3 0 schließen(0x5) = 0 0
28060/0x3754c5: 821 3 0 schließen(0x6) = 0 0
28060/0x3754c5: 824 5 1 Signatur(0xF, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 825 3 0 Signatur(0x2, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 827 3 0 Signatur(0x1E, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 828 3 0 Signatur(0x1F, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 829 3 0 Signatur(0x14, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 830 3 0 Signatur(0x3, 0x7FFEE1ED0688, 0x0) = 0 0
28060/0x3754c5: 1043 3 0 schließen(0x7) = 0 0

Sie können die ausgeführten Funktionen unten im System sehen, z. B. lstat64 zum Abrufen von Dateiinhaltsinformationen, kill(21416, 15) zum Beenden des php-fpm-Prozesses und fork() zum Erstellen eines neuen php-fpm-Prozesses. Wenn Sie interessiert sind, können Sie die Rolle jeder Anweisung eingehend studieren.

siehe

https://www.jb51.net/article/165773.htm

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Ursachen und Lösungen für den Nginx 502 Bad Gateway-Fehler
  • Detaillierte Analyse des HTTP-Statuscodes 502 des Dienstes nginx+php-fpm
  • Detaillierte Erklärung der Lösungen für häufige 502-Fehler in Nginx unter Linux
  • Detaillierte Erklärung der Nginx 502-Fehlerlösung
  • PHP-Skript überwacht Nginx 502-Fehler und startet php-fpm automatisch neu
  • 4 häufige Ursachen und Lösungen für den Nginx 502 Bad Gateway-Fehler
  • Nginx 502-Fehler beim Upgrade von PHP von 5.3.28 auf 5.3.29
  • Fehlerbehebung bei der Ursache des 502 Bad Gateway-Fehlers auf dem Nginx-Server

<<:  Best Practices zum Teilen von React-Code

>>:  Methode zur Wiederherstellung von Betriebs- und Wartungsdaten der MySQL-Datenbank

Artikel empfehlen

HTML ist etwas, das Webseiten-Ersteller lernen und beherrschen müssen.

Welche Vorteile bietet das Erlernen von HTML? 1: ...

Analyse des kumulativen Aggregationsprinzips von MySQL und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispie...

Detailliertes Tutorial zum Konfigurieren der lokalen Yum-Quelle in CentOS8

Die Centos8-Distribution wird über die BaseOS- un...

Zusammenfassung der Methoden zum Einbinden von Dateiinhalten in HTML-Dateien

Im Forum fragen Internetnutzer oft: „Kann ich den...

MySQL 5.7.18 Installations-Tutorial unter Windows

In diesem Artikel wird erklärt, wie Sie MySQL aus...

Detaillierte Erklärung der Grundkonzepte von HTML

Was ist HTML? HTML ist eine Sprache zur Beschreib...

Analyse der Verwendung des MySQL-Datenbankbefehls „show processlist“

Wenn bei der tatsächlichen Projektentwicklung die...

Node+Socket realisiert einfache Chatroom-Funktion

In diesem Artikel wird der spezifische Code von N...

Ergänzender Artikel zur Front-End-Performance-Optimierung

Vorwort Ich habe mir die zuvor veröffentlichten A...

Detaillierte Erläuterung der Verwendung von Docker Commit

Manchmal müssen Sie bestimmte Abhängigkeiten im B...