Leitfaden zur PHP-FPM-Konfiguration für Onlineshops mit nginx

Leitfaden zur PHP-FPM-Konfiguration für Onlineshops mit nginx

PHP-FPM (PHP FastCGI Process Manager) fungiert als Bindeglied zwischen dem Webserver und dem PHP-Interpreter auf einem Server. Bei Timme Hosting nutzen wir nginx als Webserver, daher konzentriert sich dieser Leitfaden auf die spezifischen Konfigurationen und Optimierungen für nginx und PHP-FPM. Ziel ist es, eine optimale Leistung für Ihren Onlineshop zu gewährleisten und typische Herausforderungen zu bewältigen.

1. Funktionsweise von PHP-FPM mit nginx

Wenn ein Nutzer eine Seite wie /shop aufruft, verarbeitet nginx die Anfrage zunächst. Anhand der Konfigurationen prüft nginx, ob die angeforderte Ressource existiert und ob es sich um eine Datei oder ein Verzeichnis handelt. Wenn keine passende Datei oder Verzeichnis vorhanden ist, wird die Anfrage an eine PHP-Datei (meist index.php) weitergeleitet. In nginx wird dies typischerweise mit Direktiven wie try_files $uri $uri/ /index.php$is_args$args; konfiguriert.

Dieser Eintrag weist den nginx-Webserver an, zu prüfen, ob:

  • es die angeforderte Ressource (/shop) als Datei auf dem Dateisystem im Document Root der Webseite gibt (try_files $uri), oder ob
  • es die Ressource als Ordner auf dem Dateisystem gibt, in dem eine Index-Datei liegen könnte (try_files $uri/).

Falls beides nicht vorhanden ist, wird die Anfrage, samt Header-Informationen und gegebenenfalls vorhandene Argumente, an die index.php weitergegeben.

Wenn es die index.php im Document Root der Webseite gibt, übernimmt PHP-FPM die Bearbeitung. Ein typisches nginx-Snippet für die Übergabe an PHP-FPM, könnte (hier stark gekürzt) wie folgt aussehen:

location ~ \.php$ {
    [ ... ]
    fastcgi_pass unix:/var/lib/php-fpm/web_site.sock;
    # Weitere Konfigurationen
    [ ... ]
}

Der FPM-Dienst lauscht, in unserem Beispiel, auf einem Socket. Sobald nginx die Anfragen an die Socket-Datei weiterleitet, nimmt der PHP-FPM die Anfrage entgegen, erstellt gegebenenfalls einen Prozess, in dem der PHP-Code dann vom PHP-Interpreter berechnet wird. Das Resultat, der fertige HTML-Quellcode mit allen Headern, wird an nginx zurückgegeben, um das HTML an den Browser auszuliefern. Dieser gesamte Vorgang dauert oft weniger als 200ms.

2. PHP-FPM-Einstellungen in ISPConfig

In ISPConfig können Sie auf Managed Servern, Managed vServern und Managed ScaleServern bestimmte PHP-FPM-Einstellungen anpassen, um die Leistung Ihrer Webseite zu optimieren. Diese erreichen Sie über den Optionen-Reiter Ihrer Webseite. Im Folgenden werden einige wichtige Konfigurationsoptionen erläutert:

Benutze Socket für PHP-FPM

PHP-FPM kann entweder über eine Socket-Datei oder einen TCP-Port kommunizieren. In den meisten Fällen ist die Verwendung einer Unix-Socket-Datei schneller und hat weniger Overhead als die Nutzung eines TCP-Ports. Diese Einstellung sollte in der Regel nicht geändert werden, es sei denn, Sie haben spezifische Anforderungen und wissen genau, was Sie konfigurieren möchten. Schalten Sie den Socket für PHP-FPM aus, lauscht der FPM für diese Webseite auf einem Port und kann darüber angesprochen werden.

PHP FastCGI Prozess-Manager-Modi

Der PHP FastCGI Prozess-Manager bietet drei Modi zur Verwaltung der PHP-Prozesse, wobei ondemand von uns im Default immer aktiviert wird, weil dieser allgemein die bessere Option ist.

1. ondemand (Standardmodus)

Erstellt PHP-Prozesse nur bei Bedarf und beendet sie, wenn sie nicht mehr benötigt werden. Dieser Modus spart Ressourcen und ist in den meisten Fällen am effizientesten. Dabei werden maximal so viele Prozesse erstellt, wie in pm.max_children eingetragen sind.

Wenn also 100 pm.max_children eingestellt sind, dann kann diese Seite theoretisch 100 PHP-Prozesse erstellen, die beispielsweise von 100 gleichzeitigen Benutzern getriggert wurden.

