Systeminstallation und Einrichten der Umgebung
Bei Ubuntu- und Debian-basierten Systemen erfolgt die Bereitstellung der PHP-FPM-Umgebung und der erforderlichen Erweiterungen über den Paketmanager. Die folgende Befehlsfolge installiert den Kernmanager und wichtige Bibliotheken für Datenbankanbindung, Datenverarbeitung und Bildbearbeitung:
apt update
apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
Die Überprüfung der installierten Version erfolgt mit dem Befehl: php -v.
Architektonischer Arbeitsablauf und Dateisystemstruktur
Der Kommunikationsfluss zwischen dem Webserver und dem Prozessor folgt einer bestimmten Abfolge:
- 1.Nginx fängt die eingehende HTTP-Anfrage ab.
- 2.Die Anfrage wird über einen Unix-Socket oder eine TCP-Verbindung an PHP-FPM weitergeleitet.
- 3.PHP-FPM führt das Skript aus.
- 4.Die verarbeitete Ausgabe wird an Nginx zurückgegeben.
-
- ginx liefert die endgültige Antwort an den Client.
Wichtige Konfigurations- und Protokolldateien befinden sich unter den folgenden Pfaden (Beispiel basierend auf PHP 8.2):
-
Hauptkonfiguration:
/etc/php/8.2/fpm/php.ini -
Pool-Definitionen:
/etc/php/8.2/fpm/pool.d/www.conf -
Unix-Socket:
/run/php/php8.2-fpm.sock -
Systemprotokolle:
/var/log/php8.2-fpm.log
Nginx-Integration und Kommunikationsmethoden
Lokale Kommunikation über Unix-Sockets
Bei Anwendungen, bei denen der Webserver und PHP-FPM auf derselben physischen oder virtuellen Maschine laufen, werden Unix-Sockets bevorzugt, um den Overhead zu reduzieren. Die Serverblock-Konfiguration sieht wie folgt aus:
Nginx Config:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Fernkommunikation über TCP
In Architekturen mit hohem Datenverkehr oder verteilten Systemen, in denen PHP-FPM auf einem separaten Backend-Server gehostet wird, kommt TCP zum Einsatz.
Nginx-Konfiguration:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
PHP-FPM-Pool-Konfiguration (www.conf):
listen = 127.0.0.1:9000
Konfiguration des Prozessmanagers (PM) und Ressourcenzuweisung
Die Datei /etc/php/8.2/fpm/pool.d/www.conf legt fest, wie der Server Worker-Prozesse verwaltet. Es gibt drei Hauptmodi:
1. Statischer Modus
Hält unabhängig vom Bedarf eine feste Anzahl von Kindprozessen aufrecht. Dies eignet sich für dedizierte Server mit vorhersehbarer Auslastung.
pm = staticpm.max_children = 10
2. Dynamischer Modus
Passt die Anzahl der Worker-Prozesse basierend auf einem definierten Bereich an. Dies ist die Standardeinstellung für Allzweckserver.
pm = dynamicpm.max_children = 50pm.start_servers = 5pm.min_spare_servers = 5pm.max_spare_servers = 35
3. On-Demand-Modus
Erzeugt Worker-Prozesse nur bei Eingang einer Anfrage, wodurch der Speicherverbrauch in Leerlaufphasen reduziert wird.
pm = ondemandpm.max_children = 50pm.process_idle_timeout = 10s
Berechnung der optimalen Worker-Anzahl
Um den Wert für pm.max_children zu ermitteln, verwende folgende Formel:
Verfügbarer RAM / Durchschnittlicher RAM-Bedarf pro PHP-Prozess = max_children
Berechnungsbeispiel:
- Gesamter Server-RAM: 4 GB
- System- und Datenbank-Overhead: 1 GB
- Verbleibender RAM für PHP: 3 GB
- Geschätzter RAM-Bedarf pro Prozess: 50–100 MB
- Ergebnis: 30 bis 60 Worker.
Um den tatsächlichen Speicherverbrauch pro Prozess zu berechnen, führe Folgendes aus:
ps --no-headers -o „rss,cmd“ -C php-fpm8.2 | awk ‚{ sum+=$1 } END { print sum/NR/1024„ MB“ }‘
Optimierung der PHP-Engine und OPcache
Die Feinabstimmung der php.ini-Datei ist für Stabilität und Geschwindigkeit notwendig.
Ressourcen- und Upload-Limits
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 64M
post_max_size = 64M
OPcache-Konfiguration
OPcache speichert vorkompilierten Skript-Bytecode im gemeinsamen Speicher, sodass PHP Skripte nicht bei jeder Anfrage neu laden und parsen muss. Für Produktionsumgebungen werden folgende Einstellungen empfohlen:
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 0
opcache.revalidate_freq = 0
Erweiterte Überwachung und Diagnose
FPM-Statusseite
Um die Leistung in Echtzeit zu überwachen, aktiviere den Statuspfad in www.conf:
pm.status_path = /fpm-status
Beschränke den Zugriff in Nginx ausschließlich auf lokale Anfragen:
location /fpm-status {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
allow 127.0.0.1;
deny all;
}
Implementierung des Slow-Logs
Um ineffizienten Code zu identifizieren, aktiviere das Slow-Log in der Pool-Konfiguration:
slowlog = /var/log/php8.2-fpm-slow.log
request_slowlog_timeout = 5s
Multi-Pool-Bereitstellung zur Isolierung
Für Server, die mehrere Websites oder Benutzer hosten, sollten separate Pools erstellt werden (z. B. /etc/php/8.2/fpm/pool.d/example.conf), um die Prozessisolierung sicherzustellen:
[example]
user = example
group = example
listen = /run/php/php8.2-fpm-example.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
php_admin_value[error_log] = /var/log/php/example-error.log
php_admin_flag[log_errors] = on

