在Windows环境下部署Flask的完整方案
作者:冉成未来
在 Windows 生产环境中部署 Flask 应用,你需要使用 Windows 兼容的 WSGI 服务器(如 Waitress、Hypercorn)以及 Windows 服务管理工具(如 NSSM 或直接使用 Python 的 win32service)。本文将为你提供一套完整的 Windows 系统 Flask 部署方案,并对比与 Linux 方式的异同。
Windows 部署 Flask 的完整方案
核心组件替换说明
| Linux 组件 | Windows 替代方案 | 说明 |
|---|---|---|
| Gunicorn | Waitress 或 Hypercorn | Waitress 是纯 Python WSGI 服务器,原生支持 Windows,性能稳定 |
| Supervisor / Systemd | NSSM(Non-Sucking Service Manager)或 Windows 任务计划程序 | NSSM 可将任何 exe 包装成 Windows 服务,支持自启、崩溃重启 |
| 日志管理 | Python logging 模块 + 文件轮转(RotatingFileHandler) | Windows 没有内置的 journald,建议在应用内配置日志 |
注意:Hypercorn 支持 HTTP/2 和 ASGI,但配置稍复杂;Waitress 简单稳定,是 Flask 官方推荐的生产服务器之一。
一、使用 Waitress + NSSM 部署 Flask(推荐)
1. 环境准备
- Windows Server 2016+ 或 Windows 10/11(专业版/企业版)
- Python 3.8+ 已安装并加入 PATH
- 你的 Flask 项目(例如
C:\myapp\app.py)
2. 安装依赖
在项目目录创建虚拟环境(强烈推荐):
cd C:\myapp python -m venv venv venv\Scripts\activate pip install flask waitress
3. 创建启动脚本
由于 NSSM 需要执行一个 .bat 或 .exe,我们编写一个 Python 启动脚本 run.py,它使用 Waitress 运行 Flask 应用:
# run.py
from waitress import serve
from app import app # 假设你的 Flask 实例名为 app
if __name__ == '__main__':
# 监听所有IP的8080端口,生产环境建议绑定内网IP并通过反向代理(如 Nginx)暴露
serve(app, host='0.0.0.0', port=8080, threads=4)测试脚本是否能正常运行:
python run.py
访问 http://localhost:8080 看到 Flask 输出即为成功。
4. 使用 NSSM 注册为 Windows 服务
下载 NSSM(官网),将 nssm.exe 放在 C:\Windows\System32 或项目目录下。
以管理员身份打开命令提示符,执行:
nssm install FlaskApp
弹出 GUI 配置界面:
- Path:
C:\myapp\venv\Scripts\python.exe - Startup directory:
C:\myapp - Arguments:
run.py - Service name:
FlaskApp(可自定义)
点击 “Install service”。
然后启动服务:
nssm start FlaskApp
检查状态:
nssm status FlaskApp
5. 设置服务开机自启
NSSM 安装的服务默认就是“自动”启动类型,可以在 Windows 服务管理器(services.msc)中确认。
6. 查看日志与崩溃自动重启
NSSM 默认会将 stdout/stderr 重定向到文件。在 NSSM GUI 的 “I/O” 选项卡中可以设置日志文件路径:
- Output (stdout):
C:\myapp\logs\service-out.log - Error (stderr):
C:\myapp\logs\service-err.log
并勾选 “Redirect error output to stdout” 简化。
在 “Process” 选项卡中:
- Exit action:
Restart(进程意外退出时自动重启) - Restart delay:
5000(毫秒)
7. 常用 NSSM 命令
nssm restart FlaskApp # 重启服务 nssm stop FlaskApp # 停止 nssm remove FlaskApp # 删除服务(需加 confirm 参数)
二、使用 Waitress + 任务计划程序(无第三方工具)
如果不想安装 NSSM,可以用 Windows 任务计划程序创建一个“不管用户是否登录都运行”的任务,并设置触发器为“启动时”,以及“如果失败则重启”。缺点是配置较繁琐,且重启策略不如 NSSM 灵活。
步骤简述:
创建启动脚本 start.bat:
@echo off cd C:\myapp call venv\Scripts\activate python run.py
打开“任务计划程序” → “创建任务”:
- 常规:勾选“不管用户是否登录都运行”,使用最高权限。
- 触发器:新建“启动时”。
- 操作:启动程序
cmd.exe,参数/c "C:\myapp\start.bat"。 - 条件:取消所有“只有在以下网络连接可用时才启动”等选项。
- 设置:勾选“如果任务失败,按以下频率重启”,例如每5分钟重启一次,最多3次。
这种方法不推荐用于生产环境,因为进程管理能力弱,无优雅停止。
三、Windows 部署的注意事项
1. 反向代理
Windows 下同样建议在 Waitress 前面加一层 Nginx for Windows 或 IIS 做反向代理,用于:
- 提供静态文件服务(Waitress 不擅长)
- 负载均衡
- HTTPS 卸载
Nginx for Windows 配置与 Linux 类似,下载官方 Windows 版本即可。
2. 日志轮转
在 run.py 中配置 Python logging 的 RotatingFileHandler:
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5)
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)3. 性能调优
- Waitress 的
threads参数建议设置为 CPU 核心数的 2-4 倍。 - 如果遇到高并发,可以增加
asyncore或使用Hypercorn配合uvloop(但 Windows 上 uvloop 不可用,性能不如 Linux)。
4. 防火墙与端口
确保 Windows 防火墙允许外部访问你的端口(例如 8080):
netsh advfirewall firewall add rule name="Flask App" dir=in action=allow protocol=TCP localport=8080
四、修改代码后如何重新部署
使用 NSSM
由于 NSSM 只是管理进程,修改代码后需要重启服务才能加载新代码:
nssm restart FlaskApp
注意:restart 会立即杀死当前进程,可能导致正在处理的请求失败。要实现优雅重启,Waitress 本身不支持热重载,你可以在代码中使用 watchdog 库监听文件变化并触发 sys.exit(),配合 NSSM 的自动重启策略,但较为复杂。更简单的做法是:在低流量时段重启,或使用负载均衡摘除节点。
使用任务计划程序
手动停止任务(在任务计划程序库中右键结束),然后重新启动任务。
五、与 Linux 部署方式的异同总结
| 方面 | Linux (Gunicorn+Systemd) | Windows (Waitress+NSSM) |
|---|---|---|
| WSGI 服务器 | Gunicorn(多进程) | Waitress(多线程) |
| 进程管理 | Systemd(原生,功能强大) | NSSM(第三方,稳定) |
| 性能 | 高(多进程 + 预派生) | 中(Python 多线程受 GIL 限制) |
| 优雅重启 | 支持(kill -HUP) | 不支持(需手动重启或变通) |
| 日志管理 | journald / syslog | 需应用自行配置文件轮转 |
| 开机自启 | systemctl enable | NSSM 服务默认自启 |
| 资源隔离 | cgroup / namespace | 无(依赖 Windows 进程隔离) |
| 部署复杂性 | 中等(需理解 systemd unit) | 低(NSSM GUI 配置简单) |
结论:
- 如果生产环境是 Windows Server,使用 Waitress + NSSM 是最稳定、最接近 Linux 体验的方案。
- 如果追求更高性能,建议将应用容器化(Docker for Windows)或直接迁移到 Linux 服务器。
- 不推荐 使用
flask run或内置服务器用于生产,无论何种平台。
六、完整示例脚本
为了方便,提供一个完整的 run.py 示例,包含日志配置和 Waitress 启动:
import logging
from logging.handlers import RotatingFileHandler
from waitress import serve
from app import app
# 配置日志
if not app.debug:
handler = RotatingFileHandler('logs/app.log', maxBytes=10*1024*1024, backupCount=5)
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)
app.logger.info('Flask app starting')
if __name__ == '__main__':
serve(app, host='0.0.0.0', port=8080, threads=4)记得创建 logs 文件夹。
希望这份 Windows 部署教程能帮助你顺利完成 Flask 项目的生产环境部署。如果你的环境可以换成 Linux,强烈建议使用 Linux 以获得更成熟、高性能的工具链。
以上就是在Windows环境下部署Flask的完整方案的详细内容,更多关于Windows部署Flask方案的资料请关注脚本之家其它相关文章!
