Webhosting

PHP-FPM

Definition

PHP-FPM (FastCGI Process Manager) ist der offizielle FastCGI-Prozessmanager von PHP. Er betreibt Gruppen von PHP-Prozessen, sogenannte Pools, die die vom Webserver (Nginx, Apache, Caddy) weitergereichten Skripte ausführen; jeder Pool kann einen eigenen Systembenutzer, eigene Limits und eigene php.ini-Werte haben, was die Websites voneinander trennt.

PHP-FPM, Webhosting

Ein Webserver wie Nginx kann selbst kein PHP ausführen. Er reicht jede PHP-Anfrage über das FastCGI-Protokoll an einen separaten Dienst weiter, der die Arbeit erledigt und das Ergebnis zurückgibt: Genau das ist die Aufgabe von PHP-FPM. Die PHP-Dokumentation beschreibt es als die wichtigste FastCGI-Implementierung von PHP, mit Funktionen, die vor allem stark frequentierten Websites nützen. Mit Apache ersetzt PHP-FPM das alte mod_php und wird über mod_proxy_fcgi angebunden.

So funktioniert PHP-FPM

Ein Master-Prozess liest die Konfiguration und verwaltet Kindprozesse, die Worker, die in Pools organisiert sind. Jeder Pool wird in einer eigenen Konfigurationsdatei definiert, oft eine pro Website, mit:

  • user und group: der Systemidentität der Prozesse. Zwei Websites in zwei Pools unter zwei verschiedenen Benutzern können bei korrekten Dateirechten die Dateien der jeweils anderen nicht lesen;
  • listen: der Adresse, an der der Pool Anfragen entgegennimmt, ein Unix-Socket oder eine IP-Adresse mit Port;
  • pm und den zugehörigen Direktiven: der Zahl der Worker;
  • poolspezifischen PHP-Werten über php_value oder php_admin_value. Letztere lassen sich von einem Skript aus nicht mit ini_set() ändern.
Vergleich der drei Prozessmodi von PHP-FPM. static: feste Zahl von Prozessen gleich pm.max_children, immer bereit, belegt aber dauerhaft Speicher, passend für einen Server, der einer stark besuchten Website vorbehalten ist. dynamic: pm.start_servers beim Start, zwischen pm.min_spare_servers und pm.max_spare_servers untätige Prozesse, Obergrenze pm.max_children, der übliche Kompromiss. ondemand: keine Prozesse im Leerlauf, Start bei Bedarf bis pm.max_children, Beenden nach pm.process_idle_timeout, sparsam bei vielen kleinen Websites.
Die Einstellung pm legt fest, wie viele PHP-Prozesse auf Anfragen warten, und damit, wie viel Arbeitsspeicher belegt ist.

Die Einstellungen, auf die es ankommt

pm.max_children legt die Höchstzahl der Worker fest, also wie viele PHP-Anfragen gleichzeitig verarbeitet werden. Zu niedrig, und Besucher müssen warten; zu hoch, und dem Server geht der Arbeitsspeicher aus. Eine einfache Schätzung: den für PHP reservierten Speicher durch den durchschnittlichen Verbrauch eines Workers teilen, gemessen auf deiner eigenen Website.

pm.max_requests startet einen Worker nach einer bestimmten Zahl von Anfragen neu; die Dokumentation empfiehlt das, um Speicherlecks in Bibliotheken von Drittanbietern zu umgehen. Der Standardwert 0 bedeutet: nie neu starten.

request_slowlog_timeout und slowlog protokollieren den PHP-Aufrufstapel zu langsamer Anfragen: ein wertvolles Werkzeug, um das Plugin zu finden, das WordPress ausbremst. request_terminate_timeout beendet einen hängenden Worker, wenn max_execution_time nicht ausreicht.

Video: „How Nginx and PHP-FPM turn a web request into code“ (Chris Fidao, auf Englisch)

Sicherheit

Die PHP-Dokumentation ist eindeutig: PHP-FPM darf niemals aus einem nicht vertrauenswürdigen Netz erreichbar sein. Ein Client, der eine FastCGI-Verbindung öffnen kann, kontrolliert die Konfiguration der Anfrage, einschließlich auto_prepend_file, und kann damit beliebigen Code ausführen. Nutze einen Unix-Socket, wenn der Webserver auf derselben Maschine läuft, und beschränke andernfalls die zugelassenen Clients mit listen.allowed_clients.

Für WordPress

  • Ein Pool pro Website auf einem VPS, der mehrere WordPress-Installationen beherbergt: Ein kompromittiertes Plugin bleibt dann auf seinen Benutzer beschränkt.
  • Härte PHP auf Pool-Ebene: open_basedir, deaktivierte Systemfunktionen und die weiteren Einstellungen aus unserem Leitfaden, um PHP beim Hosting abzusichern. Achtung: disable_functions lässt sich in einem Pool nur ergänzen, nicht ersetzen.
  • Lade PHP-FPM neu, nachdem du die Konfiguration oder die Version geändert hast, und bleib auf einem gepflegten PHP-Zweig (siehe die PHP-Versionen am Ende ihres Lebenszyklus).
  • Aktiviere OPcache: Er wird von allen Workern gemeinsam genutzt und erspart es, die Skripte bei jeder Anfrage neu zu kompilieren.

Beim Shared Hosting stellt der Hoster diese Pools für dich ein; meist kannst du nur die PHP-Version und einige PHP-Werte selbst wählen.

Häufige Fehler

PHP-FPM auf 0.0.0.0 lauschen lassen, pm.max_children so weit hochdrehen, bis der Arbeitsspeicher voll ist, alle Websites im selben Pool laufen lassen oder vergessen, den Dienst nach einer Änderung neu zu laden, und dann glauben, die Einstellung sei aktiv.

Weiterlesen

  • Artikel PHP-Versionen am Lebensende: Zeitplan, Risiken und Migration

Quellen

  1. PHP Manual: FastCGI Process Manager (FPM) (externer Link, öffnet in neuem Tab)
  2. PHP Manual: FPM configuration (externer Link, öffnet in neuem Tab)
  3. WordPress Advanced Administration: Nginx (externer Link, öffnet in neuem Tab)

Alle Definitionen

WordPress-Sicherheit ohne Lärm

Eine E-Mail, wenn es wichtig ist: neu beobachtete Angriffe, Updates des Plugins und praktische Anleitungen. Kein Spam, Abmeldung mit einem Klick.

Starte kostenlos und wechsle zu Pro, wenn du so weit bist

Die kostenlose Version versteckt WordPress bereits und verschiebt die Anmeldeseite. Pro ergänzt Aliasse, Zwei-Faktor-Authentifizierung und Überwachung.