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 = 300fü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.backupAnpassung 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.confgenannt).
- 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.confoder 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_timeouthinzu 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.confoder/etc/nginx/sites-available/).
- Finden Sie den Server-Block für Ihre Website.
- Fügen Sie die Direktive fastcgi_read_timeoutim 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 -ttaus, 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 -taus, 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.confDieser 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.logfü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.logfür Nginx-spezifische Fehler.
- Verwenden Sie nginx-debugfür detaillierteres Logging.
 
- Überprüfen Sie 
- 
Systemüberwachung: - Verwenden Sie topoderhtop, um Systemressourcen und PHP-FPM-Prozesse zu überwachen.
- Probieren Sie straceaus, 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.
 
 

