是否需要 WSGI 服务器和 HTTP 服务器来服务 Flask 应用程序?

用 uwsGI 和 Nginx 建立烧瓶可能很困难。我尝试跟随 这个数字海洋教程,但仍然有麻烦。即使使用构建脚本也需要时间,而且我需要编写下次遵循的说明。

如果我不期望有很多流量,或者应用程序是私有的,那么在没有 uWSGI 的情况下运行它有意义吗?烧瓶可以听一个端口。Nginx 可以只转发请求吗?

如果不使用 Nginx,只是在一个端口上运行裸 Flask 应用程序,这样做有意义吗?

46068 次浏览

当您“运行 Flask”时,您实际上是在运行 Werkzeug 的开发 WSGI 服务器,并将 Flask 应用程序作为 WSGI 调用传递。

开发服务器不适合在生产环境中使用。它的设计目的不是特别高效、稳定或安全。它不支持 HTTP 服务器的所有可能特性。

在转移到生产环境时,将 Werkzeug dev 服务器替换为可生产的 WSGI 服务器,如 Gunicorn 或 uWSGI,无论应用程序在哪里都可用。


答案与“我是否应该使用网络服务器”类似。WSGI 服务器碰巧有 HTTP 服务器,但它们不如专用的生产 HTTP 服务器(Nginx、 Apache 等)。


Flask 文件如何以各种方式进行部署。许多主机提供商也有关于部署 Python 或 Flask 的文档。

首先创建应用程序:

import flask


app = flask.Flask(__name__)

然后设置路线,然后当你想启动应用程序:

import gevent.pywsgi


app_server = gevent.pywsgi.WSGIServer((host, port), app)
app_server.serve_forever()

调用这个脚本来运行应用程序,而不必告诉 gunicorn 或 uWSGI 来运行它。

我希望 Flask 的实用程序能够构建一个 web 应用程序,但是很难将它与其他元素组合在一起。我最终发现 gevent.pywsgi.WSGIServer正是我所需要的。在调用 app_server.serve_forever()之后,在退出应用程序时调用 app_server.stop()

在我的部署中,我的应用程序正在使用 Flask 和 gevent 侦听 localhost:port,然后我让 Nginx 反向代理它的 HTTPS 请求。

您肯定需要类似于 Gunicorn 这样的生产 WSGI 服务器,因为 Flask 的开发服务器旨在简化开发,而不需要进行太多的微调和优化配置。 艾格。根据您试图解决的用例,Gunicorn 有一个 不同的构型。但是开发烧瓶服务器没有这些功能。此外,只要您尝试伸缩和处理更多请求,这些开发服务器就会显示出它们的局限性。

关于需要一个反向代理服务器,比如 Nginx,这取决于你的用例。 如果您将应用程序部署到 AWS 中最新的负载平衡器(如 应用程序负载均衡器(非经典的负载平衡器))之后,那么对于大多数用例来说,这本身就足够了。如果您有这个选项,就不需要设置 NGINX。

反向代理的目的是处理缓慢的客户端,也就是说客户端需要花费时间来发送请求。这些反向负载均衡器缓冲请求,直到从客户端获得整个请求并将其异步发送到 Gunicorn。这大大提高了应用程序的性能。