Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was ist eine Nginx-Verbindung?

Was ist eine Nginx-Verbindung?

(*-*)浩
(*-*)浩Original
2019-11-28 11:45:193064Durchsuche

Was ist eine Nginx-Verbindung?

Verbindung

In Nginx ist Verbindung die Kapselung der TCP-Verbindung, einschließlich der verbundenen Socket- und Leseereignisse. , Ereignisse schreiben. Mithilfe der von Nginx gekapselten Verbindung können wir Nginx problemlos zur Abwicklung verbindungsbezogener Angelegenheiten verwenden, z. B. zum Herstellen von Verbindungen, zum Senden und Empfangen von Daten usw. (Empfohlenes Lernen: Nginx verwenden )

und die HTTP-Anfrage in Nginx basiert auf der Verbindung, sodass Nginx nicht nur als Webserver verwendet werden kann, sondern auch Kann auch als Mailserver verwendet werden. Natürlich können wir über die von Nginx bereitgestellte Verbindung mit jedem Backend-Dienst umgehen.

In Kombination mit dem Lebenszyklus einer TCP-Verbindung werfen wir einen Blick darauf, wie Nginx mit einer Verbindung umgeht.

Wenn Nginx startet, analysiert es zunächst die Konfigurationsdatei, um den zu überwachenden Port und die IP-Adresse zu erhalten. Initialisieren Sie dann im Nginx-Masterprozess zunächst den Überwachungs-Socket (erstellen Sie den Socket, legen Sie addrreuse fest). und andere Optionen, an den angegebenen IP-Adressport binden, erneut abhören) und dann mehrere untergeordnete Prozesse austeilen, und dann konkurrieren die untergeordneten Prozesse um die Annahme neuer Verbindungen.

An diesem Punkt kann der Client eine Verbindung zu Nginx initiieren.

Wenn der Client und der Server über einen Drei-Wege-Handshake eine Verbindung herstellen, akzeptiert ein Unterprozess von Nginx erfolgreich, ruft den Socket der hergestellten Verbindung ab und erstellt dann eine Nginx-Kapselung der Verbindung, nämlich ngx_connection_t-Struktur.

Als nächstes richten Sie die Verarbeitungsfunktionen für Lese- und Schreibereignisse ein und fügen Lese- und Schreibereignisse hinzu, um Daten mit dem Client auszutauschen. Schließlich schließt Nginx oder der Client die Verbindung aktiv. An diesem Punkt wird eine Verbindung beendet.

Natürlich kann Nginx auch als Client verwendet werden, um Daten von anderen Servern anzufordern (z. B. dem Upstream-Modul). Zu diesem Zeitpunkt werden auch die mit anderen Servern erstellten Verbindungen in ngx_connection_t gekapselt.

Als Client erhält Nginx zunächst eine ngx_connection_t-Struktur, erstellt dann einen Socket und legt die Attribute des Sockets fest (z. B. nicht blockierend). Fügen Sie dann Lese- und Schreibereignisse hinzu, rufen Sie connect/read/write auf, um die Verbindung aufzurufen, und schließen Sie schließlich die Verbindung und geben Sie ngx_connection_t frei.

In Nginx hat jeder Prozess eine maximale Grenze für die Anzahl der Verbindungen, die sich von der Systemgrenze für fd unterscheidet. Im Betriebssystem können wir über ulimit -n die maximale Anzahl von FDS ermitteln, die ein Prozess öffnen kann, nämlich nofile. Da jede Socket-Verbindung einen FD belegt, wird dadurch auch die maximale Anzahl von Verbindungen unseres Prozesses begrenzt. Dies wirkt sich natürlich auch direkt auf die maximale Anzahl von Parallelitäten aus, die unser Programm unterstützen kann. Wenn der fd aufgebraucht ist, schlägt das Erstellen eines Sockets fehl.

Nginx legt die maximale Anzahl der von jedem Prozess unterstützten Verbindungen fest, indem es worker_connectons festlegt. Wenn dieser Wert größer als „nofile“ ist, beträgt die tatsächliche maximale Anzahl von Verbindungen „nofile“ und Nginx gibt eine Warnung aus.

Nginx wird bei der Implementierung über einen Verbindungspool verwaltet. Jeder Worker-Prozess verfügt über einen unabhängigen Verbindungspool und die Größe des Verbindungspools beträgt worker_connections. Was hier im Verbindungspool gespeichert wird, ist eigentlich keine echte Verbindung, sondern lediglich ein Array der ngx_connection_t-Struktur mit der Größe worker_connections.

Darüber hinaus speichert Nginx alle freien ngx_connection_t über eine verknüpfte Liste free_connections. Jedes Mal, wenn eine Verbindung hergestellt wird, wird eine Verbindung aus der Liste der freien Verbindungen abgerufen Liste.

