当前位置: 代码网 > 科技>操作系统>Windows > 在Windows环境下部署Flask的完整方案

在Windows环境下部署Flask的完整方案

2026年04月26日 Windows 我要评论
在 windows 生产环境中部署 flask 应用,你需要使用 windows 兼容的 wsgi 服务器(如 waitress、hypercorn)以及 windows 服务管理工具(如 nssm

在 windows 生产环境中部署 flask 应用,你需要使用 windows 兼容的 wsgi 服务器(如 waitresshypercorn)以及 windows 服务管理工具(如 nssm 或直接使用 python 的 win32service)。本文将为你提供一套完整的 windows 系统 flask 部署方案,并对比与 linux 方式的异同。

windows 部署 flask 的完整方案

核心组件替换说明

linux 组件windows 替代方案说明
gunicornwaitresshypercornwaitress 是纯 python wsgi 服务器,原生支持 windows,性能稳定
supervisor / systemdnssm(non-sucking service manager)或 windows 任务计划程序nssm 可将任何 exe 包装成 windows 服务,支持自启、崩溃重启
日志管理python logging 模块 + 文件轮转(rotatingfilehandlerwindows 没有内置的 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 windowsiis 做反向代理,用于:

  • 提供静态文件服务(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 enablenssm 服务默认自启
资源隔离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方案的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com