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.

 
Nach oben
apache/php-fpm.txt · Zuletzt geändert: von gerald
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0
DFmW2CEce3htPL1uNQuHUVu4Tk6WXigFQp   Dogecoin Donations Accepted Here    DFmW2CEce3htPL1uNQuHUVu4Tk6WXigFQp  DFmW2CEce3htPL1uNQuHUVu4Tk6WXigFQp