it-swarm.com.de

Warum brauche ich Nginx und so etwas wie Gunicorn?

Ich suche nach einer zu vereinfachten Antwort auf die folgende Frage. Ich versuche, ein grundlegendes Verständnis dafür aufzubauen, wie Nginx neben so etwas wie Gunicorn funktioniert.

Benötige ich sowohl Nginx als auch etwas wie Gunicorn, um Django Apps auf Nginx bereitzustellen?

Wenn ja, wie werden die HTTP-Anforderungen tatsächlich behandelt?

Ps. Ich möchte Apache und mod_wsgi nicht verwenden!

233
a.m.

Zu stark vereinfacht: Sie benötigen etwas, das Python ausführt, aber Python ist nicht die beste Lösung für alle Arten von Anforderungen.

[Haftungsausschluss: Ich bin ein Gunicorn-Entwickler]

Weniger vereinfacht: Unabhängig davon, welchen App-Server Sie verwenden (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), hat jede Art von nicht trivialer Bereitstellung einen Upstream, der die Anforderungen behandelt, die Ihre Django App nicht verarbeiten sollte. Triviale Beispiele für solche Anforderungen sind statische Assets (images/css/js).

Dies führt zu zwei ersten Ebenen der klassischen "dreistufigen Architektur". Das heißt, der Webserver (in Ihrem Fall Nginx) wird viele Anfragen nach Bildern und statischen Ressourcen bearbeiten. Anforderungen, die dynamisch generiert werden müssen, werden dann an den Anwendungsserver weitergeleitet (in Ihrem Beispiel Gunicorn). (Abgesehen davon ist die dritte der drei Ebenen die Datenbank)

Historisch gesehen würde jede dieser Ebenen auf separaten Computern gehostet (und es würde höchstwahrscheinlich mehrere Computer in den ersten beiden Ebenen geben, dh: 5 Webserver senden Anforderungen an zwei App-Server, die wiederum eine einzelne Datenbank abfragen).

In der Neuzeit haben wir jetzt Anwendungen in allen Formen und Größen. Nicht jedes Wochenendprojekt oder jede Website für kleine Unternehmen benötigt tatsächlich die Leistung mehrerer Maschinen und läuft problemlos auf einer einzigen Box. Dies hat neue Einträge in die Reihe der Hosting-Lösungen hervorgebracht. Einige Lösungen verbinden den App-Server mit dem Webserver (Apache httpd + mod_wsgi, Nginx + mod_uwsgi usw.). Und es ist keineswegs ungewöhnlich, die Datenbank auf demselben Computer wie eine dieser Web-/App-Serverkombinationen zu hosten.

Im Fall von Gunicorn haben wir eine spezielle Entscheidung getroffen (Kopieren von Rubys Einhorn), um die Dinge von Nginx zu trennen und uns dabei auf das Proxy-Verhalten von Nginx zu verlassen. Insbesondere wenn wir davon ausgehen können, dass Gunicorn niemals Verbindungen direkt aus dem Internet liest, müssen wir uns keine Sorgen um langsame Clients machen. Dies bedeutet, dass das Verarbeitungsmodell für Gunicorn peinlich einfach ist.

Durch die Trennung kann Gunicorn auch in reinem Python geschrieben werden, wodurch die Entwicklungskosten minimiert werden, ohne die Leistung wesentlich zu beeinträchtigen. Außerdem können Benutzer andere Proxys verwenden (vorausgesetzt, sie puffern korrekt).

Die zweite Antwort auf Ihre zweite Frage, wie die HTTP-Anfrage tatsächlich behandelt wird, lautet Gunicorn. Die vollständige Antwort lautet, dass sowohl Nginx als auch Gunicorn die Anfrage bearbeiten. Grundsätzlich erhält Nginx die Anfrage und wenn es sich um eine dynamische Anfrage handelt (im Allgemeinen basierend auf URL-Mustern), gibt es diese Anfrage an Gunicorn, das sie verarbeitet, und gibt dann eine Antwort an Nginx zurück, die die Antwort dann an das Original zurückleitet Klient.

