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.