Frage Warum brauche ich Nginx und etwas wie Gunicorn?


Ich suche nach einer allzu vereinfachten Antwort auf die folgende Frage. Ich versuche ein grundlegendes Verständnis dafür zu entwickeln, wie Nginx mit etwas wie Gunicorn zusammenarbeitet.

Brauche ich sowohl Nginx als auch etwas wie Gunicorn, um Django-Apps auf Nginx zu installieren?

Wenn ja, was behandelt die HTTP-Anfragen eigentlich?

Ps. Ich möchte nicht Apache und mod_wsgi!


182
2017-11-15 21:16


Ursprung


Apache und mod_wsgi ist die einfachste Art, die Brücke zwischen Ihrer Django-Anwendung und HTTP-Anfragen zu implementieren, die auch in einer Produktionsumgebung sehr gut ist. Für viele Entwickler bedeutet dies "Apache ist besser als nginx", wenn sie es nur wüssten, aber da "betamax besser ist als VHS", ist es leider Dogma-Regeln - MagicLAMP


Antworten:


Übermäßig vereinfacht: Sie benötigen etwas, das Python ausführt, aber Python ist nicht die beste Lösung für alle Arten von Anfragen.

[Haftungsausschluss: Ich bin ein Entwickler von Gunicorn]

Weniger vereinfacht: Unabhängig davon, welchen App-Server du verwendest (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy), jede Art von nicht-trivialer Bereitstellung wird etwas Upstream haben, das die Anfragen behandelt, die deine Django-App nicht behandeln sollte. Triviale Beispiele für solche Anfragen sind statische Assets (images / css / js).

Daraus ergeben sich zwei erste Stufen der klassischen "Drei-Schichten-Architektur". Dh 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 (Gunicorn in Ihrem Beispiel). (Nebenbei, die dritte der drei Ebenen ist die Datenbank)

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

In der modernen Zeit haben wir jetzt Anwendungen in allen Formen und Größen. Nicht jedes Weekend-Projekt oder jede kleine Baustelle benötigt tatsächlich die Leistung mehrerer Maschinen und wird ziemlich glücklich auf einer einzigen Box laufen. Dies hat neue Einträge in das Array von 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 nicht ungewöhnlich, die Datenbank auf demselben Rechner wie eine dieser Web / App-Server-Kombinationen zu hosten.

Im Falle von Gunicorn haben wir eine spezifische Entscheidung getroffen (Kopieren von Rubys Unicorn), um die Dinge getrennt von Nginx zu halten, während wir uns auf das Proxying-Verhalten von Nginx verlassen. Insbesondere wenn wir davon ausgehen können, dass Gunicorn niemals Verbindungen direkt aus dem Internet lesen wird, müssen wir uns keine Sorgen um Clients machen, die langsam sind. 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. Es ermöglicht Benutzern auch die Verwendung anderer Proxies (vorausgesetzt, sie puffern korrekt).

Was Ihre zweite Frage betrifft, was eigentlich die HTTP-Anfrage behandelt, ist die einfache Antwort Gunicorn. Die vollständige Antwort lautet, dass sowohl Nginx als auch Gunicorn die Anfrage bearbeiten. Grundsätzlich wird Nginx die Anfrage erhalten und wenn es eine dynamische Anfrage ist (im Allgemeinen basierend auf URL-Mustern), wird Gunicorn diese Anfrage geben, die es verarbeiten wird, und dann eine Antwort an Nginx zurückgeben, die die Antwort dann an das Original zurücksendet Klient.

Also abschließend ja. Sie benötigen sowohl Nginx als auch Gunicorn (oder etwas Ähnliches) für eine ordnungsgemäße Django-Bereitstellung. Wenn Sie speziell nach Django mit Nginx suchen, dann würde ich Gunicorn, mod_uwsgi und vielleicht CherryPy als Kandidaten für die Django-Seite der Dinge untersuchen.


267
2017-11-15 21:49



Danke, dass Sie sich die Zeit genommen haben, eine so detaillierte Antwort zu schreiben! Irgendwelche empfohlene Lektüre auf dieser "3-Tier-Architektur"? - a.m.
Große Antwort, aber ich verstehe das Problem mit langsamen Clients nicht. - Mads Skjern
@ MadsSkjern Ich vermute hier, aber wenn Sie davon ausgehen, dass alle Clients schnell sind, dann können Sie einen festen Pool von Worker-Prozessen verwenden, und müssen nicht für den Fall, dass viele oder alle blockiert auf einen Client warten. - Jonathan Hartley
@ a.m. en.wikipedia.org/wiki/Multitier_Architektur - Jonathan Hartley
meine django app dient nur json keinen statischen inhalt kann ich einfach mit gunicorn und no nginx gehen - Sar009


Ich mochte diese Erklärung in ihrer Einfachheit:

Nginx wird sich der Außenwelt stellen. Es wird Mediendateien (Bilder,   CSS usw.) direkt aus dem Dateisystem. Es kann jedoch nicht sprechen   direkt zu Django-Anwendungen; es braucht etwas, das das laufen lässt   Anwendung, Feed-Anfragen aus dem Web und Antworten zurückgeben.

Das ist Gunicorns Job. Gunicorn wird einen Unix-Socket erstellen und bedienen   Antworten auf Nginx über das Wsgi-Protokoll - der Socket übergibt Daten in   Beide Richtungen:

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

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


20
2017-12-13 07:52



Es müssen keine Steckdosen sein, nur für den Fall, dass andere sich fragen. - akshay


Ich suche nach einer übermäßig vereinfachten Antwort ...

Brauche ich sowohl Nginx als auch etwas wie Gunicorn, um Django-Apps auf Nginx zu installieren?

Wenn ja, was behandelt die HTTP-Anfragen eigentlich?

Übermäßig vereinfachte Antwort:

JA.

Sowohl Nginx als auch Gunicorn.

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

Da Sie Django, ein Web-Framework, bereitstellen, benötigen Sie etwas, das das Gespräch zwischen dem Webserver (Nginx) und dem Web-Framework (Django) überbrückt. In der Python-Welt wird so etwas als WSGI-Server bezeichnet (denke aber, dass es wie eine Middleware ist), zu denen Gunicorn und uWSGI gehören. Wenn eine Anfrage bearbeitet wird, gibt Nginx die Anfrage an Gunicorn oder uWSGI weiter, die wiederum den Django-Code aufruft und die Antwort zurückgibt.

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


0
2017-10-26 21:42