Warum brauche ich Nginx, wenn ich uWSGI habe?

62

Es gibt viele Tutorials zum Konfigurieren von nginx für die Zusammenarbeit mit uWGSI, wenn ich eine Django-Anwendung bereitstellen möchte.

Aber warum brauche ich Nginx in diesem Kit? uWSGI selbst kann WSGI-Python-Anwendungen bedienen, statische Dateien und SSL. Was kann nginx, was uWSGI nicht kann?

user983447
quelle
9
Ich kann sehen, dass diese Frage als meinungsbasiert abgeschlossen ist. Ich stimme überhaupt nicht zu. Frage "Was kann Nginx, was UWSGI nicht kann?" basiert auf Fakten.
user983447
1
Ich spreche im Allgemeinen nicht für Neueröffnungen, aber in diesem Fall stimme ich zu. Die bisherige Antwort ist gut, was zeigt, dass die Frage, wie sie geschrieben ist, vernünftige und relevante Antworten zulässt. Ich denke, das macht es wahrscheinlich zu einer guten Frage.
MadHatter

Antworten:

55

Das tust du nicht.

Das ist jedenfalls die einfache Antwort - du brauchst es nicht. uWSGI ist selbst ein fähiger Server.

Andere Server wie nginx gibt es jedoch schon länger und sie sind (wahrscheinlich) sicherer und verfügen über zusätzliche Funktionen, die von uWSGI nicht unterstützt werden, z. B. einen verbesserten Umgang mit statischen Ressourcen (über eine beliebige Kombination von Expires oder E-Tag) Header, GZIP-Komprimierung, vorkomprimiertes GZIP usw.), die die Server- und Netzwerklast erheblich reduzieren können; Darüber hinaus kann ein Server wie nginx vor Ihrer Django-Anwendung auch das Zwischenspeichern Ihres dynamischen Inhalts implementieren, wodurch die Serverauslastung weiter verringert und sogar die Verwendung eines CDN erleichtert wird (was normalerweise bei dynamischem Inhalt nicht gut funktioniert) ). Sie könnten sogar noch weiter gehen und nginx auf einem vollständig separaten Server installieren und Anforderungen für dynamischen Inhalt an einen Cluster von Anwendungsservern mit Lastenausgleich umkehren, während Sie den statischen Inhalt selbst verarbeiten.

Zum Beispiel ist mein Blog (während es WordPress ist, es hat Nginx davor) so eingestellt, dass Posts für 24 Stunden und Indexseiten für 5 Minuten zwischengespeichert werden. Obwohl ich nicht genug Verkehr sehe, um die meiste Zeit wirklich von Bedeutung zu sein, hilft es meinem winzigen VPS, die gelegentlichen Anstiege zu überstehen, die es sonst niederschlagen könnten - wie den großen Verkehrsanstieg, wenn einer meiner Artikel gepickt wird von einem Twitterer mit vielen Tausenden von Followern, von denen viele es ihren Tausenden von Followern erneut getwittert haben.

Wenn ich einen "nackten" uWSGI-Server betrieben hätte (und davon ausgegangen wäre, dass es sich um eine Django-Site und nicht um WordPress handelte), wäre es vielleicht ganz gut dagegen angekommen - oder es wäre abgestürzt und hätte mich vermisste Besucher gekostet . Nginx davor zu haben, um mit dieser Last fertig zu werden, kann wirklich helfen.

Abgesehen davon, wenn Sie nur eine kleine Site betreiben, auf der nicht viel Verkehr herrscht, brauchen Sie weder Nginx noch etwas anderes. Verwenden Sie uWSGI einfach für sich, wenn Sie dies möchten. Auf der anderen Seite, wenn Sie eine Menge Verkehr sehen werden ... na ja, Sie noch vielleicht uwsgi wollen, aber Sie sollten zumindest etwas vor ihm betrachten mit der Last zu helfen. Eigentlich sollten Sie mit Ihrer fertigen Site verschiedene Konfigurationen testen, um zu bestimmen, was für Sie unter Ihrer erwarteten Last am besten funktioniert, und was auch immer das sein mag.

