为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?

Posted

技术标签:

【中文标题】为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?【英文标题】:Why does running Flask with Nginx require a WSGI wrapper?为什么使用 Nginx 运行 Flask 需要 WSGI 包装器? 【发布时间】:2015-01-16 13:44:37 【问题描述】:

因此,从 Python/Flask 文档中,他们都建议不要将 Flask Web 服务器作为生产 Web 服务器运行,这是有道理的。我的问题是,我是否能够在 nginx 服务器上运行我的 Flask 应用程序?为什么互联网上的所有指南都建议将 Flask 包裹在 uWSGI、Tornado 或其他一些 WSGI 服务器上? WSGI 是什么意思? Flask WGSI 不兼容吗?

我特别迷茫,因为here,第一反应说:

Apache 和 Nginx 都是 HTTP 服务器。它们可以提供静态文件,例如 (.jpg 和 .html 文件)或动态页面(例如用 php 或 Python 等语言编写的 Wordpress 博客或论坛)。

但是this 帖子状态:

Nginx 是一个网络服务器。它提供静态文件,但无法执行和托管 Python 应用程序。 uWSGI 填补了这一空白。

我的应用程序由一个服务器(例如:uWSGI)然后另一个服务器(例如:Nginx)处理似乎效率低下。

【问题讨论】:

【参考方案1】:

Nginx 是一个 Web 服务器,它关注的是 Web 服务器的东西,而不是如何运行 Python 程序。 uWSGI 是一个应用服务器,并且知道如何用 Python(以及现在的其他语言)说 WSGI。 Nginx 和 uWSGI 都使用 uWSGI 协议,这是一种在 UNIX 套接字上的高效协议。

Nginx 处理来自/响应外部世界的 http 请求(可能是负载平衡、缓存等)。您的 Flask 应用程序处理 WSGI 请求/响应。 uWSGI 知道如何启动您的应用程序(可能使用多处理和/或线程)并弥合 HTTP 和 WSGI 之间的差距。

除了 Nginx 之外还有其他的 HTTP 服务器,除了 uWSGI 之外还有其他的 WSGI 服务器,但是它们都使用相同的工作流程:HTTP 服务器传递给 WSGI 服务器,WSGI 服务器管理你的应用程序进程并返回给 HTTP 服务器。

此设置称为reverse proxy。它允许每个工具做它擅长的事情,而不用关心过程的其他部分。没有什么特别低效的,直到你真正大规模规模。

【讨论】:

【参考方案2】:

嗯,WSGI 是 Python 应用程序和 Web 服务器之间的接口规范。 uWSGI(简单地说)是用 C/C++ 编写的该规范的实现。只需提供一个入口点,您就可以在“严肃的”网络服务器(如 nginx)上运行几乎任何应用程序:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]

然后像这样运行它:

uwsgi --http :9090 --wsgi-file file_with_the_code_above.py

当然,您可以返回任何您想要的东西,而不是 ["Hello world"]。请参阅http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html 了解更多信息。

【讨论】:

以上是关于为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 上使用 Nginx 部署 Flask 应用

为啥运行 Flask 开发服务器会自行运行两次?

使用 Gunicorn + Nginx + Flask 有啥好处? [复制]

使用flask和flask-socketio配置nginx、uwsgi

使用 uwsgi 和 nginx 运行 Flask 应用程序

Ubuntu+Nginx+uWSGI+Flask应用