mod-php oder php-fpm

sbr2d2

Registered User
Hallo,

wie in meinem anderen Thread zu lesen ist, wurde ich gebeten einen Server von Plesk zu befreien. Mit dem Thema Mailserver bin ich fast fertig so das ich mich schon an die nächste Baustelle wage. Zur Zeit läuft ein Ubuntu 16.04 mit Plesk. Die Seiten werden mit dem Apache ausgeliefert und über php-fpm verarbeitet. Was sich zum anderen Thema mittlerweile geändert hat, es wird Ubuntu 18.04 als BS gewählt werden ohne Plesk.
Systemkomponenten werden also Apache, Mariadb, PHP-7.2 und Proftp.
Die Auslastung ist eher bescheiden. Es greifen im Durchschnitt 50-80 Leute gleichzeitig drauf zu, fragen ein paar Daten ab, ändern was und tragen neue Daten wieder ein. Der Server selbst rechnet im Minutentakt dann mit den Daten und stellt die neuen Ergebnisse bereit.

Die eigentliche Frage ist nun, was ist "besser"?. Das ganze wieder über PHP-fpm zu machen oder mod-php? PHP-fpm habe ich irgendwo gelesen das es nicht weiter entwickelt wird oder zumindest Zur Zeit nicht. Ist diese Info richtig? Der Sicherheitsaspekt soll über PHP-fpm höher sein, da jeder Prozess unter einem eigenen Benutzer läuft. Des weiteren kann man das ganze dann noch recht restriktiv konfigurieren während bei mod-php alles unter www-data läuft.
Habt Ihr nennenswerte Argumente was man am besten nehmen sollte?
Vielen Dank schon mal fürs Lesen

ps: Mein Wissensstand in Sachen PHP hält sich noch in Grenzen, sonst hätte ich mir die Frage bestimt selbst beantworten können :)
 
PHP-FPM ist vor einigen Versionen sogar ins offizielle PHP eingeflossen, anstatt wie vorher nur als 3rd Party Patch bereitzustehen. Die Weiterentwicklung ist wohl sichergestellt. :)

PHP-FPM und vorallem die damit verbundene Apache Anbindung über proxy_fcgi bringt aber ein paar andere nette Features mit sich: Man ist nicht mehr auf mpm_prefork angewiesen und kann auch dem Apache mal ein moderneres Backend spendieren, beispielsweise mpm_event. Was wiederrum zur Folge hat, dass man auch Module wie http2 verwenden kann, welche sich bei Verwendung von mpm_prefork sonst selbst wieder deaktivieren. ;)

Bei Ubuntu 18.04 machts rechtemäßig keinen Unterschied ob mod_php oder PHP-FPM. Beides läuft unter www-data. Aber ja natürlich hat PHP-FPM den Vorteil, dass man auch weitere Pools unter anderen Benutzern ausführen kann, welche sich dann pro vHost unterschiedlich ansprechen lassen.

Was Performance betrifft, so dürfte das zwischen den beiden Varianten kaum Unterschiede machen. Weil aus Sicht von PHP sich an der Prozessstruktur nichts geändert hat. Das läuft wieder als preforked Instanzen genauso wie früher im Apache+mpm_prefork.

Von daher ganz klar die Empfehlung zu PHP-FPM.
 
Last edited by a moderator:
Ich kenne mich mit PHP nicht aus. FPM startet doch mehrere PHP-Interpreter (als eigene Prozesse?). Nimmt man den Apache-PHP-Mod werden die Instanzen als Threads gestartet.
Gibt es auch die Möglichkeit PHP asynchron zu nutzen wie Python oder NodeJS es ermöglicht?

Jedenfalls kann man PHP-FPM für den jeweiligen WebUser starten, was das Handhabung mit den Berechtigungen verbessert.

Ich frage wegen dem C10K-Problem.
 
Last edited by a moderator:
Nimmt man den Apache-PHP-Mod werden die Instanzen als Threads gestartet.

Genau das passiert eben nicht. mod_php kann wie schon erwähnt nur mit mpm_prefork genutzt werden und der kennt keine Threads. PHP ist nicht Threadsafe. Daher wird es auch niemals in Threads laufen.
 