Hier werden viele Leute die Bedeutung des Parameters worker_connections falsch verstehen und denken, dass dieser Wert der maximale Wert der Verbindung ist, die Nginx herstellen kann. Tatsächlich stellt dieser Wert die maximale Anzahl von Verbindungen dar, die von jedem Arbeitsprozess hergestellt werden können. Daher sollte die maximale Anzahl von Verbindungen, die von einem Nginx hergestellt werden können, worker_connections * worker_processes sein.

Natürlich geht es hier um die maximale Anzahl von Verbindungen für lokale Ressourcen. Die maximale Anzahl unterstützter Parallelitäten ist worker_connections * worker_processes, wenn es sich um HTTP handelt Proxy, die maximale Anzahl an Parallelitäten sollte worker_connections * worker_processes/2 betragen.

Denn als Reverse-Proxy-Server stellt jede gleichzeitige Verbindung eine Verbindung mit dem Client und eine Verbindung mit dem Back-End-Dienst her, wodurch zwei Verbindungen belegt werden.

Nun, wie wir bereits sagten, konkurrieren mehrere inaktive Prozesse um die Verbindung. Es ist leicht zu erkennen, dass dieser Wettbewerb zu Ungerechtigkeit führt. Wenn ein Prozess akzeptiert wird, gibt es mehr Möglichkeiten. und seine Leerlaufverbindungen werden schnell aufgebraucht, wenn eine gewisse Kontrolle nicht im Voraus erfolgt, wenn eine neue TCP-Verbindung akzeptiert wird, da keine Leerlaufverbindung hergestellt und diese Verbindung nicht an andere Prozesse übertragen werden kann. Die TCP-Verbindung kann nicht verarbeitet werden und wird beendet.

Das ist offensichtlich unfair. Manche Prozesse haben freie Verbindungen, haben aber keine Chance, diese zu verarbeiten. Manche Prozesse verwerfen künstlich Verbindungen, weil sie keine freien Verbindungen haben. Wie kann man dieses Problem lösen?

Zunächst muss die Nginx-Verarbeitung die Option „accept_mutex“ aktivieren. Zu diesem Zeitpunkt fügt nur der Prozess, der „accept_mutex“ erhalten hat, das Accept-Ereignis hinzu Ereignis.

Nginx verwendet eine Variable namens ngx_accept_disabled, um zu steuern, ob um die Accept_mutex-Sperre konkurriert werden soll.

Berechnen Sie im ersten Codeabschnitt den Wert von ngx_accept_disabled. Dieser Wert beträgt ein Achtel der Gesamtzahl der Verbindungen in einem einzelnen Nginx-Prozess. Subtrahieren Sie die verbleibende Anzahl von ngx_accept_disabled Wenn die Anzahl der verbleibenden Verbindungen weniger als ein Achtel der Gesamtzahl der Verbindungen beträgt, ist ihr Wert größer als 0. Je kleiner die Anzahl der verbleibenden Verbindungen, desto größer ist dieser Wert.

Sehen Sie sich den zweiten Codeabschnitt an. Wenn ngx_accept_disabled größer als 0 ist, wird nicht versucht, die Accept_mutex-Sperre zu erhalten und ngx_accept_disabled um 1 zu dekrementieren. Daher wird es bei jeder Ausführung hier um dekrementiert 1, bis es kleiner als 0 ist.

Das Nichterwerben der Accept_mutex-Sperre ist gleichbedeutend mit dem Verzicht auf die Möglichkeit, die Verbindung zu erhalten. Es ist offensichtlich, dass ngx_accept_disable umso größer ist, je mehr Möglichkeiten vergeben werden, sodass andere Prozesse Die Chance, die Sperre zu erhalten, ist ebenfalls größer.

Wenn Sie dies nicht akzeptieren, wird Ihre eigene Verbindung kontrolliert und der Verbindungspool anderer Prozesse verwendet. Auf diese Weise kontrolliert Nginx das Gleichgewicht der Verbindungen zwischen mehreren Prozessen.

ngx_accept_disabled = ngx_cycle->connection_n / 8
        - ngx_cycle->free_connection_n;    if (ngx_accept_disabled > 0) {
        ngx_accept_disabled--;

    } else {        if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {            return;
        }        if (ngx_accept_mutex_held) {
            flags |= NGX_POST_EVENTS;

        } else {            if (timer == NGX_TIMER_INFINITE
                    || timer > ngx_accept_mutex_delay)
            {
                timer = ngx_accept_mutex_delay;
            }
        }
    }

Die Verbindung wird hier zuerst vorgestellt. Es reicht aus, zu wissen, was die Verbindung in Nginx ist, und die Verbindung ist eine relativ fortgeschrittene Verwendung.

Das obige ist der detaillierte Inhalt vonWas ist eine Nginx-Verbindung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn