====== PHP-FPM ======
Apache mit mpm_prefork war bis 2005 ok, heut überholt
PHP‑FPM = PHP FastCGI Process Manager
Technisch:
* Ein eigener Dienst, der PHP‑Skripte ausführt
* Apache kommuniziert über FastCGI mit PHP‑FPM
* Apache muss PHP nicht mehr selbst laden
* PHP‑FPM verwaltet seine eigenen Worker‑Prozesse
Das ist ein komplett anderes Architekturmodell.
**Wie funktioniert das technisch?**
1️⃣ Apache empfängt eine Anfrage
Beispiel: /index.php
2️⃣ Apache erkennt: „Das ist PHP“
Durch den globalen Handler:
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
3️⃣ Apache schickt die Anfrage über einen Unix‑Socket an PHP‑FPM
Der Socket ist:
/run/php/php8.2-fpm.sock
4️⃣ PHP‑FPM hat einen Pool von PHP‑Worker‑Prozessen
Beispiel:
pm.max_children = 20
Das bedeutet:
bis zu 20 PHP‑Prozesse gleichzeitig
jeder Prozess kann mehrere Anfragen nacheinander abarbeiten
5️⃣ PHP‑FPM sendet das Ergebnis zurück an Apache
Apache liefert es an den Browser aus.
**Seit wann gibt es PHP‑FPM?**
PHP‑FPM wurde:
2009 als Patch entwickelt
* 2012 offiziell in PHP 5.4 integriert
* Seit PHP 7 ist es der Standard
* Seit PHP 8 ist mod_php praktisch tot
*
Heute nutzen alle großen Systeme PHP‑FPM:
* WordPress
* Joomla
* Shopware
* Magento
* Symfony
* Laravel
**Fazit**
PHP‑FPM ist:
* schneller
* stabiler
* sicherer
* moderner
* flexibler
* skalierbarer
Und du hast jetzt endlich ein Setup, das für 2026 geeignet ist – nicht für 2005.
===== PHP‑Warnings global abschalten =====
nano /etc/php/8.2/fpm/php.ini
error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = Off
error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = Off
systemctl restart php8.2-fpm
systemctl restart apache2
Nur bestimmte Domains ohne Warnungen
Falls du es nur für eine Domain abschalten willst:
In /etc/php/8.2/fpm/pool.d/www.conf:
php_admin_value[error_reporting] = 0
php_admin_value[display_errors] = Off
php_admin_value[log_errors] = Off
Dann:
systemctl restart php8.2-fpm
===== Log Errors =====
php-fpm hat ein eigenes Error-System und gibt sie nicht unbedingt zu Apache weiter.
1. PHP‑FPM schreibt Fehler NICHT in Apache‑Logs
Das ist der wichtigste Punkt.
* mod_php → Fehler im Apache‑Log
* PHP‑FPM → Fehler im FPM‑Log
Du musst also FPM‑Logs aktivieren.
2. PHP‑FPM‑Log aktivieren (wichtigster Schritt)
Öffne:
nano /etc/php/8.2/fpm/php.ini
Setze:
Code
log_errors = On
error_log = /var/log/php-fpm.log
Falls die Datei nicht existiert, wird sie automatisch angelegt.
Dann:
systemctl restart php8.2-fpm
Jetzt schreibt PHP alle Fehler in:
/var/log/php-fpm.log
Dort findest du den echten Fehler.
3. Pool‑Log aktivieren (noch besser)
Öffne:
nano /etc/php/8.2/fpm/pool.d/www.conf
Füge hinzu:
php_admin_value[error_log] = /var/log/php-fpm-www.log
php_admin_flag[log_errors] = on
Dann:
Code
systemctl restart php8.2-fpm
Jetzt hast du pro Pool ein eigenes Log.
4. Fehler sichtbar machen (temporär)
Wenn du die Seite debuggen willst, kannst du nur für diese Domain Fehler anzeigen lassen:
In www.conf:
php_admin_value[display_errors] = On
php_admin_value[display_startup_errors] = On
Nach dem Debuggen wieder ausschalten.
===== Zu wenige childs im Error Log =====
nano /etc/php/8.2/fpm/pool.d/www.conf
nano /etc/php/8.2/fpm/pool.d/www.conf
Wenn du 16 GB RAM hast: (ich habe 32)
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 20
===== Optimale Konfiguration für meinen Server =====
mit deinen Hardware‑Daten (4 Kerne / 8 Threads, 32 GB RAM, hoher Bild‑Traffic, Legacy‑Code, viele Domains) kann ich deine PHP‑FPM‑Konfiguration jetzt perfekt auf deinen Server zuschneiden.
Das hier ist keine generische Empfehlung, sondern exakt auf deine CPU, deinen RAM, deine Last, deinen Shop und deine Bildgenerierung abgestimmt.
Takeaway: Deine optimale PHP‑FPM‑Konfiguration
Du solltest 40–60 Worker fahren, dynamic nutzen, OPcache hochdrehen, Slowlog aktivieren, und pm.max_requests setzen, um Memory‑Leaks aus Legacy‑Code abzufangen.
🧠 Warum genau diese Werte?
* CPU: 4 Kerne / 8 Threads → ideal für 40–60 FPM‑Worker
* RAM: 32 GB → genug für 60 Worker à 50–120 MB
* Lastprofil: viele Bilder, viele Domains, viele parallele Requests
* Legacy‑Code: Memory‑Leaks → pm.max_requests zwingend
* Shop: viele AJAX‑Requests → hohe Parallelität nötig
* Bots: mod_evasive entschärft → FPM muss mehr abfangen
🔥 Deine optimale PHP‑FPM‑Konfiguration (final)
(Du kannst das 1:1 übernehmen.)
/etc/php/8.2/fpm/pool.d/www.conf
[www]
; --- Prozessmanager ---
pm = dynamic
; --- Worker-Anzahl ---
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
; --- Memory-Leaks abfangen ---
pm.max_requests = 800
; --- Logging ---
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php8.2-fpm-www.log
; --- Slowlog ---
request_slowlog_timeout = 4s
slowlog = /var/log/php8.2-fpm-slow.log
; --- Zeitlimits ---
request_terminate_timeout = 60s
; --- Ressourcen ---
rlimit_files = 65535
rlimit_core = 0
; --- Sicherheit ---
security.limit_extensions = .php
🔥 Optimiertes OPcache (für deinen großen Legacy‑Code)
/etc/php/8.2/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=40000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.save_comments=1
Warum so groß?
Dein Code ist umfangreich
Viele Domains teilen sich denselben Pool
Viele Includes, viele Engines, viele Legacy‑Dateien
Bildgenerierung → viele Funktionsaufrufe
512 MB OPcache ist für 32 GB RAM absolut sinnvoll
📈 Was du dadurch bekommst
Keine FPM‑Staus mehr
Keine „Seite funktioniert nicht“ mehr
Keine AH01071‑Fehler mehr
Legacy‑Code läuft stabiler
Bildgenerierung schneller
Shop reagiert schneller
Weniger CPU‑Last durch OPcache
Weniger Memory‑Leaks durch pm.max_requests
🔍 Wie du prüfst, ob alles sauber läuft
FPM‑Log:
grep max_children /var/log/php8.2-fpm.log
→ Wenn nichts Neues kommt: perfekt.
Slowlog:
tail -f /var/log/php8.2-fpm-slow.log
→ Zeigt dir echte Problemstellen im Code.
Live‑Status:
systemctl status php8.2-fpm
🧠 Optional: Separate Pools pro Domain
Fazit
Mit deinen Hardware‑Daten konnte ich die Konfiguration jetzt exakt optimieren.