Wie erhöht man die PHP-FPM und Nginx Timeout-Limits?

Veröffentlicht 13. Oktober 2024

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:

  1. Öffnen Sie die PHP-FPM Konfigurationsdatei mit einem Texteditor.
  2. Suchen Sie die Zeile mit request_terminate_timeout.
  3. Setzen Sie den Wert in Sekunden (z.B. request_terminate_timeout = 300 für ein 5-Minuten-Timeout).
  4. 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:

  1. Öffnen Sie die Pool-Konfigurationsdatei (oft www.conf genannt).
  2. Suchen Sie den Parameter request_terminate_timeout.
  3. Setzen Sie den Wert in Sekunden für diesen spezifischen Pool.
  4. 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:

  1. Öffnen Sie Ihre Nginx-Konfigurationsdatei (oft unter /etc/nginx/nginx.conf oder im Verzeichnis /etc/nginx/sites-available/).
  2. Finden Sie den Server- oder Location-Block.
  3. 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:

  1. Finden Sie den Server-Block für Ihre Website. Er befindet sich normalerweise in einer Datei in /etc/nginx/sites-available/.
  2. 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;
    }
  3. 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:

  1. 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.
  2. Ä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.
  3. 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
  4. 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:

  1. Ü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.
  2. Ü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.

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:

  1. 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.
  2. Nginx-Protokolle:

    • Überprüfen Sie /var/log/nginx/error.log für Nginx-spezifische Fehler.
    • Verwenden Sie nginx-debug für detaillierteres Logging.
  3. Systemüberwachung:

    • Verwenden Sie top oder htop, um Systemressourcen und PHP-FPM-Prozesse zu überwachen.
    • Probieren Sie strace aus, um Systemaufrufe und Signale zu verfolgen.

Umgang mit anhaltenden Timeout-Problemen

Wenn Timeout-Probleme bestehen bleiben, untersuchen Sie diese Bereiche:

  1. Datenbankabfragen:

    • Überprüfen Sie langsame Abfragen mit dem Datenbank-Slow-Query-Log.
    • Optimieren Sie Datenbankindizes und die Abfragestruktur.
  2. Externe API-Aufrufe:

    • Überwachen Sie die Antwortzeiten externer Dienste.
    • Implementieren Sie Timeouts für API-Aufrufe, um Blockierungen zu verhindern.
  3. Dateisystemoperationen:

    • Überprüfen Sie langsame Festplatten-I/O mit Tools wie iotop.
    • Erwägen Sie den Umzug zu schnelleren Speicherlösungen, falls erforderlich.
  4. 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:

  1. Die Ressourcennutzung konsequent hohe Niveaus erreicht.
  2. Optimierungen die Leistung nicht verbessern.
  3. 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.