PHP-FPM (FastCGI Process Manager) ist die Standardmethode, um PHP auf modernen Webservern auszuführen. Eine gut konfigurierte PHP-FPM-Installation kann den Unterschied zwischen einer langsamen und einer schnellen Website ausmachen. Bei Theory7 sehen wir regelmäßig, dass Standardkonfigurationen nicht optimal für die spezifische Arbeitslast sind. In diesem Handbuch lernen Sie, PHP-FPM korrekt zu konfigurieren und für maximale Leistung zu optimieren.

Was ist PHP-FPM?

PHP-FPM verwaltet einen Pool von PHP-Worker-Prozessen. Wenn eine PHP-Seite angefordert wird, bearbeitet einer dieser Worker die Anfrage. Die Art und Weise, wie Worker verwaltet werden, bestimmt weitgehend die Leistung Ihrer Website. Dies ist entscheidend, insbesondere für Websites mit hohem Besucheraufkommen oder intensiven Anwendungen.

Vorteile von PHP-FPM:

  • Besseres Ressourcenmanagement als mod_php, wodurch Ihr Server effizienter mit verfügbaren Ressourcen umgeht.
  • Prozessisolierung pro Website möglich, was die Sicherheit und Stabilität erhöht.
  • Sanfte Neustarts ohne Ausfallzeiten, was für Websites, die kontinuierlich verfügbar sein müssen, unerlässlich ist.
  • Erweiterte Protokollierungs Optionen, mit denen Sie bessere Einblicke in die Leistung und mögliche Probleme erhalten.

Pool-Konfiguration

Die Pool-Konfiguration bestimmt, wie viele PHP-Prozesse ausgeführt werden. Diese Datei finden Sie normalerweise unter:

/etc/php/8.2/fpm/pool.d/www.conf

Ersetzen Sie 8.2 durch Ihre PHP-Version. Es ist wichtig, diese Konfiguration an die spezifischen Bedürfnisse Ihrer Anwendung anzupassen.

Prozessmanager-Modi

PHP-FPM kennt drei Modi:

  • static - Festgelegte Anzahl von Workern
    pm = static
    pm.max_children = 20

    Am besten für dedizierte Server mit vorhersehbarer Last.
  • dynamic - Skaliert automatisch
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 10
    pm.min_spare_servers = 5
    pm.max_spare_servers = 20

    Am besten für die meisten Situationen, insbesondere bei wechselndem Besucheraufkommen.
  • ondemand - Worker nur bei Anfragen
    pm = ondemand
    pm.max_children = 50
    pm.process_idle_timeout = 10s

    Am besten für Server mit wenig Verkehr oder begrenztem Speicher.

Berechnung von max_children

Der max_children-Wert hängt von Ihrem verfügbaren Speicher ab. Es ist entscheidend, diesen Wert gut zu berechnen, um eine Überlastung Ihres Servers zu vermeiden:

max_children = (Verfügbarer RAM - Sonstiger Gebrauch) / Durchschnittliche PHP-Prozessgröße

Beispielberechnung:

  • 4 GB RAM-Server
  • 1 GB für OS und Datenbank
  • Durchschnittlicher PHP-Prozess: 50 MB
  • max_children = 3000 MB / 50 MB = 60

Überprüfen Sie den durchschnittlichen Speicherverbrauch pro PHP-Prozess mit dem folgenden Befehl:

ps --no-headers -o "rss" -C php-fpm | awk '{ sum+=$1 } END { print sum/NR/1024 " MB" }'

Anforderungsgrenzen

Vermeiden Sie Speicherlecks, indem Sie Prozesse regelmäßig neu starten. Dies können Sie mit folgendem Befehl einstellen:

pm.max_requests = 500

Nach 500 Anfragen wird ein Worker neu gestartet. Dies verhindert das Wachstum des Speichers durch schlecht geschriebene Codes, was entscheidend für die Stabilität Ihrer Anwendung ist.

php.ini-Optimierung

Neben der Pool-Konfiguration ist die php.ini ebenfalls wichtig für die Leistung Ihrer PHP-Anwendungen.

