是否需要 WSGI 服务器和 HTTP 服务器来为 Flask 应用提供服务?

问题描述 投票:0回答:3

使用 uWSGI 和 Nginx 设置 Flask 可能很困难。我尝试按照 this DigitalOcean tutorial 进行操作,但仍然遇到问题。即使使用构建脚本也需要时间,我需要编写下一次要遵循的说明。

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

不使用 Nginx,只在端口上运行裸 Flask 应用程序有意义吗?

python nginx flask uwsgi
3个回答
94
投票

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

开发服务器不适用于生产。它的设计目的不是特别高效、稳定或安全。它不支持 HTTP 服务器的所有可能功能。

在转移到生产环境时,将 Werkzeug 开发服务器替换为生产就绪的 WSGI 服务器,例如 Gunicorn 或 uWSGI,无论应用程序在何处可用。


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


Flask 文档 如何以各种方式部署。许多托管服务提供商也有关于部署 Python 或 Flask 的文档。


32
投票

首先创建应用程序:

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 请求。


5
投票

你肯定需要像 Gunicorn 这样的生产 WSGI 服务器,因为 Flask 的开发服务器是为了易于开发而无需太多配置来进行微调和优化。 例如。 Gunicorn 具有多种配置,具体取决于您要解决的用例。但是开发flask server没有这些能力。此外,一旦您尝试扩展和处理更多请求,这些开发服务器就会显示出它们的局限性。

关于需要像 Nginx 这样的反向代理服务器,这取决于您的用例。 如果您将应用程序部署在 AWS 中最新的负载均衡器之后,例如 application load balancer(不是经典负载均衡器),它本身就足以满足大多数用例。如果您有该选项,则无需努力设置 NGINX。

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

© www.soinside.com 2019 - 2024. All rights reserved.