在 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方案的资料请关注代码网其它相关文章!
发表评论