Skip to content

Flask - 部署

在开发过程中,Flask 内置的服务器(flask run 或 app.run())对于测试和调试来说非常方便。但是,它不适合用于生产环境。默认情况下,它是单线程的(除非另行配置,否则一次只能处理一个请求),并且缺乏专用生产服务器所需的鲁棒性、安全性和性能特性。

让开发服务器可外部访问(谨慎使用!)

Section titled “让开发服务器可外部访问(谨慎使用!)”

默认情况下,开发服务器只能在本地机器 (localhost/127.0.0.1) 上访问。要使其可以在本地网络的其他设备上访问(例如,用于在移动设备上进行测试),您可以让它监听所有公共 IP 地址:

# 在 app.run() 调用中:
app.run(host='0.0.0.0')
# 或者使用 Flask CLI:
flask run --host=0.0.0.0

警告: 仅在受信任的网络上执行此操作,并且在外部可访问时切勿在启用 debug=True 的情况下运行开发服务器。调试模式允许任意代码执行,这是一个重大的安全风险。

要为实际用户部署您的 Flask 应用程序,您需要一个生产就绪的设置。这通常涉及一个 WSGI 服务器,并且经常还需要一个反向代理。

WSGI (Web Server Gateway Interface) 是 Python Web 应用程序/框架(如 Flask)与 Web 服务器之间的标准接口。您需要一个生产级的 WSGI 服务器来高效可靠地运行您的 Flask 应用。流行的选择包括:

  • Gunicorn: (Green Unicorn) 一个广泛使用、简单且健壮的纯 Python WSGI HTTP 服务器。易于配置和管理。
  • uWSGI: 一个功能丰富、高性能的应用服务器。它支持多种协议(包括 WSGI),并提供广泛的配置选项,但可能比 Gunicorn 更复杂。

这些服务器可以处理多个工作进程/线程,高效管理请求,并比开发服务器提供更好的性能和稳定性。

虽然 WSGI 服务器负责运行您的 Python 代码,但标准的做法是在 WSGI 服务器前面放置一个反向代理服务器,例如 Nginx 或 Apache (使用 mod_proxy)。反向代理处理来自互联网的传入请求,并将其转发给 WSGI 服务器。它提供了以下几项优势:

  • 负载均衡: 将请求分配到 WSGI 应用程序的多个实例上。
  • 服务静态文件: 直接高效地提供静态资源 (CSS、JavaScript、图片),从而解放您的 Flask 应用。
  • SSL/TLS 终结: 处理 HTTPS 加密/解密。
  • 缓冲: 管理慢速客户端而不会阻塞您的应用工作进程。
  • 安全性: 提供额外的保护层(例如,速率限制、阻止恶意请求)。
  • 压缩: 压缩响应(例如,使用 gzip)。

常见的技术栈:Nginx + Gunicorn/uWSGI

Section titled “常见的技术栈:Nginx + Gunicorn/uWSGI”

典型的生产环境设置是 Nginx 接收请求,直接服务静态文件,并将动态请求转发给 Gunicorn 或 uWSGI,后者运行您的 Flask 应用程序的多个实例(工作进程)。

PaaS 提供商提供一个托管环境,您可以在其中部署代码,平台负责处理底层基础设施(服务器、扩缩容、负载均衡、数据库)。这极大地简化了部署,特别是对于小型应用程序或没有专门运维人员的团队。

流行的 Python/Flask PaaS 选项包括:

  • Heroku
  • Render
  • PythonAnywhere
  • Google App Engine
  • AWS Elastic Beanstalk
  • Microsoft Azure App Service

大多数 PaaS 提供商都有针对部署 Flask 应用程序的特定文档和命令行工具。它们通常依赖于 Procfile 文件(用于定义您的 WSGI 服务器等进程)和 requirements.txt 文件(用于列出依赖项)。

使用 Docker 将您的 Flask 应用程序容器化是另一种流行的部署方法。您可以将您的应用程序、其依赖项以及 WSGI 服务器(如 Gunicorn)打包到一个容器镜像中。然后,这个镜像可以在不同的环境(开发、预发布、生产)中一致地运行,并部署到各种平台,包括云提供商(如 AWS ECS、Google Kubernetes Engine)或您自己的服务器上。

一些部署方法(尽管现在随着 Gunicorn/uWSGI 命令行使用而变得不太常见)可能需要一个 .wsgi 文件。这个文件只是提供一个名为 application 的可调用对象,WSGI 服务器可以使用它来与您的 Flask 应用进行交互。

myapp.wsgi
import sys
# 如果需要,将您的项目目录添加到 Python 路径
# sys.path.insert(0, '/path/to/your/project')
# 假设您的 Flask 应用对象在 'yourapplication.py' 中命名为 'app'
from yourapplication import app as application

部署是一个广泛的主题,有许多变体,取决于您的具体需求(规模、预算、团队专业知识)。关键的要点是永远不要将 Flask 开发服务器用于生产环境。选择一个健壮的 WSGI 服务器(如 Gunicorn 或 uWSGI),最好是在反向代理(如 Nginx)后面,或者利用 PaaS 或基于容器的解决方案。

有关详细的配置说明,请参阅 Flask 官方部署文档以及您选择的 WSGI 服务器、反向代理或 PaaS 提供商的文档。