Speicher- und Ausführungsgrenzen

Stellen Sie die Speicher- und Ausführungsgrenzen basierend auf den Bedürfnissen Ihrer Anwendung ein:

memory_limit = 256M
max_execution_time = 300
max_input_time = 300

Passen Sie diese an Ihre Anwendung an. Beispielsweise benötigt WordPress oft 256M, während große Importe mehr Speicher erfordern.

Upload-Grenzen

Stellen Sie die Upload-Grenzen ein, um sicherzustellen, dass Ihre Anwendung große Dateien verarbeiten kann:

upload_max_filesize = 64M
post_max_size = 64M
max_file_uploads = 20

Beachten Sie: post_max_size muss gleich oder größer sein als upload_max_filesize.

OPcache-Konfiguration

OPcache speichert kompilierte PHP-Codes im Speicher, was die Ladezeit Ihrer Anwendung erheblich beschleunigen kann:

opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.validate_timestamps = 1
opcache.fast_shutdown = 1

Für die Produktion können Sie validate_timestamps auf 0 setzen, um die Geschwindigkeit zu erhöhen, aber dann müssen Sie bei Codeänderungen OPcache manuell leeren.

Realpath-Cache

Um Dateisystemaufrufe für include/require-Anweisungen zu reduzieren, können Sie den Realpath-Cache konfigurieren:

realpath_cache_size = 4M
realpath_cache_ttl = 600

Konfiguration anwenden

Nach Änderungen müssen Sie PHP-FPM neu starten, um die neuen Einstellungen anzuwenden:

# Systemd
sudo systemctl restart php8.2-fpm

# Oder für andere Versionen
sudo systemctl restart php7.4-fpm

Überprüfen Sie, ob die Konfiguration gültig ist mit:

sudo php-fpm8.2 -t

Mehrere Pools für mehrere Websites

Für bessere Isolation können Sie für jede Website einen separaten Pool erstellen. Dies ist besonders nützlich für Hosting-Anbieter oder Entwickler, die mehrere Projekte verwalten:

sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/meineseite.conf

Passen Sie meineseite.conf an:

[meineseite]
user = meinbenutzer
group = meinbenutzer
listen = /run/php/php8.2-fpm-meineseite.sock

Konfigurieren Sie Ihren Webserver so, dass er den richtigen Socket pro Website verwendet, damit jede Website ihre eigenen Ressourcen hat und besser funktioniert.

PHP-FPM-Status überwachen

Aktivieren Sie die Statusseite zur Überwachung Ihrer PHP-FPM-Prozesse:

pm.status_path = /fpm-status

Konfigurieren Sie Ihren Webserver, um diese lokal bereitzustellen:

location /fpm-status {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}

Fehlerbehebung

502 Bad Gateway

Dies kann bedeuten, dass PHP-FPM nicht läuft oder dass der Socket falsch konfiguriert ist. Überprüfen Sie den Status mit:

sudo systemctl status php8.2-fpm

Langsame Leistung

Wenn Sie feststellen, dass die Leistung langsam ist, überprüfen Sie, ob max_children zu niedrig eingestellt ist. Dies können Sie tun, indem Sie die Protokolle überprüfen:

sudo tail -f /var/log/php8.2-fpm.log

Suche nach Nachrichten wie "Server erreichte max_children", um zu sehen, ob Sie mehr Worker hinzufügen müssen.

Speicherfehler

Wenn Sie auf Speicherfehler stoßen, ziehen Sie in Betracht, memory_limit zu erhöhen oder Ihren Code zu optimieren, um weniger Speicher zu verbrauchen.

Verwandte Artikel

Brauchen Sie Hilfe?

Wir sind für Sie da! Haben Sie Fragen oder stoßen Sie auf Probleme? Unser Support-Team hilft Ihnen gerne persönlich weiter. Senden Sie uns eine Nachricht über das Ticketsystem - wir antworten normalerweise innerhalb weniger Stunden und denken gerne mit Ihnen mit.