Also zum Schluss ja. Sie benötigen sowohl Nginx als auch Gunicorn (oder ähnliches) für eine ordnungsgemäße Django Bereitstellung. Wenn Sie speziell darauf abzielen, Django mit Nginx zu hosten, würde ich Gunicorn, mod_uwsgi und vielleicht CherryPy als Kandidaten für die Django Seite der Dinge untersuchen.

334
Paul J. Davis

Diese Erklärung hat mir in ihrer Einfachheit gefallen:

Nginx wird sich der Außenwelt stellen. Es werden Mediendateien (Bilder, CSS usw.) direkt aus dem Dateisystem bereitgestellt. Es kann jedoch nicht direkt mit Django -Anwendungen) kommunizieren. Es benötigt etwas, das die Anwendung ausführt, Anforderungen aus dem Web füttert und Antworten zurückgibt.

Das ist Gunicorns Job. Gunicorn erstellt einen Unix-Socket und sendet über das wsgi-Protokoll Antworten an nginx. Der Socket leitet Daten in beide Richtungen weiter:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://Gist.github.com/Atem18/4696071

33
Juuso Ohtonen

Gunicorn ist eine Verschwendung von Ressourcen. Sie können einfach einen Proxy-Pass an Django lauschen auf einem Port, anstatt Gunicorn oben laufen zu lassen Django und noch einmal Nginx darüber. In Benchmarks habe ich Nginx kann problemlos direkte Anfragen an Django bearbeiten. Gunicorn ist nichts anderes als eine Überführung (eigentlich eine langsamere Überführung) über der normalen Straße. Es sitzt nur und frisst Ihre Ressourcen und versucht zu behaupten, Ihre Website mit Strom zu versorgen.

nginx puffert grundsätzlich alle Anforderungen und verarbeitet die statischen Dateianforderungen selbst (wenn Sie sie so konfiguriert haben). Und überträgt den gesamten dynamischen Inhalt auf einen anderen Server (Gunicorn/Django).

Gunicorn hat keine andere Verwendung, als die Anfrage einfach an die Bewerbung weiterzuleiten. Es ist wie ein Strohhalm, den Sie direkt aus Glas oder in begrenztem Tempo aus dem Strohhalm trinken können (hier ist die Person, die trinkt, Django). Und Nginx ist der Kellner, der Ihnen das Glas Saft gebracht hat.

Ich habe ein Benchmarking durchgeführt und dies gefunden - mit Gunicorn: 22k Req/s ohne Gunicorn: 34k Req/s

Ihre Site benötigt die zusätzlichen Anforderungen bei hoher Auslastung.

0
ShadowDoom

Ich suche eine zu vereinfachte Antwort ...

Benötige ich sowohl Nginx als auch etwas wie Gunicorn, um Django Apps auf Nginx bereitzustellen?

Wenn ja, wie werden die HTTP-Anforderungen tatsächlich behandelt?

Zu vereinfachte Antwort:

JA.

Sowohl Nginx als auch Gunicorn.

Da Sie auf Nginx bereitstellen, benötigen Sie natürlich Nginx.

Da Sie Django bereitstellen, ein Webframework, benötigen Sie eine Verbindung zwischen dem Webserver (Nginx) und dem Webframework (Django). In Python world) wird so etwas als WSGI-Server bezeichnet (aber denken Sie, es ist wie eine mittlere Ware). Beispiele hierfür sind Gunicorn und uWSGI. Bei der Bearbeitung einer Anfrage leitet Nginx die Anfrage an Gunicorn weiter oder uWSGI, das wiederum Django Code) aufruft und die Antwort zurückgibt.

Dieses Dokument und Pauls Antwort wird Ihnen helfen, es besser zu lernen.

0
Cyker