PHP-Anwendung auf mehrere Servern verteilen! Wie umsetzen?

  • Hallo Freunde,


    ich betreibe ein Webprojekt auf PHP- & Nginx-Basis was aktuell aus einem Applikations-Server und einem Datenbank-Server besteht.


    Ich muss die Anwendung jetzt zukunftssicher machen, da der Traffic und die Last stetig steigt.


    Ziel soll es sein, die Anwendung schnell um weitere Server erweitern zu können, um hohe Lasten abzufangen.


    Also z.B. ein Load-Balancer davor, der die Anfragen verteilt.


    Folgende Herausforderungen habe ich allerdings, und würde mich über Lösungsvorschläge freuen.


    1. Gleicher Code auf allen Servern

    Wenn ich die Anwendung auf mehrere Server verteile, muss auf allen Server die gleiche Code-Basis vorhanden sein und Updates sofort auf allen Server verfügbar sein.

    Was gibt es da für Lösungen?

    Idee: Eine Festplatte, die in allen Servern eingehangen ist, falls das bei netcup überhaupt möglich ist. Den Nachteil den ich sehen, dass die Zugriffe aller Server trotzdem immer nur eine Festplatte belasten.

    Git/SVN könnte da vielleicht hilfreich sein, oder? Arbeite aktuell aber nicht damit.


    2. Gleiche Server-Umgebung

    Wenn ich Server zusätzlich hinzufüge, muss gewährleistet sein, dass das System darunter immer identisch ist. Was aber eigentlich sogut wie nie möglich ist, vor allem wenn ein Server mal ein neue OS-Version hat.

    Idee: Die Anwendung in einem Docker-Container laufen lassen, da sollte die Hardware darunter für den Webserver keine Rolle spielen!?
    Problem, es gibt Cronjobs, die auch direkt System-Befehle ausführen bzw. Dienste nutzen, die Abseites des Webservers laufen.



    Für ein paar Gedankenanstöße wäre ich sehr dankbar.


    LG

  • Deinen Code solltest Du sowieso in einem GIT Repository haben. Und dann hast Du Endpoints in deinem Code, die einfach einen git pull machen und den neuen CodeStand nach einem PR ziehen und aufbereiten.

    Code
    Stefan Lindecke - lindesbs              | Nicht jeder braucht einen RootServer,
    SeniorAdmin, Contao, OpenSource, Debian | Uebt erstmal in einer lokalen VM !
  • Schön, dass die Anwendung Erfolg hat!


    Zur verteilten Architektur gehört noch ein bisschen mehr als den Quellcode auf verschiedene Server zu verteilen. Verteiltes Session-Management? Bleibt es bei einer Datenbank, in die alle schreiben sollen? Usw. Usw.


    Die Wikipedia-Leute haben das ganz gut gemacht. Auch wenn ihr das bestimmt nicht so groß braucht, da kann man sich für jeden Punkt was rauspicken: https://upload.wikimedia.org/w…_webrequest_flow_2020.png

  • Problem, es gibt Cronjobs, die auch direkt System-Befehle ausführen bzw. Dienste nutzen, die Abseites des Webservers laufen.

    Container sind kein schlechter Ansatz. Mit CI/CD sorgst du zudem dafür, dass überall der gleiche Quellcode läuft.

    Ansonsten git & ansible.


    Was für Cronjobs sind das, welche System Befehle werden ausgeführt?

  • Ich würde ebenfalls vorschlagen, ein Git-Repository zu nutzen und von dort aus per CI/CD den Code auf die Zielsysteme auszuliefern.


    Wenn Container vernünftig gepflegt und aktuell gehalten werden, sind sie hier wohl ein guter Ansatz. Zum aktuell halten kann ich wärmstens Renovate empfehlen.


    Das Session-Handling deines PHP-FPM solltest du nicht vergessen. Hier wäre es z.B. denkbar, ein Redis Cluster über alle Server zu nutzen und die PHP-FPMs jeweils daran anzuzapfen. Dabei aber auf jeden Fall darauf achten, die Verbindung zwischen den Redis Instanzen sicher zu halten und das Redis Cluster vor Fremdzugriffen zu schützen. Wenn das nicht sicher ist, hast du das Risiko von Session Hijacking - das ist dann spielend einfach möglich.


    Problem, es gibt Cronjobs, die auch direkt System-Befehle ausführen bzw. Dienste nutzen, die Abseites des Webservers laufen.

    Ich denke hier wären mehr Details sinnvoll. Des Problems Lösung ist stark vom Use Case abhängig.

    "Denn der radikalste Zweifel ist der Vater der Erkenntnis."

    -Max Weber

    Gefällt mir 1
  • Ein REDIS Cluster ist eine sinnvolle Einrichtung. Kommunikation sollte ueber ein vLan laufen. Aber dazu gibt es zu wenig Infos. Ist Sessionhandling ueberhaupt notwendig?

    Ist eine Verteilung ueberhaupt notwendig. Die WorkerNodes koennen auch einfach per NFS den Sourcecode mounten.


    Es gibt viele Szenarien, die moeglich sind, es fehlen meiner Meinung nach signifikante Zusatzinfos.

    Code
    Stefan Lindecke - lindesbs              | Nicht jeder braucht einen RootServer,
    SeniorAdmin, Contao, OpenSource, Debian | Uebt erstmal in einer lokalen VM !
  • Du kannst auch erstmal versuchen deine Anwendung zu optimieren. Da ist i.d.R. immer was zu erreichen, z.B. Full-Page Caching, DB-Queries optimieren, oder auch Frontend entschlacken (TailwindCSS, nur das nötigste JS) und Bilder als .webp ausliefern.


    Git ist sehr sinnvoll, Redis kannst du auch schon ohne Cluster nutzen mit einem guten Effekt bei z.B. Sessions.

  • Erstmal vielen Dank für eure zahlreichen Tipps!


    Es wird wohl eine Kombination aus vielen werden. Wenn das ganze Infrastruktur steht, kann ich ja nochmal sagen wie ich es gemacht habe :)
    Hab mich auf jeden Fall schon Docker-Container entschieden - schon allein weil ich diese schnell auf neue Server portieren kann.


    Lokale Dateien mit überschaubaren Zugriffen, die in allen Docker-Instanzen vorhanden sein müssen, mounte ich per NFS.
    Session-Handling läuft über eh über die DB, also ist das auch kein Problem.

    Mit der Verteilung des Codes auf alle Instanzen forsiere ich GIT - aber das Thema ist etwas größer, vorallem mit CI/CD. Aber damit beschäftige ich mich dann zum Schluss. Erstmal die Basis schaffen.