Okay, ich glaube ich verstehe das jetzt.
Warum kann nginx meine Flask-Anwendung nicht direkt aufrufen?
Weil nginx
die WSGI-Spezifikation nicht unterstützt wird. Technisch gesehen könnte nginx die WSGI
Spezifikation implementieren, wenn sie wollten, sie haben es einfach nicht.
In diesem Fall benötigen wir einen Webserver, der die Spezifikation implementiert, wofür der uWSGI
Server bestimmt ist.
Beachten Sie, dass dies uWSGI
ein 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, nginx
vor Ihrem uWSGI
Server 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.
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 :
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 .
quelle
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
quelle
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.
quelle