Sobald die Prozesse die angeforderten Inhalte berechnet und an nginx zurückgeliefert haben, wartet der PHP-FPM maximal noch die Anzahl an Sekunden, die in pm.process_idle_timeout eingetragen ist, bevor der Prozess dann vom PHP-FPM beendet wird. Sollte ein neuer Request einen Prozess vorher benötigen, würde der PHP-FPM die Prozesse, die noch im Leerlauf (Idle) sind, der neuen Anfrage zuordnen.

2. dynamic

Der dynamic-Modus verfolgt eine andere Logik und kann je nach Anwendungsfall durchaus sinnvoll sein. Er hält eine bestimmte Anzahl an Prozessen ständig bereit und passt die Anzahl der Prozesse dynamisch an die Last an. Dies kann bei häufigen, plötzlichen Lastspitzen vorteilhaft sein.

Auch hier wird eine maximale Anzahl an PHP-Prozessen mit pm.max_children definiert. Mit pm.min_spare_servers kann jedoch eine minimale Anzahl an Prozessen vorgehalten werden, die immer im Leerlauf sind und auf Anfragen warten. Das Gegenstück dazu bildet pm.max_spare_servers und begrenzt die maximale Anzahl an Prozessen, die vorgehalten werden sollten.

Mit pm.start_servers wird definiert, wie viele Prozesse direkt gestartet werden sollen.

Durch den dynamic-Modus werden also mehr Prozesse vorgehalten und bei steigender Last entsprechend mehr Prozesse erstellt. Gleichzeitig werden auch Prozesse zum Vorhalten erstellt.

Durch diese Vorgehensweise sind bei Bedarf schon Prozesse da und man spart sich so gegebenenfalls noch wenige Millisekunden für den Aufbau der Prozesse.

3. static

Der static-Modus ist eher für Anwendungen gedacht, die durchgehend unter Hochlast laufen und bei denen einfach immer eine Mindestanzahl an PHP-Prozessen benötigt wird. Er startet und hält eine feste Anzahl von PHP-Prozessen bereit. Dieser Modus eignet sich für Anwendungen mit konstant hoher Last, benötigt aber mehr Ressourcen.

Für den static-Modus gibt es nur die Einstellung für pm.max_children, die auch gleich die Menge der Prozesse definiert, die für diese Seite gestartet und vorgehalten werden.

Hier muss man beachten, dass diese Prozesse direkt gestartet werden und gegebenenfalls unnötige Ressourcen belegen.

Zu static raten wir tatsächlich nur, wenn klar ist, dass die Menge an Prozessen notwendig ist und der Server auch groß genug ist, um die Menge zu verarbeiten.

Wichtige PHP-FPM-Einstellungen

pm.max_children

Definiert die maximale Anzahl an gleichzeitig laufenden PHP-Prozessen. Ein zu hoher Wert kann zu Serverüberlastung führen, ein zu niedriger Wert zu Anfragestau.

Wichtig ist, dass Sie den Wert für pm.max_children passend zu Ihrem Server und zur Anwendung einstellen. Je träger die Anwendung ist, desto geringer sollten die pm.max_children eingestellt sein, um zu verhindern, dass der Server durch Überlast zusammenbricht, weil der CPU-Kern entsprechend länger blockiert wird. Berechnet Ihre Anwendung die Inhalte jedoch zügig, können ruhig auch mehr pm.max_children eingestellt werden.

Leider gibt es hier keine konkrete Formel, nach der man die Anzahl der Prozesse einfach berechnen kann. Deshalb muss man sich da langsam herantasten.

Sind die pm.max_children mal ausgeschöpft, werden keine neuen PHP-Prozesse mehr für die Seite erstellt und alle weiteren Anfragen werden mit einem 502 Bad Gateway beantwortet. Im Falle eines überlasteten Servers ist es immer besser, wenn die Anfrage mit einem Status 502 Bad Gateway beendet wird, damit der Server die bestehenden Anfragen zunächst abarbeiten kann.

pm.process_idle_timeout

Bestimmt, wie lange ein Leerlaufprozess auf eine neue Anfrage wartet, bevor er beendet wird. Ein kürzeres Timeout spart Ressourcen, ein längeres Timeout reduziert Verzögerungen bei neuen Anfragen.

pm.max_requests

Gibt an, wie viele Anfragen ein PHP-Prozess verarbeiten darf, bevor er neu gestartet wird. Diese Einstellung kann helfen, Speicherlecks zu minimieren und die Stabilität zu erhöhen.

pm.start_servers

Die Anzahl der PHP-Prozesse, die beim Start erstellt werden (nur im dynamic-Modus). Ein moderater Wert sorgt für schnelle Reaktionen auf Anfragen ohne Ressourcen zu verschwenden.

pm.min_spare_servers und pm.max_spare_servers

