Was ist der Sinn von uWSGI?

94

Ich schaue mir die WSGI-Spezifikation an und versuche herauszufinden, wie Server wie uWSGI in das Bild passen. Ich verstehe, dass der Sinn der WSGI-Spezifikation darin besteht, Webserver wie nginx von Webanwendungen zu trennen, wie Sie sie mit Flask schreiben würden . Was ich nicht verstehe, ist, wofür uWSGI ist. Warum kann nginx meine Flask-Anwendung nicht direkt aufrufen? Kann Flask WSGI nicht direkt ansprechen? Warum muss uWSGI dazwischen kommen?

Die WSGI-Spezifikation enthält zwei Seiten: den Server und die Web-App. Auf welcher Seite steht uWSGI?

d512
quelle

Antworten:

127

Okay, ich glaube ich verstehe das jetzt.

Warum kann nginx meine Flask-Anwendung nicht direkt aufrufen?

Weil nginxdie WSGI-Spezifikation nicht unterstützt wird. Technisch gesehen könnte nginx die WSGISpezifikation implementieren, wenn sie wollten, sie haben es einfach nicht.

In diesem Fall benötigen wir einen Webserver, der die Spezifikation implementiert, wofür der uWSGIServer bestimmt ist.

Beachten Sie, dass dies uWSGIein vollwertiger http-Server ist, der selbstständig gut funktionieren kann und funktioniert. Ich habe es in dieser Funktion mehrmals verwendet und es funktioniert großartig. Wenn Sie einen extrem hohen Durchsatz für statische Inhalte benötigen, haben Sie die Möglichkeit, nginxvor Ihrem uWSGIServer zu bleiben . Wenn Sie dies tun, kommunizieren sie über ein Protokoll auf niedriger Ebene, das als bekannt ist uwsgi.

"Was zum was?! Eine andere Sache namens uwsgi?!" du fragst. Ja, es ist verwirrend. Wenn Sie referenzieren uWSGI, sprechen Sie von einem http-Server. Wenn Sie über uwsgi(alle Kleinbuchstaben) sprechen, sprechen Sie über ein Binärprotokoll, das der uWSGI Server verwendet, um mit anderen Servern wie zu sprechen nginx. Sie haben einen schlechten Namen gewählt.

Für alle, die interessiert sind, habe ich einen Blog-Artikel darüber geschrieben, der mehr Einzelheiten, ein bisschen Geschichte und einige Beispiele enthält.

d512
quelle
4
Es ist möglich, Flask-Anwendungen mit Werkzeug als HTTP-Server auszuführen, es ist jedoch kein produktionsfertiges Setup. uWSGI löst mehrere Probleme: * HTTP-Analyse (schneller in C) und Schnittstelle mit der WSGI-App * startet die App in mehreren Prozessen / Threads für eine bessere Parallelität * fungiert als Supervisor der WSGI-Apps
Sergey Panfilov
@ SergeyPanfilov das Problem ist, wir wissen nicht, wie Uwsgi mit Flask umgehen, jeder Prozess / Thread erstellt eine Instanz der Flask App? Ich habe einige Implementierungen für Hintergrundaufgaben in Flask wie Flask-Executor gesehen und sie müssen innerhalb einer Anfrage gebunden werden. Kann nicht außerhalb des Kontexts platziert werden.
TomSawyer
Lesen Sie die Antwort von Hasan. Es ist fast die richtige Antwort. HTTP-Server sind meistens in C geschrieben und können die HTTP-Anforderungen nicht an Python-Backends weiterleiten. Ihre Antwort spricht nur über die Mechanik
Überaustausch
25

NGINX funktioniert in diesem Fall nur als Reverse-Proxy und rendert statische Dateien, nicht die dynamischen Dateien . Es empfängt die Anforderungen und leitet sie an den Anwendungsserver weiter, der UWSGI wäre.

Der UWSGI-Server ist für das Laden Ihrer Flask-Anwendung über die WSGI-Schnittstelle verantwortlich. Sie können UWSGI tatsächlich dazu bringen, Anfragen aus dem Internet direkt abzuhören und NGINX zu entfernen, wenn Sie möchten, obwohl es meistens hinter einem Reverse-Proxy verwendet wird.

Aus den Dokumenten :

uWSGI unterstützt verschiedene Methoden zur Integration in Webserver. Es ist auch in der Lage, HTTP-Anforderungen selbst zu bearbeiten.

WSGI ist nur eine Schnittstellenspezifikation. In einfachen Worten wird angegeben, welche Methoden zum Weiterleiten von Anforderungen und Antworten zwischen dem Server und der Anwendung implementiert werden sollten. Bei Verwendung von Frameworks wie Flask oder Django wird dies vom Framework selbst erledigt.

Mit anderen Worten, WSGI ist im Grunde ein Vertrag zwischen Python-Anwendungen (Flask, Django usw.) und Webservern (UWSGI, Gunicorn usw.). Der Vorteil besteht darin, dass Sie Webserver mit geringem Aufwand wechseln können, da Sie wissen, dass sie der WSGI-Spezifikation entsprechen, die tatsächlich eines der in PEP-333 angegebenen Ziele ist .

Python bietet derzeit eine Vielzahl von Webanwendungs-Frameworks wie Zope, Quixote, Webware, SkunkWeb, PSO und Twisted Web - um nur einige zu nennen 1 . Diese große Auswahl kann für neue Python-Benutzer ein Problem sein, da die Auswahl des Webframeworks im Allgemeinen die Auswahl der verwendbaren Webserver einschränkt und umgekehrt.

alejandrodnm
quelle
20

Ein herkömmlicher Webserver versteht oder kann Python-Anwendungen nicht ausführen. Aus diesem Grund kommt der WSGI-Server ins Spiel. Andererseits unterstützt Nginx den Reverse-Proxy, um Anforderungen zu verarbeiten und Antworten für Python-WSGI-Server zurückzugeben.

Dieser Link könnte Ihnen helfen: https://www.fullstackpython.com/wsgi-servers.html

Rafiqul Hasan
quelle
3
Hier gibt es drei Dinge: Nginx, Uwsgi und Flasche. Wie passt das alles im Kontext der WSGI-Spezifikation zusammen? Ist nginx der Server und uwsgi die App oder ist uwsgi der Server und flask die App?
d512
uWSGI ist der Server und Flasche ist App.
Rafiqul Hasan
Wenn es Ihnen nichts ausmacht, lesen Sie meine Antwort auf meine eigene Frage und sehen Sie, was Sie denken.
d512
4
Warum versteht ein Webserver Python-Apps nicht? Es kann PHP verstehen, warum nicht Python oder andere Sprachen?
JDOGG
0

Stellen Sie sich in einfachen Worten eine Analogie vor, in der Sie eine CGI- oder PHP-Anwendung mit einem Nginx-Webserver ausführen. Sie werden die entsprechenden Handler wie php-fpm verwenden, um diese Dateien auszuführen, da der Webserver in seiner nativen Form diese Formate nicht rendert.

anrajme
quelle