php-fpm vs php-"cgi"

  • Ich habe auf meinen Servern durchgängig Apache mit "normalem" php laufen.

    Lohnt es sich, eurer Meinung nach, es mal mit php-fpm zu versuchen?

    (Ich habe keine wirklich CPU/Speicher-Kritischen Sachen laufen, die höchste Performance benötigen)


    Ist die Konfiguration deutlich komplexer bzw. fehleranfälliger? Oder mit etwas Sorgfalt gut beherrschbar?

    Die Infos im Netz, wie Apache mit php-fpm zu konfigurieren ist, sind m.E. ziemlich widersprüchlich. Gibt es da eine gute, zuverlässige Doku?


    Mit der Kombi Apache/php-fpm habe ich noch so gar keine Erfahrung. :(

    Aber ich bin lernwillig. :)

  • Ich nutze auf meinen Servern ausschließlich php-fpm unter ngninx. War damals ne kleine Umstellung. Aber geht eigentlich relativ fix von der Hand. Muss es unbedingt Apache sein?


    Ist halt wesentlich Ressourcen sparsamer und in meinen Augen auch deutlich performanter bei hoher Last.

    Meine Produkte: definitiv zu viele, RS, VPS, Domains, Webhosting, ...

  • "Muss es unbedingt Apache sein?"


    In meinem privaten Bereich bin ich da natürlich völlig frei. Ansonsten nicht und Apache ist vorgegeben. Um mich nicht in zwei Systeme einarbeiten zu müssen, habe ich mich deshalb selbst auf Apache beschränkt.


    Insofern würde mich zunächst mal tatsächlich die Kombi Apache/php-fpm interessieren. (Nginx werde ich aber sicher auch irgendwann mal durchtesten)

  • Ich nutze selbst nginx seit Ewigkeiten und eigentlich auch nur, weil ich bei Apache den Konfigurationsdschungel nie so 100% durchblickt habe. Und davon daß man Apache überhaupt nicht benutzt wird es natürlich nicht besser.


    Aber das soll keine Empfehlung für nginx sein. Das ist ein sehr leistungsfähiger Webserver, mit sehr unintuitiver Konfiguration. Bei nginx geht ziemlich leicht ziemlich viel schief, der Teufel steckt im Detail... plötzlich hat der falsche Server- oder Location-Block Vorrang oder eine Anweisung wird ganz ausgehebelt, und php führt die falschen Dateien (nicht) aus. nginx pitfalls und nginx if is evil (muss jeder gelesen haben) ist da nur ein Teil davon. Von der Dokumentation her wird das oft nicht klar, und man findet erst im nginx Forum oder Bugtracker was dazu.


    Ich habe ein kleines Shellscript das für alle Domains und Subdomains, HTTP wie HTTPS, diverse Dinge abfragt (ganz banal mit curl | grep). Fehlercodes, Umleitungen, Header, Inhalte, Sonderregeln müssen stimmen. Und bei jeder noch so kleinen Konfigurationsänderung wird damit einmal alles durchgetestet. Zusätzlich zum regulären Monitoring, das (in der Regel) nur eine Seite abfragt um zu schauen ob das Ding überhaupt online ist.


    Anders kann man es kaum zuverlässig betreiben. Praktisch jede nginx-Konfiguration hat irgendwelche Fehler. Gerade wollte ich forum.nginx.org aufrufen und... HTTPS-Zertifikat abgelaufen. ;) Der Test der da bei mir spätestens 3 Wochen vorher warnt, der fehlt in meiner Konfiguration auch noch... seufz.


    expired.png


    EDIT:


    tl;dr Dem Besucher ist es egal, mit was deine Seite läuft. Spielen kann man immer aber wenns läuft, dann spricht auch nichts dagegen, es einfach so zu lassen.

  • Lohnt es sich, eurer Meinung nach, es mal mit php-fpm zu versuchen?

    Auf jeden Fall! Es hat einen Grund, wieso php-fpm quasi Standard ist.

    Ist auch kein Hexenwerk. Von den Paketquellen installieren, Modul wechseln, bei Bedarf ein paar configzeilen zum anpassen, fertig.


    [offtopic]

    Apache ist halt flexibler als nginx und deren (apache) Philosophie ist dass in der Standardeinstellung (fast) alles unterstützt wird. Wer dann den Auslieferungszustand von nginx und apache vergleicht stellt fest, dass nginx bei statischen Seiten schneller ist. Die Ladezeit von PHP-Seiten wird von php-fpm dominiert und das ist bei beiden gleich. Wer seinen Apache etwas auf die Anwendung hin optimiert (z.B. AllowOverwrite deaktiviert, das es bei nginx eh nicht gibt) erreicht ähnliche Performance, die in der Praxis sowieso nicht auffällt. (Fällt nicht auf, ob deine Bilder/CSS jetzt in 5ms oder in 7ms übertragen werden während das PHP 600ms braucht und der Browser zum Rendern von den 20 verschiedenen JS, die von 10 verschiedenen Quellen eingebunden werden, nochmal 2s)

    Ich sehe keinen Grund, wieso du für ein paar Prozent zu nginx wechseln solltest.

    [noch weiter offtopic und fieses provozieren]

    Das Geschwindigkeitsargument bringen immer die Leute, die sich selbst gegenüber rechtfertigen müssen die Nächte mit nginx Konfigurationen um die Ohren gehauen zu haben 8)

    [back to topic]

    Der Wechsel zu php-fpm sollte dagegen deutlich auffallen. Ohne das gemessen zu haben würde ich schätzen (lasse mich gerne mit Daten belehren), dass der Effekt ähnlich der Umstellung von php5 -> php7 ist oder zumindest php7.0 -> php7.4 ;)


  • Danke fürs Mutmachen. :)

    Ich habe jetzt mal den Wechsel auf php7.4-fpm gewagt und alles läuft alles prima. :thumbup:


    Eine Frage hätte ich noch:

    Falls ich mal eine Seite individuell mit einer anderen php-Version ausführen möchte (Ich habe z.B. neben 7.4 aus dem ondrej-Repo noch die 7.2 von ubuntu installiert), welchen Ansatz würdet ihr empfehlen. "proxy via handler" oder "domain socket approach"

    Also

    Code
    <FilesMatch \.php$>
      SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/"
    </FilesMatch>

    oder

    Code
    ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html

    Vor- oder Nachteile? Oder ist das wurscht und Geschmacksache?

  • OK. Einen Vorteil der zweiten Methode gegenüber der ersten habe ich schon gefunden.

    Sie funktioniert :)

    Im Gegensatz zur ersten, die nur einen "internal Server Error" produziert.

    Was aber höchstwahrscheinlich nicht an der Methode liegt, sondern an mir ;)

    Trotzdem muss ich den Fehler nicht suchen, denn ProxyPassMatch funktioniert ja problemlos.

  • Im Gegensatz zur ersten, die nur einen "internal Server Error" produziert.

    Was aber höchstwahrscheinlich nicht an der Methode liegt, sondern an mir ;)

    So war es auch. Hatte nur vergessen das rewrite-Modul zu aktivieren.

    Jetzt gehen beide Methoden.

    Die erste hat allerdings den Vorteil, dass die Einstellungen des vhosts in einer .htaccess für Unterverzeichnisse überschrieben werden kann.

    Funktioniert auch.

    Ich bin zufrieden mit php-fpm. :)