Frage Warum ist die Einstellung von Nginx als Reverse Proxy eine gute Idee?


Ich habe eine Django-Site auf Gunicorn mit einem Reverse Proxy über Nginx. Ist Nginx nicht nur ein zusätzlicher unnötiger Overhead? Wie hilft das Hinzufügen zu Gunicorn?


34
2018-01-08 01:35


Ursprung




Antworten:


Ich werde mich auf das Verhalten von langsamen Clients konzentrieren und wie Ihre Konfiguration damit umgeht, aber versuchen Sie nicht zu glauben, dass dies der einzige Vorteil ist. Die gleiche Methode, von der langsame Clients profitieren, hat auch Vorteile für schnelle Clients, die SSL-Behandlung, den Umgang mit Traffic-Staus und andere Aspekte der Bereitstellung von HTTP im Internet.

Gunicorn ist Pre-Forking-Software. Für Kommunikationen mit niedriger Latenzzeit, z. B. zum Lastenausgleich auf dem Anwendungsserver oder zur Kommunikation zwischen Diensten, können Pre-Fork-Systeme sehr erfolgreich sein. Es entstehen keine Kosten, wenn ein Prozess zur Bearbeitung der Anfrage in Gang gesetzt wird, und ein einzelner Prozess kann für die Bearbeitung einer einzelnen Anfrage verwendet werden. Die Beseitigung dieser Dinge kann zu einem insgesamt schnelleren, effizienteren System führen, bis die Anzahl der gleichzeitigen Verbindungen die Anzahl der verfügbaren Prozesse übersteigt, um mit ihnen umzugehen.

In Ihrer Situation handelt es sich um Clients mit hoher Latenz über das Internet. Diese langsamen Clients können dieselben Prozesse binden. Wenn QPS eine Rolle spielt, muss der Anwendungscode die Anfrage so schnell wie möglich empfangen, bearbeiten und auflösen, damit sie zu einer anderen Anfrage weitergehen kann. Wenn langsame Clients direkt mit Ihrem System kommunizieren, binden sie diesen Prozess und verlangsamen ihn. Anstatt die Anfrage so schnell wie möglich zu bearbeiten und zu erledigen, muss dieser Prozess nun auch auf den langsamen Client warten. Effektive QPS sinkt.

Bei asynchronen Servern wie Nginx sind viele Verbindungen mit sehr geringen CPU- und Speicherkosten zu bewältigen. Sie sind nicht in derselben negativen Art und Weise von langsamen Clients betroffen, da sie in der Lage sind, eine große Anzahl von Clients gleichzeitig zu handhaben. Im Fall von Nginx kann es auf moderner Hardware mehrere Zehntausend Verbindungen gleichzeitig verarbeiten.

Nginx vor einem Pre-Forking-Server ist eine großartige Kombination. Nginx wickelt die Kommunikation mit Clients ab und erleidet keine Nachteile beim Umgang mit langsamen Clients. Er sendet Anfragen so schnell an das Backend, wie das Backend diese Anforderungen verarbeiten kann. Dadurch kann das Backend mit Serverressourcen so effizient wie möglich arbeiten. Das Back-End gibt das Ergebnis zurück, sobald es es berechnet, und Nginx puffert diese Antwort, um es an langsame Clients in ihrem eigenen Tempo zu füttern. In der Zwischenzeit kann das Backend mit der Bearbeitung einer anderen Anfrage fortfahren, auch wenn der langsame Client das Ergebnis noch empfängt.


44
2018-01-08 01:53



Nitpicking: Gunicorn ist ein Preforking Event-basierter Server. Jeder Prozess behandelt mehrere Verbindungen asynchron. Das ändert nichts an der Tatsache, dass nginx viel geringere Kosten pro Verbindung hat, weshalb der Rest der Erklärung gültig ist. - Javier
Und als Bonus stoppt Nginx "Slow HTTP DoS Attacks" sehr effektiv. Der einzige Punkt, den ich hinzufügen möchte, ist, dass bei der Verwendung von Nginx alle IP-bezogenen Dinge in Gunicorn durcheinander gebracht werden können, zum Beispiel auth durch IP, Protokollierung usw., es sei denn, Gunicorn unterstützt den X-Forwarded-For-Header. Ich kenne Gunicorn nicht, daher kann ich nicht sagen, wie groß das für dich sein wird. - Niall Donegan
Danke für die Info Javier, ich kenne Gunicorn nicht mehr als flüchtig. - blueben
Ihre Antwort sollte zu dieser Frage passen: stackoverflow.com/q/13182892/719276 - arthur.sw
Hat das etwas mit der Option * _busy_buffer_size zu tun? - CMCDragonkai


@blueben hat Recht. Ein spezifisches und allgemeines Beispiel dafür, was passieren kann, wenn ein Reverse-Proxy nicht verwendet wird, besteht darin, dass eine Back-End-Datenbank Datenbankverbindungs-Handles ausführen kann, bei denen kein Proxy vorhanden ist und es eine Verkehrsspitze gibt. Dies liegt daran, dass die Verbindungen nur langsam freisetzen, wie @blueben beschrieben hat.

Ein erster Instinkt für das Auslaufen von Datenbankhandles könnte darin bestehen, mehr Datenbankverbindungen zu unterstützen. Durch Hinzufügen eines Reverse-Proxys vor der App sehen Sie jedoch, dass die Anzahl der erforderlichen Datenbankverbindungen für hohe Last sowohl deutlich sinkt als auch sich stabilisiert - die Datenbankverbindungsebene wird bei einer Verkehrsspitze nicht annähernd so stark ansteigen.

Nginx eignet sich auch hervorragend für die Bereitstellung von statischem Inhalt, Caching und einer Vielzahl anderer HTTP-Aufgaben, sodass Ihr App-Server sich darauf konzentrieren kann, ein App-Server zu sein.


2
2018-01-26 02:01





@naill Donegan erwähnt dies im obigen Kommentar, aber es ist wichtig genug, um eine Antwort zu rechtfertigen.

Nginx stoppt den langsamen Loris-Angriff, den Gunicorn nicht behandelt.


0
2018-01-25 19:45