Inhaltsverzeichnis

PHP-FPM

Apache mit mpm_prefork war bis 2005 ok, heut überholt

PHP‑FPM = PHP FastCGI Process Manager

Technisch:

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

Heute nutzen alle großen Systeme PHP‑FPM:

Fazit

PHP‑FPM ist:

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.

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?

🔥 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.