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

 更新时间:2026年04月26日 15:31:49   作者:冉成未来  
在 Windows 生产环境中部署 Flask 应用,你需要使用 Windows 兼容的 WSGI 服务器以及 Windows 服务管理工具,本文将为你提供一套完整的 Windows 系统 Flask 部署方案,并对比与 Linux 方式的异同,需要的朋友可以参考下

在 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方案的资料请关注脚本之家其它相关文章!

相关文章

  • python连接字符串的方法小结

    python连接字符串的方法小结

    这篇文章主要介绍了python连接字符串的方法,实例总结了几种常用的Python连接字符串的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • python slack桌面自动化开发工具

    python slack桌面自动化开发工具

    这篇文章主要为大家介绍了python slack桌面自动化开发工具使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 如何利用Tensorflow2进行猫狗分类识别

    如何利用Tensorflow2进行猫狗分类识别

    图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,下面这篇文章主要给大家介绍了关于如何利用Tensorflow2进行猫狗分类识别的相关资料,需要的朋友可以参考下
    2022-06-06
  • OpenCV实现车辆识别和运动目标检测

    OpenCV实现车辆识别和运动目标检测

    本文主要介绍了OpenCV实现车辆识别和运动目标检测,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 详解用Python实现自动化监控远程服务器

    详解用Python实现自动化监控远程服务器

    这篇文章主要介绍了用Python实现自动化监控远程服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Python进程池基本概念

    Python进程池基本概念

    这篇文章主要介绍了Python进程池基本概念,当创建的子进程数量不多时,可以直接利用多处理进程中的进程动态形成需要的进程,下文关于Python线程池的概念做详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • python xlsxwriter创建excel图表的方法

    python xlsxwriter创建excel图表的方法

    这篇文章主要为大家详细介绍了python xlsxwriter创建excel图表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Python在pycharm中使用environment.ylm文件配置虚拟环境的过程

    Python在pycharm中使用environment.ylm文件配置虚拟环境的过程

    environment.yml这个文件主要就是用来保存当前的程序运行环境,可以理解成pythonrequirementstxt的存在更加方便一些,这篇文章主要介绍了Python在pycharm中使用environment.ylm文件配置虚拟环境的过程
    2025-11-11
  • 解决python xx.py文件点击完之后一闪而过的问题

    解决python xx.py文件点击完之后一闪而过的问题

    今天小编就为大家分享一篇解决python xx.py文件点击完之后一闪而过的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python如何爬取网站数据并进行数据可视化

    python如何爬取网站数据并进行数据可视化

    这篇文章主要介绍了python爬取拉勾网数据并进行数据可视化,爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示、直方图展示,需要的朋友可以参考下
    2019-07-07

最新评论