是否需要 WSGI 服务器和 HTTP 服务器来为 Flask 应用提供服务?
- 2024-11-22 08:47:00
- admin 原创
- 190
问题描述:
使用 uWSGI 和 Nginx 设置 Flask 可能很困难。我尝试按照DigitalOcean 教程操作,但仍然遇到了问题。即使使用构建脚本也需要时间,而且我需要编写说明以便下次遵循。
如果我预计流量不会很大,或者应用程序是私有的,那么在没有 uWSGI 的情况下运行它是否有意义?Flask 可以监听端口。Nginx 可以转发请求吗?
不使用 Nginx,只在端口上运行裸 Flask 应用程序是否有意义?
解决方案 1:
当您“运行 Flask”时,您实际上是在运行 Werkzeug 的开发 WSGI 服务器,并将您的 Flask 应用程序作为 WSGI 可调用函数传递。
开发服务器不适用于生产环境。它不是特别高效、稳定或安全。它不支持 HTTP 服务器的所有可能功能。
在转移到生产环境时,使用可以用于生产的 WSGI 服务器(例如 Gunicorn 或 uWSGI)替换 Werkzeug 开发服务器,无论应用程序在何处可用。
对于“我应该使用 Web 服务器吗”这个问题,答案是类似的。WSGI 服务器恰好有 HTTP 服务器,但它们不如专用的生产 HTTP 服务器(Nginx、Apache 等)好。
Flask记录了如何以各种方式进行部署。许多托管服务提供商还提供有关部署 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 具有多种配置,具体取决于您要解决的用例。但是开发 Flask 服务器没有这些功能。此外,当您尝试扩展和处理更多请求时,这些开发服务器就会显示出它们的局限性。
至于是否需要 Nginx 之类的反向代理服务器,则取决于您的用例。如果您将应用程序部署在 AWS 中最新的负载均衡器(例如应用程序负载均衡器(而非经典负载均衡器))后面,那么它本身就足以满足大多数用例的需求。如果您有此选项,则无需花费精力设置 NGINX。
反向代理的目的是处理慢速客户端,即需要花费时间发送请求的客户端。这些反向负载平衡器会缓冲请求,直到从客户端获得整个请求,然后将其异步发送到 Gunicorn。这可以大大提高应用程序的性能。
扫码咨询,免费领取项目管理大礼包!