uWSGI的作用是什么?

138
我正在查看WSGI规范,并试图弄清楚像uWSGI这样的服务器如何融入其中。我理解WSGI规范的重点是将Web服务器(如nginx)与Web应用程序(如使用Flask编写的应用程序)分开。但我不明白uWSGI的作用是什么。为什么nginx不能直接调用我的Flask应用程序?Flask不能直接向它发出WSGI吗?为什么需要uWSGI介入其中?
WSGI规范有两个方面:服务器和Web应用程序。uWSGI在哪一边?
5个回答

173

好的,我现在理解了。

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

因为nginx不支持WSGI规范。从技术上讲,如果他们想要的话,nginx可以实现WSGI规范,只是他们没有这样做。

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

请注意,uWSGI是一个完整的HTTP服务器,可以独立工作并且表现良好。我已经多次在这个领域使用过它,效果非常好。如果您需要静态内容的超高吞吐量,那么您可以选择将nginx放在您的uWSGI服务器前面。当您这样做时,它们将通过低级协议uwsgi进行通信。

"什么!又有一个叫做uwsgi的东西?"你问道。是的,这很令人困惑。当你引用uWSGI时,你是在谈论一个http服务器。当你谈论uwsgi(全部小写)时,你谈论的是uWSGI服务器用来与其他服务器进行通信的二进制协议。这次他们选了个不好的名字。

对于任何感兴趣的人,我写了一篇博客文章,其中包括更多具体细节、一些历史和例子。


12
使用Werkzeug作为HTTP服务器可能可以运行Flask应用程序,但这不是一个适合生产环境的设置。uWSGI可以解决多个问题:
  • 通过C语言更快地进行HTTP解析并与WSGI应用程序进行接口交互
  • 在多个进程/线程中启动应用程序以实现更好的并发性能
  • 充当WSGI应用程序的监督者。
- Sergey Panfilov
@SergeyPanfilov,问题在于我们不知道uwsgi如何处理flask,每个进程/线程是否创建一个flask应用程序实例?我看过一些在flask中实现后台任务的实现方式,例如Flask-Executor,它必须绑定在请求内部。无法放置在上下文之外。 - TomSawyer
2
阅读Hasan的答案,它接近正确答案......大多数http服务器都是用C编写的,它们无法将http请求转发到Python后端......你的答案只涉及了机制。 - overexchange
关于uWSGI和uwsgi的问题 - 程序员们常说“命名事物”很难,但似乎大多数人并没有尝试过 :( - undefined

31
在这种情况下,NGINX仅作为反向代理并呈现静态文件而不是动态文件。它接收请求并将它们代理到应用程序服务器,即UWSGI。
UWSGI服务器负责使用WSGI接口加载您的Flask应用程序。实际上,您可以使UWSGI直接侦听来自Internet的请求并删除NGINX(如果您喜欢的话),尽管它通常在反向代理后面使用。
文档中了解:

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

WSGI只是一个接口规范,简单地说,它告诉您应该实现哪些方法以在服务器和应用程序之间传递请求和响应。当使用像Flask或Django这样的框架时,这由框架本身处理。
换句话说,WSGI基本上是Python应用程序(如Flask、Django等)和Web服务器(如UWSGI、Gunicorn等)之间的协议。好处在于,由于您知道它们符合WSGI规范,因此可以轻松更改Web服务器,这实际上是其中一个目标,如PEP-333所述。

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


28

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

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


6
这里涉及三个东西:nginx、uwsgi和flask。在WSGI规范的背景下,它们如何相互配合?nginx是服务器,uwsgi是应用程序吗?还是uwsgi是服务器,flask是应用程序? - d512
uWSGI 是服务器,而 Flask 是应用程序。 - Rafiqul Hasan
好的,如果您不介意的话,请查看我的回答并告诉我您的想法。 - d512
7
为什么一个 Web 服务器无法理解 Python 应用程序?它可以理解 PHP,为什么不能理解 Python 或其他编程语言? - jdogg
2
Web服务器本身也不能直接理解PHP应用程序,因此它们使用的是CGI(一种过时且慢速的接口)、FastCGI(可以看作是uwsgi的“竞争对手”)或者是带有mod_php的Apache。是的,Apache还有一个mod_python……以及其他语言的模块,但同时将Web服务器与应用服务器合并在一起也是一种过时的想法,原因是性能、配置、内存使用和安全性等方面。没有理由让一个100MB的Apache实例来提供你的favicon.ico文件。 - Dondi Michael Stroma

2

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


1
简单来说,就像你在Nginx Web服务器上运行CGI或PHP应用程序的类比。由于Web服务器本身无法呈现这些格式,因此您将使用相应的处理程序(如php-fpm)来运行这些文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接