uWSGI 的意义何在?

Posted

技术标签:

【中文标题】uWSGI 的意义何在?【英文标题】:What is the point of uWSGI? 【发布时间】:2016-11-30 18:49:12 【问题描述】:

我正在查看WSGI specification,并试图弄清楚像uWSGI 这样的服务器如何适合图片。我了解 WSGI 规范的重点是将 nginx 等 Web 服务器与 Web 应用程序分开,就像您使用 Flask 编写的一样。我不明白 uWSGI 是干什么用的。为什么nginx不能直接调用我的Flask应用?烧瓶不能直接对它说 WSGI 吗?为什么 uWSGI 需要介于两者之间?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

来自docs:

uWSGI 支持多种与 Web 服务器集成的方法。它还能够自行处理 HTTP 请求。

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

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

Python 目前拥有各种各样的 Web 应用程序框架,例如 Zope、Quixote、Webware、SkunkWeb、PSO 和 Twisted Web——仅举几例 1。对于 Python 新用户来说,这种广泛的选择可能是个问题,因为一般来说,他们对 Web 框架的选择会限制他们对可用 Web 服务器的选择,反之亦然。

【讨论】:

【参考方案4】:

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

为什么 nginx 不能直接调用我的 Flask 应用?

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

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

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

“什么是什么?!另一个叫 uwsgi 的东西?!” 你问。是的,这很混乱。当您引用uWSGI 时,您指的是http 服务器。当您谈论uwsgi(全部小写)时,您是在谈论binary protocol,uWSGI 服务器 使用它与nginx 等其他服务器通信。他们为此取了一个坏名声。

对于任何感兴趣的人,我写了一个blog article 来讨论它,其中包含更多细节、一些历史和一些例子。

【讨论】:

可以使用 Werkzeug 作为 HTTP 服务器运行 Flask 应用程序,但它不是生产就绪设置。 uWSGI 解决了多个问题: * HTTP 解析(在 C 中更快)和与 WSGI 应用程序的接口 * 在多个进程/线程中启动应用程序以获得更好的并发性 * 充当 WSGI 应用程序的监督者 @SergeyPanfilov 问题是我们不知道 uwsgi 如何处理flask,每个进程/线程创建一个flask app 实例?我已经在 Flask-Executor 等烧瓶中看到了一些后台任务的实现,它必须在请求中绑定。不能脱离上下文。 阅读 Hasan 的答案.. 它接近正确答案..... http 服务器大多是用 C 编写的,它们无法将 http 请求转发到 python 后端......你的答案只是谈机械【参考方案5】:

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

此链接可能对您有所帮助:https://www.fullstackpython.com/wsgi-servers.html

【讨论】:

这里有三样东西:nginx、uwsgi、flask。在 WSGI 规范的上下文中,它们是如何组合在一起的? nginx 是服务器,uwsgi 是应用程序,还是 uwsgi 是服务器,flask 是应用程序? uWSGI 是服务器,flask 是应用程序。 好吧,如果你不介意,看看我对我自己问题的回答,看看你的想法。 为什么网络服务器不理解 Python 应用程序?能看懂PHP,为什么不能看懂Python或其他语言? jdogg Web 服务器本身也不理解 PHP 应用程序,它们要么使用 CGI(过时且速度慢的界面)、FastCGI(可被视为 uwsgi 的“竞争对手”),要么它是带有 mod_php 的 Apache。是的,Apache 也有 mod_python ......以及其他语言的模块,但是出于性能、配置、内存使用和安全性的原因,同时让您的 web 服务器也成为您的应用程序服务器也是一个过时的想法。没有理由 100MB 的 Apache 实例需要为您的 favicon.ico 文件提供服务。

以上是关于uWSGI 的意义何在?的主要内容,如果未能解决你的问题,请参考以下文章

严格声明的意义何在?

-primitiveValueForKey: 的意义何在?

ISerializable 接口的意义何在?

Kotlin 中使用函数的意义何在

Windows 上 Mono 的意义何在

哈希的意义何在?