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