Nginx-Ereignisverarbeitungsmechanismus: Für einen einfachen Webserver gibt es normalerweise drei Arten von Ereignissen: Netzwerkereignisse, Signale und Timer.
Schauen wir uns zunächst den grundlegenden Prozess einer Anfrage an: Herstellen einer Verbindung, Empfangen von Daten, Senden von Daten.
Sehen Sie sich noch einmal die Vorgänge am unteren Ende des Systems an: Der obige Prozess (Herstellen einer Verbindung – Empfangen von Daten – Senden von Daten) ist ein Lese- und Schreibereignis am unteren Ende des Systems.
1) Wenn die Blockierungsaufrufmethode verwendet wird und die Lese- und Schreibereignisse nicht bereit sind, können die Lese- und Schreibereignisse zwangsläufig nicht ausgeführt werden, und die Lese- und Schreibereignisse können nur ausgeführt werden wird ausgeführt, nachdem darauf gewartet wurde, dass die Veranstaltung bereit ist. Dann verzögert sich die Anfrage. Blockierende Aufrufe gelangen in den Kernel und warten, und die CPU wird von anderen verwendet. Für Single-Threaded-Worker ist dies offensichtlich nicht geeignet. Wenn es mehr Netzwerkereignisse gibt, wartet niemand auf die CPU CPU-Auslastung im Leerlauf Natürlich kann die Rate nicht steigen, geschweige denn eine hohe Parallelität.
2) Da das Blockieren von Anrufen nicht möglich ist, wenn Sie nicht bereit sind, verwenden Sie die nicht blockierende Methode. Nicht blockieren bedeutet, dass das Ereignis sofort zu EAGAIN zurückkehrt und Ihnen mitteilt, dass das Ereignis noch nicht bereit ist. Warum geraten Sie später in Panik? Okay, überprüfen Sie das Ereignis nach einer Weile erneut, bis das Ereignis bereit ist. In diesem Zeitraum können Sie zunächst andere Dinge tun und dann prüfen, ob das Ereignis bereit ist. Obwohl es nicht mehr blockiert, müssen Sie von Zeit zu Zeit den Status des Ereignisses überprüfen. Sie können mehr tun, aber der Aufwand ist nicht gering.
Zusammenfassung: Nicht blockierend, indem Sie das Ereignis ständig überprüfen Status, um zu bestimmen, ob Lese- und Schreibvorgänge ausgeführt werden sollen, was viel Overhead mit sich bringt.
3) Daher gibt es einen asynchronen, nicht blockierenden Ereignisverarbeitungsmechanismus. Spezifisch für Systemaufrufe sind Systemaufrufe wie select/poll/epoll/kqueue. Sie bieten einen Mechanismus, der es Ihnen ermöglicht, mehrere Ereignisse gleichzeitig zu überwachen. Sie können jedoch ein Timeout festlegen, wenn ein Ereignis innerhalb des Timeouts zurückgegeben wird. Dieser Mechanismus löst unsere beiden oben genannten Probleme.
Nehmen Sie Epoll als Beispiel: Wenn das Ereignis nicht bereit ist, wird es in Epoll (Warteschlange) gestellt. Wenn ein Ereignis bereit ist, verarbeiten Sie es; wenn das Ereignis EAGAIN zurückgibt, fahren Sie mit dem Einfügen in epoll fort. Solange ein Ereignis bereit ist, werden wir es daher bearbeiten, und nur wenn es nicht immer bereit ist, warten wir in Epoll. Auf diese Weise können wir eine große Anzahl gleichzeitiger Anfragen bearbeiten. Natürlich handelt es sich bei den gleichzeitigen Anfragen nur um einen Thread, daher kann natürlich nur eine Anfrage gleichzeitig bearbeitet werden Wechseln Sie einfach ständig zwischen Anforderungen. Der Wechsel wurde lediglich freiwillig vorgenommen, da das asynchrone Ereignis nicht bereit war. Der Wechsel verursacht hier keine Kosten. Sie können ihn als die Verarbeitung mehrerer vorbereiteter Ereignisse in einer Schleife verstehen, was tatsächlich der Fall ist.
4) Vergleich mit Multithreading:
Im Vergleich zu Multithreading bietet diese Ereignisverarbeitungsmethode große Vorteile: Es müssen keine Threads erstellt werden, jede Anforderung belegt nur sehr wenig Speicher und es gibt keinen Kontextwechsel handhaben. Unabhängig davon, wie viele Parallelitäten vorhanden sind, führt dies nicht zu unnötiger Ressourcenverschwendung (Kontextwechsel).
Zusammenfassung: Durch den asynchronen, nicht blockierenden Ereignisverarbeitungsmechanismus realisiert Nginx die Prozessschleifenverarbeitung mehrerer vorbereiteter Ereignisse und erreicht so eine hohe Parallelität und geringes Gewicht.
Nginx-Funktionen: 1. Plattformübergreifend: Nginx kann auf den meisten Unix-ähnlichen Betriebssystemen kompiliert und ausgeführt werden, und es gibt auch eine portierte Version für Windows.
2. Die Konfiguration ist äußerst einfach und der Einstieg sehr einfach. Der Konfigurationsstil ist der gleiche wie bei der Programmentwicklung, gottähnliche Konfiguration
3. Nicht blockierende Verbindung mit hoher Parallelität: Beim Kopieren von Daten ist die erste Stufe der Festplatten-E/A nicht blockierend. Der offizielle Test kann 50.000 gleichzeitige Verbindungen unterstützen, und in der tatsächlichen Produktionsumgebung erreicht die Anzahl der gleichzeitigen Verbindungen 20.000 bis 30.000 (Dies liegt daran, dass Nginx das neueste Epoll-Modell verwendet)
4. Ereignisgesteuert: Der Kommunikationsmechanismus übernimmt das Epoll-Modell und unterstützt größere gleichzeitige Verbindungen.
5. Es ist keine lange Verbindung zwischen dem Nginx-Proxy und dem Backend-Webserver erforderlich.
6. Der Empfang von Benutzeranfragen erfolgt zuerst sofort an den Back-End-Webserver senden, wodurch der Druck auf den Back-End-Webserver erheblich verringert wird
7 Beim Senden einer Antwortnachricht empfängt er Daten vom Back-End-Webserver und sendet sie gleichzeitig an den Client
8. Geringe Netzwerkabhängigkeit. NGINX ist theoretisch kaum vom Netzwerk abhängig, solange es gepingt werden kann und effektiv zwischen Intranet- und externem Netzwerkverkehr unterscheiden kann.
9. Unterstützt die Servererkennung. NGINX kann Serverausfälle anhand des Statuscodes und der Timeout-Informationen erkennen, die von der Verarbeitungsseite des Anwendungsservers zurückgegeben werden, und die falsche Anforderung zur erneuten Übermittlung an andere Knoten umgehend zurücksenden
Master/Worker-Struktur: Ein Masterprozess generiert einen oder mehrere Arbeitsprozesse
Geringer Speicherverbrauch: Die Verarbeitung großer gleichzeitiger Anforderungen verbraucht sehr wenig Speicher. Bei 30.000 gleichzeitigen Verbindungen verbrauchen die 10 gestarteten Nginx-Prozesse nur 150 MB Speicher (15 MB * 10 = 150 MB). Geringe Kosten: Nginx ist Open-Source-Software und kann kostenlos verwendet werden. Der Kauf von Hardware-Lastausgleichs-Switches wie F5 BIG-IP und NetScaler kostet mehr als 100.000 bis Hunderttausende Yuan.
Eingebaute Gesundheitsprüfungsfunktion: Wenn ein Webserver im Backend von Nginx Proxy ausfällt, wird das Front-End Der Zugang wird dadurch nicht beeinträchtigt.
Sparen Sie Bandbreite: Unterstützt die GZIP-Komprimierung und kann vom Browser lokal zwischengespeicherte Header hinzufügen.
Hohe Stabilität: Bei Verwendung als Reverse-Proxy ist die Wahrscheinlichkeit von Ausfallzeiten sehr gering.
Nginx arbeitet im Multiprozessmodus. Natürlich unterstützt Nginx auch Multithreading, aber unsere Mainstream-Methode ist immer noch Multiprozess. Die Methode ist auch die Standardmethode von Nginx. Die Verwendung eines Multiprozess-Ansatzes durch Nginx bietet viele Vorteile.
(1) Nach dem Start von Nginx gibt es einen Masterprozess und mehrere Arbeitsprozesse. Der Master-Prozess wird hauptsächlich zum Verwalten von Arbeitsprozessen verwendet, einschließlich: Empfangen von Signalen von der Außenwelt, Senden von Signalen an jeden Arbeitsprozess, Überwachen des Betriebsstatus des Arbeitsprozesses und automatischer Neustart eines neuen Arbeitsprozesses, wenn der Arbeitsprozess beendet wird (siehe unten). ungewöhnliche Umstände). Grundlegende Netzwerkereignisse werden im Arbeitsprozess verarbeitet. Mehrere Worker-Prozesse sind Peer-to-Peer. Sie konkurrieren gleichermaßen um Anfragen von Kunden und jeder Prozess ist unabhängig voneinander. Eine Anfrage kann nur in einem Arbeitsprozess verarbeitet werden, und ein Arbeitsprozess kann keine Anfragen von anderen Prozessen verarbeiten.
Die Anzahl der Arbeitsprozesse kann im Allgemeinen so eingestellt werden, dass sie mit der Anzahl der CPU-Kerne der Maschine übereinstimmt. Der Grund dafür ist untrennbar mit dem Prozessmodell und dem Ereignisverarbeitungsmodell von Nginx verbunden.
(2) Wie geht der Master mit dem Signal um, nachdem er es empfangen hat (./nginx -s reload)?
Nach dem Empfang des Signals lädt der Master-Prozess zunächst die Konfigurationsdatei neu und startet dann einen neuen Prozess und sendet ein Signal an alle alten Prozesse, dass sie ehrenhaft in den Ruhestand gehen können. Nachdem der neue Prozess gestartet wurde, beginnt er, neue Anfragen zu empfangen, während der alte Prozess nach Erhalt des Signals vom Master keine neuen Anfragen mehr empfängt und alle unverarbeiteten Anfragen im aktuellen Prozess verarbeitet und dann beendet wird.
(3) Wie verarbeitet der Worker-Prozess die Anfrage?
Wir haben bereits erwähnt, dass Arbeitsprozesse gleich sind und jeder Prozess die gleiche Möglichkeit hat, Anfragen zu bearbeiten. Wenn wir einen HTTP-Dienst auf Port 80 bereitstellen und eine Verbindungsanfrage eingeht, kann jeder Prozess die Verbindung verarbeiten. Zuerst trennt sich jeder Worker-Prozess vom Master-Prozess. Richten Sie zunächst den Socket ein, der abgehört werden muss, und teilen Sie dann mehrere Worker-Prozesse aus, damit jeder Worker-Prozess den Socket akzeptieren kann (natürlich ist dies nicht der Fall). Derselbe Socket, aber der Socket jedes Prozesses wird an derselben IP-Adresse und demselben Port überwacht. Dies ist im Netzwerkprotokoll zulässig. Wenn eine Verbindung eingeht, erhalten im Allgemeinen alle Prozesse, die den Socket akzeptieren, eine Benachrichtigung, und nur ein Prozess kann die Verbindung akzeptieren, während die anderen dies nicht akzeptieren. Dies ist das sogenannte Donnerherden-Phänomen.Natürlich wird Nginx kein Auge zudrücken, daher stellt Nginx einen Accept_mutex bereit. Aus dem Namen können wir ersehen, dass es sich um eine gemeinsame Sperre handelt, die zum Akzeptieren hinzugefügt wird. Mit dieser Sperre stellt nur ein Prozess gleichzeitig eine Verbindung zu accpet her, sodass kein Donnerherdenproblem auftritt. Accept_mutex ist eine steuerbare Option, die wir explizit deaktivieren können. Sie ist standardmäßig aktiviert. Wenn ein Arbeitsprozess die Verbindung akzeptiert, beginnt er mit dem Lesen der Anfrage, dem Parsen der Anfrage, der Verarbeitung der Anfrage, der Generierung von Daten, sendet sie dann an den Client zurück und trennt schließlich die Verbindung. So sieht eine vollständige Anfrage aus. Wir können sehen, dass eine Anfrage vollständig vom Worker-Prozess verarbeitet wird und nur in einem Worker-Prozess verarbeitet wird.
(4) Welche Vorteile hat die Einführung dieses Prozessmodells durch Nginx?
Die Verwendung unabhängiger Prozesse wirkt sich nicht gegenseitig aus, andere Prozesse funktionieren weiterhin und der Dienst wird nicht unterbrochen. Der Master-Prozess startet den neuen Arbeitsprozess schnell neu. Wenn der Worker-Prozess abnormal beendet wird, muss natürlich ein Fehler im Programm vorliegen, der dazu führt, dass alle Anforderungen des aktuellen Workers fehlschlagen. Dies wirkt sich jedoch nicht auf alle Anforderungen aus, sodass das Risiko verringert wird. Natürlich gibt es viele Vorteile, und jeder kann sie langsam erleben.
(5) Nginx verwendet eine Multi-Worker-Methode, um Anfragen zu verarbeiten. Es gibt nur einen Hauptthread, der verarbeitet werden kann möglich? Wie kann eine hohe Parallelität erreicht werden? Nein, das ist die Genialität von Nginx. Mit anderen Worten: Nginx kann Tausende von Anfragen gleichzeitig verarbeiten Belegen Sie ausschließlich einen Arbeitsthread. Wenn die Anzahl der Parallelität Tausende erreicht, verarbeiten Tausende von Threads gleichzeitig Anforderungen. Dies stellt eine große Herausforderung für das Betriebssystem dar. Der durch Threads verursachte Speicherverbrauch ist sehr groß. Natürlich kann die Leistung nicht verbessert werden, und dieser Overhead ist völlig bedeutungslos. Wir haben bereits gesagt, dass es empfehlenswert ist, die Anzahl der Worker auf die Anzahl der CPU-Kerne festzulegen. Es ist leicht zu verstehen, dass mehr Worker nur dazu führen, dass Prozesse um CPU-Ressourcen konkurrieren, was zu unnötigen Kontextwechseln führt. Um die Multi-Core-Funktionen besser nutzen zu können, bietet Nginx außerdem eine CPU-Affinitätsbindungsoption. Wir können einen bestimmten Prozess an einen bestimmten Kern binden, sodass der Cache nicht aufgrund von Prozesswechseln ausfällt
Lastausgleich
Lastausgleichstechnologie ist jetzt erhältlich. Sie bietet eine kostengünstige, Eine effektive und transparente Methode, die auf der Netzwerkstruktur basiert, um die Bandbreite von Netzwerkgeräten und Servern zu erweitern, den Durchsatz zu erhöhen, die Datenverarbeitungsfunktionen im Netzwerk zu verbessern und die Flexibilität und Verfügbarkeit des Netzwerks zu verbessern. Es hat zwei Bedeutungen: Erstens wird ein großer Teil des gleichzeitigen Zugriffs oder Datenverkehrs auf mehrere Knotengeräte zur separaten Verarbeitung aufgeteilt, wodurch sich die Wartezeit der Benutzer auf Antworten verringert. Zweitens wird ein einzelner Vorgang mit hoher Auslastung parallel auf mehrere Knotengeräte verteilt Verarbeitung: Nachdem jedes Knotengerät die Verarbeitung abgeschlossen hat, werden die Ergebnisse zusammengefasst und an den Benutzer zurückgegeben, und die Systemverarbeitungskapazität wird erheblich verbessert
Das Obige stellt den Nginx-Ereignisverarbeitungsmechanismus und das Prozessmodell vor, einschließlich Aspekten des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.