Flask 自带开发服务器和生产环境 Gunicorn 部署有什么区别

文章导读
Flask 自带服务器仅限本地调试,生产环境必须使用 Gunicorn 等 WSGI 服务器。自带服务器单进程单线程,无法处理并发且存在安全风险,直接暴露公网可能导致服务崩溃。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Flask 自带服务器仅限本地调试,生产环境必须使用 Gunicorn 等 WSGI 服务器。自带服务器单进程单线程,无法处理并发且存在安全风险,直接暴露公网可能导致服务崩溃。

先说结论:Flask 开发服务器设计初衷为调试,生产环境需切换至 Gunicorn 以支持多进程并发和稳定性。

  • 适合:本地开发调试、功能验证、小团队内部试用
  • 重点看:并发模型差异(单线程 vs 多 Worker 预 fork 模型)
  • 别忽略:生产环境必须关闭 DEBUG 模式并配置进程守护工具

命令速用版

安装 Gunicorn 并启动应用,假设应用实例为 app.py 中的 app 对象:

pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app

参数说明:-w 指定 worker 进程数,-b 绑定地址和端口,app:app 分别为模块名和应用实例名。

为什么会这样

Flask 自带服务器基于 Werkzeug 库实现,设计目标是提供快速开发反馈而非处理生产流量。开发服务器采用单进程单线程模型,同一时间只能处理一个请求,缺乏连接池和异步处理机制。Gunicorn 采用预 fork 模型,主进程管理多个 worker 进程,每个 worker 独立处理请求,当某个 worker 崩溃时主进程会自动重启它,确保服务持续可用。

分步处理

1. 安装依赖

在生产服务器或虚拟环境中安装 Gunicorn,注意 Gunicorn 不支持 Windows 平台,Windows 开发建议使用 WSL 或直接在 Linux 服务器部署。

pip install gunicorn

2. 基础启动

Flask 自带开发服务器和生产环境 Gunicorn 部署有什么区别

使用默认配置启动,验证应用是否能通过 WSGI 服务器运行。

gunicorn app:app

3. 生产配置

指定 worker 数量和绑定地址,通常 worker 数设置为 CPU 核心数的 2-4 倍,绑定 0.0.0.0 允许外部访问。

gunicorn -w 4 -b 0.0.0.0:8000 app:app

4. 进程守护(可选但推荐)

使用 Supervisor 或 Systemd 管理 Gunicorn 进程,确保意外退出后自动重启。Supervisor 配置示例如下:

[program:flask_app]
command=/path/to/venv/bin/gunicorn `--workers` 3 `--bind` 0.0.0.0:8000 app:app
directory=/path/to/yourapp
autostart=true
autorestart=true

怎么验证是否生效

1. 检查进程状态

使用 ps 命令查看是否存在多个 gunicorn worker 进程,确认多进程模型已启动。

Flask 自带开发服务器和生产环境 Gunicorn 部署有什么区别
ps -ef | grep gunicorn

2. 查看日志输出

观察启动日志,确认 master 进程和 worker 进程均已就绪,无报错信息。

tail -f /var/log/gunicorn.log

3. 并发测试

使用压力测试工具发送并发请求,观察响应时间和错误率,生产服务器应能稳定处理并发请求而不出现超时。

常见坑

1. Windows 兼容性问题

Gunicorn 不支持 Windows 原生环境,强行运行会报错。Windows 用户建议使用 WSL 子系统或选择 waitress 等兼容服务器。

Flask 自带开发服务器和生产环境 Gunicorn 部署有什么区别

2. 调试模式未关闭

生产环境必须设置 DEBUG=False,否则泄露敏感信息且性能严重下降。Flask 自带服务器警告提示不可忽略。

3. Worker 数量设置不当

Worker 数过多会导致上下文切换开销增加,过少则无法利用多核 CPU。需根据服务器核心数和应用 IO 密集程度调整。

常见问题

Gunicorn 能在 Windows 上运行吗?

不能,Gunicorn 依赖 Unix 系统特性,Windows 下建议使用 WSL 或 waitress。

Worker 数量怎么计算最合适?

通常建议为 CPU 核心数的 2-4 倍,具体需根据应用是 CPU 密集还是 IO 密集进行压测调整。

开发服务器开启 threaded=True 能用于生产吗?

不建议,虽然能缓解部分并发问题,但缺乏进程管理和监控功能,稳定性无法满足生产要求。

参考来源

  • Flask 笔记十四:用 Gunicorn 部署 Flask 应用
  • 别再只用 Flask 自带的服务器了:手把手教你用 Gunicorn 部署 Python Web 应用
  • Flask 开发服务器警告别忽视!5 分钟教你用 Gunicorn 部署生产环境
  • Python 之 Flask 项目部署 (Linux)-Gunicorn + Supervisor 与 Gunicorn + Systemd 部署