【问题标题】:Are a WSGI server and HTTP server required to serve a Flask app?是否需要 WSGI 服务器和 HTTP 服务器来为 Flask 应用提供服务?
【发布时间】:2023-02-14 05:02:54
【问题描述】:
使用 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,无论应用程序在何处可用。
答案与“我应该使用 Web 服务器”类似。 WSGI 服务器碰巧有 HTTP 服务器,但它们不如专用的生产 HTTP 服务器(Nginx、Apache 等)好。
Flask documents 如何以各种方式部署。许多托管服务提供商也有关于部署 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,具体取决于您要解决的用例。但是开发flask server没有这些能力。此外,一旦您尝试扩展和处理更多请求,这些开发服务器就会显示出它们的局限性。
关于需要像 Nginx 这样的反向代理服务器,这取决于您的用例。
如果您将应用程序部署在 AWS 中最新的负载均衡器之后,例如application load balancer(不是经典负载均衡器),它本身就足以满足大多数用例。如果您有该选项,则无需努力设置 NGINX。
反向代理的目的是处理慢速客户端,即需要时间发送请求的客户端。这些反向负载均衡器缓冲请求,直到从客户端获得整个请求并将它们异步发送到 Gunicorn。这大大提高了应用程序的性能。