Diese Werte definieren die minimale und maximale Anzahl an Leerlaufprozessen, die vorgehalten werden sollen, um schnell auf neue Anfragen reagieren zu können, ohne unnötig Ressourcen zu verbrauchen.

Die richtige Konfiguration von PHP-FPM ist entscheidend, um die Leistung Ihres Onlineshops zu maximieren und eine reibungslose Benutzererfahrung zu gewährleisten. Durch die Optimierung der PHP-FPM-Einstellungen in Kombination mit nginx können Sie die Ressourcen Ihres Servers optimal nutzen und gleichzeitig schnelle Ladezeiten und Stabilität sicherstellen. Wenn Sie weitere Anpassungen vornehmen möchten, finden Sie die entsprechenden Optionen in ISPConfig unter dem Reiter "Optionen" Ihrer Webseite.

Schritt-für-Schritt-Anleitung

Managed vServer, Managed Server, ScaleServer & Cloud: Loggen Sie sich bitte über Ihr Server Control Panel ein.


1

  • Loggen Sie sich ein (siehe Hinweis).
  • Wählen Sie im Hauptmenü den Punkt "Webseiten".

Ergebnis: Die Seite "Webseiten" wird angezeigt.


Klicken Sie auf das Bild, um es zu vergrößern.

2

  • Wählen Sie die Website mittels Klick aus, für die Sie die PHP-FPM-Einstellungen anpassen möchten.

Ergebnis: Die Seite "Webseite" wird angezeigt.



3

  • Es stehen Ihnen verschiedene Reiter zur Auswahl zur Verfügung.
  • Wählen Sie den Reiter "Optionen" aus.

Ergebnis: Sie gelangen in die Detailansicht des Reiters "Optionen".



4

  • Scrollen Sie etwas nach unten bis zum Feld "Benutze Socket für PHP-FPM".
  • Hier finden Sie die verfügbaren Einstellungen für PHP-FPM.
  • Je nach Auswahl im Feld "PHP-FPM-FastCGI-Prozess-Manager" stehen Ihnen unterschiedliche Einstellungen zur Verfügung.

Ergebnis: Sie haben die PHP-FPM-Einstellungen vorgenommen.



5

  • Scrollen Sie ans Ende der Seite.
  • Klicken Sie zum Bestätigen Ihrer Eingabe den grünen Button "Speichern".

Ergebnis: Die PHP-FPM-Einstellungen wurden gespeichert.


Finden Sie den passenden Tarif

Unser Tarifberater hilft Ihnen dabei, das passende Paket zu finden. Bei Fragen berät Sie unser Sales-Team sehr gerne unter +49 (0) 4131 / 22 78 1-25 oder sales@timmehosting.de.

Bitte beachten Sie: Der Tarifberater dient nur der groben Orientierung. Ihr tatsächlicher Bedarf kann durch den Ressourcenbedarf Ihrer Anwendung(en), tageszeitabhängige/saisonale/aktionsbedingte Schwankungen des Besucheraufkommens, geplantes Wachstum und weitere Faktoren von der Empfehlung abweichen.

  • 1
  • 2
  • 3
  • 4
  • 5

Was möchten Sie hosten?

Möchten Sie einen oder mehrere Shops hosten? (Eine Multishop-Installation gilt als ein Shop.)

Möchten Sie eine oder mehrere Websites hosten? (Eine Multisite-Installation gilt als eine Website.)

Wieviele Besucher haben Sie insgesamt pro Tag?

Wieviele Besucher haben Sie insgesamt pro Tag?

Wieviele Besucher haben Sie insgesamt pro Tag?

Wieviele Artikel haben Sie insgesamt in Ihrem Shop/Ihren Shops (inkl. Varianten)?

Wieviele Artikel haben Sie insgesamt in Ihrem Shop/Ihren Shops (inkl. Varianten)?

Wieviel Speicherplatz benötigen Sie insgesamt?

Wieviel Speicherplatz benötigen Sie insgesamt?

Wieviel Speicherplatz benötigen Sie insgesamt?

Wir empfehlen Ihnen folgende Lösungen:

ScaleServer oder Web Hosting

Zu den ScaleServer Paketen Zu den Web Hosting Paketen

Wir empfehlen Ihnen folgende Lösungen:

ScaleServer oder Shop Hosting

Zu den ScaleServer Paketen Zu den Shop Hosting Paketen

Wir empfehlen Ihnen folgende Lösungen:

Managed vServer oder ScaleServer

Zu den Managed vServer Paketen Zu den ScaleServer Paketen

Wir empfehlen Ihnen folgende Lösungen:

Managed Server oder ScaleServer

Zu den Managed Server Paketen Zu den ScaleServer Paketen

Wir empfehlen Ihnen unsere

Timme Cloud 2.0

Zur Timme Cloud 2.0