PHP mit nginx wird normalerweise mit php-fpm ausgeführt, was ein separater Prozess ist.
Unter Beibehaltung der Kernidee des Andockens eines Prozesses (siehe Ende der Antwort für weitere Einzelheiten zu diesem Punkt) pro Container ist es sinnvoll, den Nginx-Prozess und den PHP-FPM-Prozess in getrennten Containern zu haben.
Da die Kommunikation zwischen nginx und php-fpm über fastcgi zustande kommt, kann sich der php-fpm-Container auch auf einem separaten Host befinden. Dies ermöglicht die Verwendung eines Clusters von php-fpm-Containern hinter nginx.
Nachdem der Kommentar hier ein wenig mehr Hintergrundinformationen enthält, enthält die Docker-Dokumentation einen Absatz über die Idee, dass ein Container nur ein Anliegen haben sollte .
Die Hauptidee eines Linux-Containers ( lxc ) besteht darin, einen Prozess in einem isolierten Namespace auf CPU- und Speicherebene auszuführen. Docker fügt zusätzlich eine Isolation auf Dateisystemebene hinzu.
Der Vorteil ist, dass die Komprimierung eines Prozesses in diesem Namespace das Lesen des Speichers anderer Prozesse nicht zulässt und daher eine weitere Komprimierung auf dem Host verhindern sollte.
Wenn von nginx und php-fpm die Rede ist, funktionieren sie paarweise, aber jede hat ihre eigenen Probleme, nginx erledigt den HTTP-Teil, das Routing, die Header-Validierung usw. und php-fpm erledigt die Code-Interpretation und gibt den HTML-Teil an nginx zurück . Es ist zwar üblich, dass beide zusammen eine einzige Anwendung bedienen, die jedoch nicht obligatorisch ist.
Je nach Kontext kann es einfacher sein, einen Container mit dem gesamten Stapel für eine Anwendung auf einer Entwickler-Workstation zu haben, zum Beispiel. Aber ideal für den produktiven Einsatz, versuchen , die weniger Interaktion innerhalb des Behälters zu halten, mit supervisord getrennten Prozesse im selben Behälter mit bringt seinen Anteil an der Problem in der Bezeichnung des Zombie - Prozess und Protokollhandling (exemple Geschichte hier dienen nur zur Illustration).
Zum Schluss zitiere ich die Docker-Seite mit einigen Schwerpunkten:
Während "ein Prozess pro Container" häufig eine gute Faustregel ist, ist es keine harte und schnelle Regel. Verwenden Sie nach bestem Wissen und Gewissen, um die Behälter so sauber und modular wie möglich zu halten .
Es gibt keine "Silver Bullet-Regel", die auf alles zutrifft, es ist immer ein Gleichgewicht zwischen der Komplexität innerhalb des Containers und der Komplexität, die die Container selbst orchestriert.
Ein fehlender Punkt ist hier die horizontale Skalierbarkeit. Es gibt einen Artikel von Jamie Alquiza, der sich vor langer Zeit mit Folgendem befasst:
http://archive.is/pDzz0
Kurz gesagt, Sie skalieren Ihre PHP-Fpm horizontal, um eine höhere Leistung zu erzielen. Die gemeinsame Skalierung von Nginx + php-fpm bringt Ihnen keine Vorteile. Ich empfehle Ihnen, einige Stresstests durchzuführen (z. B. Tsung, Gatling usw.; bitte tun Sie nicht Apache ab, das ist ein sehr altes Spielzeug), um zu überprüfen, was in dem Artikel angegeben ist. Ich persönlich habe mehrere reale Erfahrungen gemacht, die bewiesen haben, dass der Artikel im Allgemeinen wahr ist.
Es gibt jedoch zwei Nachteile (möglicherweise nicht für Kubernetes) für Bare-Metal-Maschinen / VMs:
BEARBEITET: Jetzt ist es fast die Hälfte des Jahres 2019. Das alte Modell, php-fpm + nginx im selben Pod, wird anders verwendet. Wenn Sie mit Service Mesh vertraut sind, dient Nginx (oder was so heißt Nginmesh) als Beiwagen für den Verkehr in Ost-West-Richtung. Ost-West-Verkehr wird hauptsächlich zur Authentifizierung zwischen Diensten oder anderen ausgefallenen Funktionen verwendet, während dies mit reinem PHP-FPM nicht möglich ist.
quelle
Es gibt keinen bedeutenden Vorteil, der die Verwaltung von zwei Containern überwiegt. Wenn Sie eine 1: 1-Beziehung zwischen den Prozessen haben und diese einem einzigen Zweck dienen, legen Sie sie in denselben Container.
quelle
Der Vorteil ist: Sie können mehrere PHP-FPM-Container im Back-End (wir nennen es PHP-Cluster) über die Anzahl der Ports ausführen. Beispiel Port 9000, 9001, 9002 usw.
quelle