【问题标题】:Are a WSGI server and HTTP server required to serve a Flask app?为 Flask 应用程序提供服务是否需要 WSGI 服务器和 HTTP 服务器?
【发布时间】:2016-12-23 07:05:24
【问题描述】:
使用 uWSGI 和 Nginx 设置 Flask 可能很困难。我尝试关注this DigitalOcean tutorial,但仍然遇到问题。即使使用构建脚本也需要时间,我需要编写说明以便下次遵循。
如果我不希望有很多流量,或者应用程序是私有的,那么在没有 uWSGI 的情况下运行它是否有意义? Flask 可以监听一个端口。 Nginx 可以只转发请求吗?
不使用 Nginx 是否有意义,只在端口上运行裸 Flask 应用程序?
【问题讨论】:
标签:
python
nginx
flask
uwsgi
【解决方案1】:
当您“运行 Flask”时,您实际上是在运行 Werkzeug 的开发 WSGI 服务器,并将您的 Flask 应用程序作为 WSGI 可调用对象传递。
开发服务器不适用于生产。它的设计目的不是特别高效、稳定或安全。它不支持 HTTP 服务器的所有可能功能。
在迁移到生产环境时,将 Werkzeug 开发服务器替换为可用于生产的 WSGI 服务器,例如 Gunicorn 或 uWSGI,无论应用程序在哪里可用。
“我应该使用网络服务器”的答案类似。 WSGI 服务器恰好有 HTTP 服务器,但它们不如专用的生产 HTTP 服务器(Nginx、Apache 等)。
Flaskdocuments如何部署的各种方式。许多托管服务提供商也有关于部署 Python 或 Flask 的文档。
【解决方案2】:
首先创建应用程序:
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 请求。
【解决方案3】:
你肯定需要像 Gunicorn 这样的生产 WSGI 服务器,因为 Flask 的开发服务器是为了便于开发而没有太多的微调和优化配置。
例如。 Gunicorn 有一个variety of configurations,具体取决于您要解决的用例。但是开发烧瓶服务器没有这些能力。此外,一旦您尝试扩展和处理更多请求,这些开发服务器就会显示出它们的局限性。
关于是否需要像 Nginx 这样的反向代理服务器,这取决于您的用例。
如果您将应用程序部署在 AWS 中最新的负载均衡器之后,例如 application load balancer(不是经典负载均衡器),那么它本身就足以满足大多数用例。如果您有该选项,则无需费力设置 NGINX。
反向代理的目的是处理慢速客户端,即需要时间来发送请求的客户端。这些反向负载均衡器缓冲请求,直到从客户端获得整个请求并将它们异步发送到 Gunicorn。这大大提高了您的应用程序的性能。