Mein Wissensstand ist, dass bei PHP nicht alle Module threadsafe sind, allerdings muss ich dazu sagen, dass mein Wissensstand da noch irgendwo bei PHP5 ist.
Solange man PHP nur unter dem Apache-User betreiben will, und keine Trennung mehrerer Webseiten benötigt, dann ist mod_php OK. Spätestens wenn man (wie Webhoster) das PHP mit dem gleichen User laufen lassen will, der auch die Dateien per FTP hochlädt, ist PHP-FPM meiner Meinung nach derzeit erste Wahl. Die Einstellung der Entwicklung von PHP-FPM bezieht sich nur auf den Third-Party-Patch - der wird nicht mehr weiterentwickelt, das PHP-FPM nun offiziell von den PHP-Machern supportet und dort auch weiterentwickelt wird.
Bezüglich Performance liegen beide System meines Wissens gleichauf. Da man bei Apache ohne mod-php auf einen moderneren MPM wechseln kann, spricht das eigentlich für PHP-FPM.
 
Das heißt also das bei mod_php keine Threads gestartet werden, sondern es werden Prozesse gestartet (mpm_prefork)? Das ist ja noch mehr Ressourcenverschwendung. Threads sind zwar auch nicht Ideal, aufgrund des Shared Memory (locking, queues), aber immerhin verbrauchen die weniger Speicher.

Also gibt es gar keine Lösung für das C10K-Problem bei dem Apache2 + [mod_php|php_fpm].

Jedenfalls hatte ich mal früher genau wegen den Berechtigungen php_fpm verwendet. So hatte jeder User seinen eigenen Interpreter. Das mit den Belichtungen war auch besser. Bessere Isolierung der Verzeichnisse. Früher(TM) gab es immer wieder Probleme, dass wenn eine Seite mit Malware befallen war, gleich alle Kunden betroffen waren, da der Interpreter überall Schreibzugriff hatte.
 
AFAIK ist mod_php deswegen Resourcenverschwendung, weil die ganze PHP-Umgebung bei jedem Apache-Request geladen ist, ganz unabhängig ob es sich tatsächlich um eine PHP-Datei handelt oder nur um ein Bild oder was auch immer.

PHP-FPM bekommt nur die tatsächlichen Anfragen für Requests, die auch tatsächlich PHP-Programme aufrufen(üblicherweise nach Endung spezifiziert).
 
Das heißt also das bei mod_php keine Threads gestartet werden, sondern es werden Prozesse gestartet (mpm_prefork)?

Jein, mod_php ist ja kein eigenständiges Programm, sondern Bestandteil des Apache-Prozesses - und der startet beim mpm_prefork halt keine Threads, sondern neue Unterprozesse.
 
Hallo,
ich beschäftige mich gerade auch damit, da ein Kunde in seinem alt System
auf ISPConfig gesetzt hat. ISPConfig nutzt immer fcgi mit suexec.



Was ich bis jetzt umgesetzt habe ist das man bei jeder Domain entscheiden
kann ob hier php oder fpm zum Zuge kommt.


Ich hab in der Apache Konfig folgendes drin:
Code:
<FilesMatch \.php$>        # 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
 
        # Else we can just use a tcp socket:
        #SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>


Wenn man auf die entsprechende Domain dann mal die php_info Aufruft
sieht man in der Zeile "Server API" entweder "FPM/FastCGI"

oder "Apache 2.0 Handler"


Gruß
Sven
 
Vielen Dank schon mal für die hilfreichen Beiträge. Also Benutzer/Webuser wird es nur einen geben was den Gewinn an Sicherheit dann nicht so hervorhebt. Dennoch werde ich dann bei php-fpm bleiben. Ich habe gelesen das über mod-php auch gerne mal Prozesse nicht beendet werden und dann den speicher voll müllen während man über php-fpm die Laufzeit steuern kann ab wann so was von selbst beendet wird. Leistung ist auch mehr als genug vorhanden womit man jetzt auch kein Auswahlkriterium hätte. Es bleibt also einfach bei php-fpm.

Vielen Dank :)
 
Also ich nutze ebenfalls ISPConfig und man kann dort wählen zwischen "CGI, FastCGI, PHP-FPM und mod_php" bis her null Probleme. Zumal wie oben beschrieben habe ich mod_php deaktiviert damit ich mpm_event und http2 nutzen kann.
 
Ich habe gelesen das über mod-php auch gerne mal Prozesse nicht beendet werden und dann den speicher voll müllen während man über php-fpm die Laufzeit steuern kann ab wann so was von selbst beendet wird.

Völlig egal. Da das Prozessmodell zwischen php-fpm und mod_php+mpm_prefork absolut identisch ist, haben beide Varianten die gleichen Funktionen was Laufzeiten, Garbagecollection und der gleichen betrifft. Die Optionen heißen halt anders. Aber das Ergebnis ist das gleiche.
 
Back
Top