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

cul*_*rón 22 python nginx flask uwsgi

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

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

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

dav*_*ism 24

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

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

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


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


Flask 记录了如何以各种方式进行部署.许多托管服务提供商也提供有关部署Python或Flask的文档.


小智 12

大概您已经有一个Flask应用程序对象并设置了路由,但是如果您这样创建应用程序,则:

import flask

app = flask.Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

然后设置您@app.route()的,然后在您要启动该应用程序时:

import gevent

app_server = gevent.wsgi.WSGIServer((host, port), app)
app_server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

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

我遇到了一个案例,我想要flask的实用程序来构建Web应用程序(REST API服务),但发现无法将烧瓶与其他非Flask,非Web Service元素组合在一起是一个问题。最终我找到了gevent.wsgi.WSGIServer,这正是我所需要的。调用之后app_server.serve_forever(),您可以app_server.stop()在应用程序要退出时进行调用。

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


Ana*_*iva 6

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

至于是否需要反向代理服务器(例如 Nginx),这取决于您的用例。如果您将应用程序部署在 AWS 中最新的负载均衡器(例如应用程序负载均衡器(不是经典负载均衡器))后面,那么它本身就足以满足大多数用例。如果您有这样的选择,则无需花费精力来设置 NGINX。

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