Kromey
quelle
3
Das einzige, was mir in den Sinn kommt, ist, dass es sich bei dem nativen Protokoll für uWSGI nicht um http, sondern um das uwsgi-Protokoll handelt. Das uwsgi-Protokoll ist einfacher und effizienter zu handhaben als http. Wenn Sie also einen umfassenderen Webserver (nginx oder so weiter) vor Ihre uWSGI-Anwendung stellen, wird nicht viel verarbeitet, und es kann je nach Ihren Anforderungen erhebliche Vorteile geben braucht.
Håkan Lindqvist
@ HåkanLindqvist ist absolut richtig; Nur zur Verdeutlichung: uWSGI ist zwar vollständig in der Lage, HTTP zu "sprechen", kann jedoch auch für sich allein stehen, aber es ist durchaus erwähnenswert, dass ein Webserver davor das uwsgi-Protokoll und nicht HTTP verwenden würde Sprechen Sie mit uWSGI, und daher ist die damit verbundene Verarbeitung nur geringfügig doppelt vorhanden.
Kromey
Das ist eine feine Antwort, aber kann es mit einem Link zu uwsgi eigenen Dokumentation zum Thema verbessert werden, was mit mehr Einzelheiten erklärt , was Sie können mit uwsgi tun: uwsgi-docs.readthedocs.io/en/latest/...
Tobias McNulty
1

IMO, wenn Sie Ihre Website in das Internet anstatt in Lab stellen, werden Sie möglicherweise den Unterschied bemerken.

Stellen Sie sich einen Benutzer aus einem anderen Land mit niedriger Netzwerkgeschwindigkeit vor, und öffnen Sie den Webbrowser, um auf Ihre Website zuzugreifen. uWSGI behandelt diese HTTP-Verbindung in einem Thread. Dieser Thread kann aufgrund der geringen Netzwerkgeschwindigkeit ziemlich lange auf eine vollständige HTTP-Anforderung warten. Stellen Sie sich vor, dass 100 Benutzer so langsam sind, wenn Ihre Thread-Pool-Größe 100 beträgt. Was passiert dann? Kein inaktiver Thread für andere HTTP-Anforderungen.

Bei Nginx sieht es ganz anders aus. Nginx ist in 'Reactor Pattern' entworfen. Sie könnten 'Reactor Pattern' googeln, um zu sehen, wie es funktioniert. Kurz gesagt, eine langsame Verbindung wirkt sich nicht auf die Verarbeitung anderer HTTP-Anforderungen aus.

Jcyrss
quelle
1
Ich bezweifle, dass die Verwendung von Nginx dies ändern wird. Wenn eine Django-Anwendung mit WSGI auf Apache gehostet wird, wird die Anzeigefunktion aufgerufen, bevor POST-Daten von einem Socket gelesen werden. Wenn der Client also langsam ist, belegt er einen Thread, von dem die Anforderung empfangen wurde, bis die POST-Daten empfangen wurden. Warum sollte das Ersetzen von Apache durch Nginx das ändern?
Kasperd
1
Wie ich weiß, wird Nginx standardmäßig keine HTTP-Anforderung an den Back-End-Anwendungsserver weiterleiten, bis eine vollständige HTTP-Anforderung eingeht. Für Anwendungsserver wie Django ist es also immer eine schnelle HTTP-Verbindung und -Anforderung, und es wird keine Zeit darauf verschwendet, auf eine vollständige http-Anforderung zu warten. Nachdem die Aufgabe bald bearbeitet wurde, könnte der laufende Thread für die nächste HTTP-Anforderung bald inaktiv sein.
Jcyrss
1
Es wird als Anforderungspufferung bezeichnet, die in Nginx standardmäßig aktiviert ist (in älteren Versionen von Nginx war es nicht möglich, dies zu deaktivieren
Tobias McNulty