Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| apache:php-fpm [2026/07/02 22:31] – angelegt gerald | apache:php-fpm [2026/07/03 13:55] (aktuell) – [Zu wenige childs im Error Log] gerald | ||
|---|---|---|---|
| Zeile 116: | Zeile 116: | ||
| < | < | ||
| + | |||
| + | ===== 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: | ||
| + | |||
| + | |||
| + | < | ||
| + | Setze: | ||
| + | |||
| + | Code | ||
| + | < | ||
| + | log_errors = On | ||
| + | error_log = / | ||
| + | </ | ||
| + | Falls die Datei nicht existiert, wird sie automatisch angelegt. | ||
| + | |||
| + | Dann: | ||
| + | |||
| + | |||
| + | < | ||
| + | Jetzt schreibt PHP alle Fehler in: | ||
| + | |||
| + | |||
| + | < | ||
| + | Dort findest du den echten Fehler. | ||
| + | |||
| + | 3. Pool‑Log aktivieren (noch besser) | ||
| + | |||
| + | Öffne: | ||
| + | |||
| + | |||
| + | < | ||
| + | Füge hinzu: | ||
| + | |||
| + | |||
| + | < | ||
| + | php_admin_value[error_log] = / | ||
| + | php_admin_flag[log_errors] = on | ||
| + | </ | ||
| + | Dann: | ||
| + | |||
| + | Code | ||
| + | < | ||
| + | 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 / | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | nano / | ||
| + | </ | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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: | ||
| + | * 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.) | ||
| + | |||
| + | < | ||
| + | < | ||
| + | [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] = / | ||
| + | |||
| + | ; --- Slowlog --- | ||
| + | request_slowlog_timeout = 4s | ||
| + | slowlog = / | ||
| + | |||
| + | ; --- 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) | ||
| + | |||
| + | < | ||
| + | |||
| + | < | ||
| + | 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: | ||
| + | |||
| + | < | ||
| + | → Wenn nichts Neues kommt: perfekt. | ||
| + | |||
| + | Slowlog: | ||
| + | |||
| + | < | ||
| + | → Zeigt dir echte Problemstellen im Code. | ||
| + | |||
| + | Live‑Status: | ||
| + | |||
| + | < | ||
| + | 🧠 Optional: Separate Pools pro Domain | ||
| + | |||
| + | Fazit | ||
| + | Mit deinen Hardware‑Daten konnte ich die Konfiguration jetzt exakt optimieren. | ||