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

时间:2016-08-16 19:15:54

标签: python nginx flask uwsgi

使用uWSGI和Nginx设置Flask非常困难,即使使用buildout脚本也需要很长时间,并且必须将其记录到稍后要再现的指令中。

如果我没有计划服务器上的大负荷(它是公开的隐藏),没有uWSGI运行它是否有意义? (Flask可以收听端口.Nginx可以转发请求吗?)

不使用Nginx,只是在端口上运行裸烧瓶应用程序是否有意义?

3 个答案:

答案 0 :(得分:17)

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

开发服务器不适用于生产。它的设计不是特别高效,稳定或安全。

将Werkzeug开发服务器替换为生产就绪的WSGI服务器(如Gunicorn或uWSGI),无论应用程序在哪里可用,都可以使用。

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

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

答案 1 :(得分:5)

据推测,您已经有一个Flask应用程序对象和路由设置,但如果您创建这样的应用程序:

import flask

app = flask.Flask(__name__)

然后设置你的@app.route(),然后当你想要启动应用程序时:

import gevent

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

然后你可以直接运行你的应用程序而不必告诉gunicorn或uWSGI或其他任何东西为你运行它。

我有一个案例,我希望使用flask的实用程序来构建一个Web应用程序(一个REST API服务),并发现无法用其他非烧瓶,非Web服务元素组成烧瓶问题。我最终找到了gevent.wsgi.WSGIServer,这正是我所需要的。致电app_server.serve_forever()后,您可以在应用程序要退出时致电app_server.stop()

在我的部署中,我的应用程序正在侦听localhost:使用flask和gevent,然后我在另一个端口上有nginx反向代理HTTPS请求,并将它们转发到localhost上的flask服务。

答案 2 :(得分:1)

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

关于需要反向代理服务器(例如 Nginx),这取决于您的用例。 如果您在 AWS 中最新的负载均衡器(例如 application load balancer(非经典负载均衡器))后面部署您的应用程序,这本身就足以满足大多数用例的需求。如果您可以选择,则无需花费精力设置 NGINX。

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