fragen stichworte

Warum brauche ich Nginx und so etwas wie Gunicorn?

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

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

Wenn ja, was behandelt eigentlich die HTTP-Anforderungen?

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

antworten

Übermäßig vereinfacht: Sie benötigen etwas, das Python ausführt, aber Python eignet sich nicht für die Bearbeitung aller 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-trivialem Einsatz etwas Upstream, das die Anforderungen verarbeitet, die Ihre Django-App nicht verarbeiten soll. Triviale Beispiele für solche Anforderungen dienen statischen Assets (images/css/js).

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

In der Vergangenheit würde jede dieser Ebenen auf separaten Maschinen gehostet (und höchstwahrscheinlich würden in den ersten beiden Ebenen mehrere Maschinen vorhanden sein, dh: 5 Webserver senden Anfragen an zwei App-Server, die wiederum eine einzige Datenbank abfragen). .

In der modernen Zeit haben wir jetzt Anwendungen in allen Formen und Größen. Nicht jedes Wochenende oder eine kleine Business-Site benötigt tatsächlich die Leistung mehrerer Maschinen und läuft problemlos auf einer einzigen Box. Dies hat zu neuen Einträgen in die Reihe der Hosting-Lösungen geführt. Bei manchen Lösungen wird der App-Server mit dem Webserver verbunden (Apache httpd + mod_wsgi, Nginx + mod_uwsgi usw.). Und es ist überhaupt nicht ungewöhnlich, die Datenbank auf derselben Maschine wie eine dieser Web/App-Serverkombinationen zu hosten.

Nun haben wir im Fall von Gunicorn eine spezifische Entscheidung getroffen (durch Kopieren von Ruby's Unicorn), die Dinge von Nginx zu trennen, während wir uns auf Nginx 'Stellvertreterverhalten verlassen. Wenn wir also davon ausgehen können, dass Gunicorn niemals Verbindungen direkt aus dem Internet liest, müssen wir uns keine Sorgen um langsame Kunden 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 und die Leistung nicht wesentlich beeinträchtigt wird. Außerdem können Benutzer andere Proxys verwenden (vorausgesetzt, dass sie ordnungsgemäß puffern).

Zu Ihrer zweiten Frage, was die HTTP-Anfrage tatsächlich verarbeitet, lautet die einfache Antwort Gunicorn. Die vollständige Antwort ist, dass sowohl Nginx als auch Gunicorn die Anfrage bearbeiten. Grundsätzlich erhält Nginx die Anfrage und wenn es sich um eine dynamische Anfrage (in der Regel auf URL-Mustern basierend) handelt, wird sie diese an Gunicorn weiterleiten, die diese bearbeitet und dann eine Antwort an Nginx zurücksendet, die die Antwort dann an das Original weiterleitet 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 nach Django mit Nginx suchen, würde ich Gunicorn, mod_uwsgi und vielleicht CherryPy als Kandidaten für die Django-Seite untersuchen.

Ich mochte diese Erklärung in ihrer Einfachheit:

Nginx will face the outside world. It will serve media files (images, CSS, etc) directly from the file system. However, it can't talk directly to Django applications; it needs something that will run the application, feed it requests from the web, and return responses.

That's Gunicorn's job. Gunicorn will create a Unix socket, and serve responses to nginx via the wsgi protocol - the socket passes data in both directions:

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

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

I'm looking for an overly simplified answer...

Do I need both Nginx and something like Gunicorn to deploy Django apps on Nginx?

If so, what actually handles the HTTP requests?

Zu stark vereinfachte Antwort:

JA.

Sowohl Nginx als auch Gunicorn.

Da Sie Nginx einsetzen, benötigen Sie natürlich Nginx.

Da Sie Django, ein Web-Framework, einsetzen, benötigen Sie etwas, das die Kommunikation zwischen dem Webserver (Nginx) und dem Web-Framework (Django) überbrückt. In der Python-Welt wird dies als WSGI-Server bezeichnet (denken Sie jedoch, es sei eine Middleware). Beispiele hierfür sind Gunicorn und uWSGI. Bei der Bearbeitung einer Anfrage übermittelt Nginx die Anfrage an Gunicorn oder uWSGI, die wiederum Django-Code aufrufen und die Antwort zurückgeben.

Dieses Dokument und die Antwort von Paul werden Ihnen helfen, es besser zu lernen.