Problem: PHP-FPM und Nginx Timeout-Limits
Timeout-Limits in PHP-FPM und Nginx können Probleme bei der Verarbeitung langer Skripte oder beim Umgang mit großen Datei-Uploads verursachen. Diese Standardeinstellungen können zu Verbindungs-Timeouts führen, was unvollständige Operationen und Fehlermeldungen für Website-Besucher zur Folge hat.
Konfiguration der PHP-FPM Timeout-Einstellungen
Änderung der PHP-FPM Konfigurationsdatei
Die PHP-FPM Konfigurationsdatei befindet sich normalerweise unter /etc/php/[Version]/fpm/php-fpm.conf
. Um die Timeout-Einstellungen zu ändern, modifizieren Sie den Parameter request_terminate_timeout
. Dieser Parameter legt die maximale Zeit fest, die ein Skript laufen kann, bevor PHP-FPM es stoppt.
So setzen Sie diesen Parameter:
- Öffnen Sie die PHP-FPM Konfigurationsdatei mit einem Texteditor.
- Suchen Sie die Zeile mit
request_terminate_timeout
. - Setzen Sie den Wert in Sekunden (z.B.
request_terminate_timeout = 300
für ein 5-Minuten-Timeout). - Wenn die Zeile fehlt, fügen Sie sie zur Datei hinzu.
Tipp: Backup vor dem Bearbeiten
Bevor Sie Änderungen an Ihrer PHP-FPM Konfigurationsdatei vornehmen, erstellen Sie ein Backup. Dies ermöglicht es Ihnen, Änderungen bei Bedarf rückgängig zu machen. Verwenden Sie diesen Befehl:
sudo cp /etc/php/[Version]/fpm/php-fpm.conf /etc/php/[Version]/fpm/php-fpm.conf.backup
Anpassung der PHP-FPM Pool-Einstellungen
PHP-FPM Pools sind Gruppen von PHP-Prozessen, die Anfragen bearbeiten. Jeder Pool kann eine eigene Konfiguration haben, einschließlich Timeout-Einstellungen. Die Pool-Konfigurationsdateien befinden sich normalerweise in /etc/php/[Version]/fpm/pool.d/
.
Um pool-spezifische Timeout-Einstellungen zu ändern:
- Öffnen Sie die Pool-Konfigurationsdatei (oft
www.conf
genannt). - Suchen Sie den Parameter
request_terminate_timeout
. - Setzen Sie den Wert in Sekunden für diesen spezifischen Pool.
- Wenn der Parameter fehlt, fügen Sie ihn zur Datei hinzu.
Konfiguration der Nginx Timeout-Einstellungen
Einstellen des Nginx Fastcgi Timeouts
Die Direktive fastcgi_read_timeout
steuert, wie lange Nginx auf die Verarbeitung einer Anfrage durch PHP-FPM wartet. Diese Einstellung hilft, 504 Gateway Timeout-Fehler zu verhindern, wenn Skripte lange zur Ausführung brauchen.
Um fastcgi_read_timeout
in Nginx einzustellen:
- Öffnen Sie Ihre Nginx-Konfigurationsdatei (oft unter
/etc/nginx/nginx.conf
oder im Verzeichnis/etc/nginx/sites-available/
). - Finden Sie den Server- oder Location-Block.
- Fügen Sie die
fastcgi_read_timeout
-Direktive hinzu oder ändern Sie sie:fastcgi_read_timeout 300s;
Dies setzt das Timeout auf 300 Sekunden (5 Minuten).
Tipp: Timeout basierend auf Skriptanforderungen anpassen
Berücksichtigen Sie die spezifischen Anforderungen Ihrer Anwendung bei der Einstellung von fastcgi_read_timeout
. Für Skripte, die große Datenmengen verarbeiten oder komplexe Operationen durchführen, müssen Sie diesen Wert möglicherweise erhöhen. Überwachen Sie die Leistung Ihrer Anwendung und passen Sie entsprechend an.
Änderung des Nginx Server-Blocks
Um die Timeout-Einstellungen anzuwenden, ändern Sie den Server-Block in Ihrer Nginx-Konfiguration:
- Finden Sie den Server-Block für Ihre Website. Er befindet sich normalerweise in einer Datei in
/etc/nginx/sites-available/
. - Suchen Sie den PHP-Verarbeitungs-Location-Block, der oft so aussieht:
location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
- Fügen Sie die Timeout-Einstellungen zu diesem Location-Block hinzu:
location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 300s; }
Umsetzung der Lösung
Schritt-für-Schritt-Anleitung zur Erhöhung der Timeout-Limits
Um die Timeout-Limits für PHP-FPM und Nginx zu erhöhen, befolgen Sie diese Schritte:
-
Bearbeiten Sie die PHP-FPM-Konfiguration:
- Öffnen Sie die PHP-FPM Pool-Konfigurationsdatei (
/etc/php/[Version]/fpm/pool.d/www.conf
) mit einem Texteditor. - Fügen Sie den Parameter
request_terminate_timeout
hinzu oder ändern Sie ihn:request_terminate_timeout = 300
- Speichern Sie die Datei.
- Öffnen Sie die PHP-FPM Pool-Konfigurationsdatei (
-
Ändern Sie die Nginx-Einstellungen:
- Öffnen Sie Ihre Nginx-Konfigurationsdatei (
/etc/nginx/nginx.conf
oder/etc/nginx/sites-available/
). - Finden Sie den Server-Block für Ihre Website.
- Fügen Sie die Direktive
fastcgi_read_timeout
im PHP-Verarbeitungs-Location-Block hinzu oder aktualisieren Sie sie:location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_read_timeout 300s; }
- Speichern Sie die Datei.
- Öffnen Sie Ihre Nginx-Konfigurationsdatei (
-
Starten Sie die Dienste neu, um die Änderungen anzuwenden:
- Starten Sie PHP-FPM neu:
sudo systemctl restart php7.4-fpm
- Starten Sie Nginx neu:
sudo systemctl restart nginx
- Starten Sie PHP-FPM neu:
-
Testen Sie die neue Konfiguration:
- Führen Sie ein Skript aus, das länger als das Standard-Timeout benötigt, um sicherzustellen, dass es ohne Fehler abgeschlossen wird.
- Überprüfen Sie Ihre Fehlerprotokolle auf timeout-bezogene Probleme.
Behebung häufiger Probleme
Überprüfung der Konfigurationsänderungen
Um zu prüfen, ob Ihre neuen Einstellungen angewendet wurden:
-
Überprüfen Sie die PHP-FPM-Konfiguration:
- Führen Sie
php-fpm -tt
aus, um die Konfigurationsdatei auf Syntaxfehler zu prüfen. - Verwenden Sie
php -i | grep max_execution_time
, um die Einstellung der maximalen Ausführungszeit zu überprüfen.
- Führen Sie
-
Überprüfen Sie die Nginx-Konfiguration:
- Führen Sie
nginx -t
aus, um die Nginx-Konfiguration auf Syntaxfehler zu prüfen. - Verwenden Sie den
curl -I
-Befehl, um die Antwortheader zu überprüfen und zu sehen, ob die neuen Timeout-Einstellungen reflektiert werden.
- Führen Sie
Tipp: PHP-FPM Pool-Konfiguration überprüfen
Um zu überprüfen, ob Ihre PHP-FPM Pool-Konfiguration korrekt ist, verwenden Sie den folgenden Befehl:
php-fpm -d --fpm-config=/etc/php-fpm.d/www.conf
Dieser Befehl zeigt alle Konfigurationsfehler in Ihrer Pool-Datei an.
Debugging-Tools für PHP-FPM und Nginx:
-
PHP-FPM-Protokolle:
- Überprüfen Sie
/var/log/php-fpm/error.log
für PHP-FPM-bezogene Probleme. - Aktivieren Sie das Slow-Log in der PHP-FPM-Konfiguration, um langsame Skripte zu verfolgen.
- Überprüfen Sie
-
Nginx-Protokolle:
- Überprüfen Sie
/var/log/nginx/error.log
für Nginx-spezifische Fehler. - Verwenden Sie
nginx-debug
für detaillierteres Logging.
- Überprüfen Sie
-
Systemüberwachung:
- Verwenden Sie
top
oderhtop
, um Systemressourcen und PHP-FPM-Prozesse zu überwachen. - Probieren Sie
strace
aus, um Systemaufrufe und Signale zu verfolgen.
- Verwenden Sie
Umgang mit anhaltenden Timeout-Problemen
Wenn Timeout-Probleme bestehen bleiben, untersuchen Sie diese Bereiche:
-
Datenbankabfragen:
- Überprüfen Sie langsame Abfragen mit dem Datenbank-Slow-Query-Log.
- Optimieren Sie Datenbankindizes und die Abfragestruktur.
-
Externe API-Aufrufe:
- Überwachen Sie die Antwortzeiten externer Dienste.
- Implementieren Sie Timeouts für API-Aufrufe, um Blockierungen zu verhindern.
-
Dateisystemoperationen:
- Überprüfen Sie langsame Festplatten-I/O mit Tools wie
iotop
. - Erwägen Sie den Umzug zu schnelleren Speicherlösungen, falls erforderlich.
- Überprüfen Sie langsame Festplatten-I/O mit Tools wie
-
Speichernutzung:
- Überwachen Sie die PHP-Speichernutzung mit Tools wie New Relic oder Blackfire.
- Erhöhen Sie das PHP-Speicherlimit, wenn Skripte das Limit erreichen.
Erwägen Sie Server-Skalierung oder Code-Optimierung, wenn:
- Die Ressourcennutzung konsequent hohe Niveaus erreicht.
- Optimierungen die Leistung nicht verbessern.
- Das Verkehrswachstum die aktuelle Serverkapazität übersteigt.
Für Code-Optimierung:
- Verwenden Sie Profiling-Tools, um Engpässe zu identifizieren.
- Refaktorisieren Sie Code, um die Effizienz zu verbessern.
- Implementieren Sie Caching-Strategien, um die Verarbeitungszeit zu reduzieren.
Für Server-Skalierung:
- Erwägen Sie vertikale Skalierung (Erhöhung der Serverressourcen).
- Erkunden Sie horizontale Skalierung (Hinzufügen weiterer Server).
- Schauen Sie sich Lastverteilungslösungen an, um den Verkehr zu verteilen.
Beispiel: Implementierung von Caching zur Leistungsverbesserung
Um die Verarbeitungszeit zu reduzieren und die Leistung zu verbessern, implementieren Sie Redis-Caching:
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'user_data_' . $user_id;
$cached_data = $redis->get($key);
if ($cached_data === false) {
// Daten nicht im Cache, aus Datenbank abrufen
$data = fetchUserDataFromDatabase($user_id);
// Im Cache für zukünftige Verwendung speichern
$redis->set($key, serialize($data), 3600); // 1 Stunde cachen
} else {
$data = unserialize($cached_data);
}
Dieses Beispiel zeigt, wie man Redis-Caching implementiert, um Benutzerdaten zu speichern und abzurufen, was die Datenbankbelastung reduziert und die Antwortzeiten verbessert.