在提供Flask应用程序时,是否需要WSGI服务器和HTTP服务器?

77

使用uWSGI和Nginx设置Flask可能会比较困难。我试着去遵循这篇DigitalOcean教程,但仍然遇到了问题。即使使用构建脚本,也需要一些时间,并且下次还需要编写指令。

如果我不希望有大量的流量,或者应用程序是私有的,那么不使用uWSGI运行它是否有意义?Flask可以侦听端口。Nginx是否只需转发请求?

不使用Nginx,只在一个端口上运行裸的Flask应用程序是否有意义?

3个回答

96

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

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

在从开发环境转移到生产环境时,无论应用程序在何处可用,都应该用生产就绪的WSGI服务器,例如Gunicorn或uWSGI来取代Werkzeug开发服务器。


对于“是否应该使用Web服务器”的问题,答案类似。WSGI服务器碰巧具有HTTP服务器,但它们不如专用的生产HTTP服务器(Nginx、Apache等)好。


Flask 文档介绍了各种部署方式。许多托管提供商还有关于部署Python或Flask的文档。


34

首先创建应用程序:

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 请求到它那里。


虽然官方文档不鼓励直接使用gevent,但我发现这很容易设置,并且在需要对线程进行控制时非常有用。您可以在服务器旁边使用gevent.Greenlet.spawn()生成其他Greenlets。看起来我可以使用time.sleep()等待而不切换线程,而使用gevent.sleep()在切换线程时等待。 - Hermann

6

对于像Gunicorn这样的生产WSGI服务器,您确实需要这样的东西,因为Flask的开发服务器旨在简化开发,不需要太多配置进行微调和优化。 例如,Gunicorn根据您正在解决的用例有各种配置。但是开发flask服务器没有这些功能。此外,一旦尝试扩展和处理更多请求,这些开发服务器就会显示出它们的限制。

关于是否需要像Nginx这样的反向代理服务器,这取决于您的用例。 如果您正在使用AWS上的最新负载均衡器,例如应用程序负载均衡器(而非经典负载均衡器),那么它本身将足以应对大多数用例。如果您选择了此选项,则无需费力地设置NGINX。

反向代理的目的是处理慢客户端,即需要时间才能发送请求的客户端。这些反向负载均衡器缓冲请求,直到从客户端获取整个请求并异步发送给Gunicorn。这显着改善了应用程序的性能。


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