uWSGI 的意义何在?

What is the point of uWSGI?

我正在查看 WSGI specification and I'm trying to figure out how servers like uWSGI fit into the picture. I understand the point of the WSGI spec is to separate web servers like nginx from web applications like something you'd write using Flask。我不明白的是 uWSGI 的用途。为什么 nginx 不能直接调用我的 Flask 应用程序? Flask 不能直接对它说 WSGI 吗?为什么 uWSGI 需要介于两者之间?

WSGI 规范中有两个方面:服务器和 Web 应用程序。 uWSGI站在哪一边?

传统的 Web 服务器无法理解或无法使用 运行 Python 应用程序。这就是 WSGI 服务器进来的原因。另一方面,Nginx 支持反向代理来处理请求并传回 Python WSGI 服务器的响应。

这篇 link 可能会对您有所帮助:https://www.fullstackpython.com/wsgi-servers.html

好的,我想我现在明白了。

Why can't nginx directly call my Flask application?

因为nginx 不支持 WSGI 规范。从技术上讲,如果他们愿意,nginx 可以实现 WSGI 规范,只是他们没有。

既然如此,我们需要一个确实实现规范的 Web 服务器,这就是 uWSGI 服务器的用途。

请注意,uWSGI 是一个成熟的 http 服务器,它可以并且确实可以独立运行。我已经多次以这种身份使用它并且效果很好。如果您需要静态内容的超高吞吐量,则可以选择将 nginx 粘贴在 uWSGI 服务器前面。当您这样做时,他们将通过称为 uwsgi.

的低级协议进行通信

"What the what?! Another thing called uwsgi?!"你问。是的,这很混乱。当您引用 uWSGI 时,您指的是 HTTP 服务器。当您谈论 uwsgi(全部小写)时,您是在谈论 binary protocoluWSGI 服务器 用来与其他服务器通信,例如 nginx。他们给这个取了一个坏名字。

对于任何有兴趣的人,我写了一个 blog article 关于它的更多细节、一些历史和一些例子。

NGINX 在这种情况下仅用作反向代理并呈现 static files not the dynamic files,它接收请求并将它们代理到应用程序服务器,即 UWSGI。

UWSGI 服务器负责使用 WSGI 接口加载 Flask 应用程序。实际上,您可以让 UWSGI 直接侦听来自互联网的请求,并根据需要删除 NGINX,尽管它主要用于反向代理。

来自docs

uWSGI supports several methods of integrating with web servers. It is also capable of serving HTTP requests by itself.

WSGI只是一个接口规范,简单来说就是告诉你在服务器和应用程序之间传递请求和响应应该实现什么方法。当使用 Flask 或 Django 等框架时,这是由框架本身处理的。

换句话说,WSGI 基本上是 python 应用程序(Flask、Django 等)和 Web 服务器(UWSGI、Gunicorn 等)之间的契约。好处是您可以毫不费力地更改 Web 服务器,因为您知道它们符合 WSGI 规范,这实际上是目标之一,如 PEP-333 中所述。

Python currently boasts a wide variety of web application frameworks, such as Zope, Quixote, Webware, SkunkWeb, PSO, and Twisted Web -- to name just a few 1. This wide variety of choices can be a problem for new Python users, because generally speaking, their choice of web framework will limit their choice of usable web servers, and vice versa.

简单来说,只要想一下您正在使用 Nginx Web 服务器 运行ning CGI 或 PHP 应用程序的类比。您将使用相应的处理程序,例如 php-fpm 到 运行 这些文件,因为网络服务器以其本机形式不呈现这些格式。

我们缺少一个重要的方面。 Flask 和 Django 是网络框架,我们用它们构建网络应用程序。 uWSGI 或 Gunicorn 处理框架文件。将其视为位于 Django 应用程序和 Nginx 之间的软件应用程序。 uWSGI 和 Nginx 使用 WSGI 进行通信,但 Django 和 uWSGI 之间没有通信接口。观看此视频 https://www.youtube.com/watch?v=WqrCnVAkLIo