PHP FPM und Nginx Server LeistungsoptimierunPHP FPM und Nginx Server Leistungsoptimierun (Bild © PCMasters.de)

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.
    1. 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 = static
  • pm.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 = dynamic
  • pm.max_children = 50
  • pm.start_servers = 5
  • pm.min_spare_servers = 5
  • pm.max_spare_servers = 35

3. On-Demand-Modus

Erzeugt Worker-Prozesse nur bei Eingang einer Anfrage, wodurch der Speicherverbrauch in Leerlaufphasen reduziert wird.

  • pm = ondemand
  • pm.max_children = 50
  • pm.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