好的,我现在理解了。
为什么nginx不能直接调用我的Flask应用程序?
因为nginx
不支持WSGI规范。从技术上讲,如果他们想要的话,nginx可以实现WSGI
规范,只是他们没有这样做。
既然如此,我们需要一个实现该规范的Web服务器,这就是uWSGI
服务器的作用。
请注意,uWSGI
是一个完整的HTTP服务器,可以独立工作并且表现良好。我已经多次在这个领域使用过它,效果非常好。如果您需要静态内容的超高吞吐量,那么您可以选择将nginx
放在您的uWSGI
服务器前面。当您这样做时,它们将通过低级协议uwsgi
进行通信。
"什么!又有一个叫做uwsgi的东西?"你问道。是的,这很令人困惑。当你引用uWSGI
时,你是在谈论一个http服务器。当你谈论uwsgi
(全部小写)时,你谈论的是uWSGI
服务器用来与其他服务器进行通信的二进制协议。这次他们选了个不好的名字。
对于任何感兴趣的人,我写了一篇博客文章,其中包括更多具体细节、一些历史和例子。
WSGI只是一个接口规范,简单地说,它告诉您应该实现哪些方法以在服务器和应用程序之间传递请求和响应。当使用像Flask或Django这样的框架时,这由框架本身处理。uWSGI支持几种与Web服务器集成的方法。它还能够自己处理HTTP请求。
Python目前拥有各种各样的Web应用程序框架,例如Zope、Quixote、Webware、SkunkWeb、PSO和Twisted Web等,仅举几例1。这种广泛的选择可能对新的Python用户构成问题,因为一般来说,他们的Web框架选择会限制可用的Web服务器选择,反之亦然。
传统的 Web 服务器无法理解或运行 Python 应用程序。这就是为什么 WSGI 服务器出现的原因。另一方面,Nginx 支持反向代理来处理请求并将响应传回 Python WSGI 服务器。
这个链接可能会对您有帮助:https://www.fullstackpython.com/wsgi-servers.html
我们缺失了一个重要的方面。Flask和Django是Web框架,我们使用它们构建Web应用程序。uWSGI或Gunicorn处理框架文件。将其视为位于Django应用程序和Nginx之间的软件应用程序。uWSGI和Nginx使用WSGI进行通信,但Django和uWSGI之间没有通信接口。观看此视频:https://www.youtube.com/watch?v=WqrCnVAkLIo