用 wfastcgi + iis 是 windows 部署 flask 最稳方案,但必须手动配对 fullpath 与 arguments;wfastcgi-enable 在 powershell 5.1 或中文路径下易失效,应改用 appcmd.exe 手动注册,并正确配置 pythonpath、wsgi_handler、禁用应用池回收及关闭请求限制勾选。

直接上结论:用 wfastcgi + IIS 是 Windows 上部署 Flask 最稳的路,但必须手动配对 fullPath 和 arguments,否则 500 或 502 会反复出现;wfastcgi-enable 命令在 PowerShell 5.1 或中文路径下大概率失效,别依赖它自动生成配置。
为什么不能只靠 wfastcgi-enable
这个命令本质是调用 appcmd.exe 修改 %windir%\System32\inetsrv\config\applicationHost.config,但它在以下场景会卡死或静默失败:
- PowerShell 5.1 中执行含中文路径的参数(比如
D:\项目\flask-app)会丢字,导致注册的arguments指向错误位置 - 目标 Python 解释器被杀毒软件拦截(常见于企业环境),进程无响应但不报错
- IIS 正在运行且有其他 FastCGI 条目冲突,
wfastcgi-enable不做冲突检测,直接写入失败
实操建议:跳过该命令,全程用 appcmd.exe 手动注册。例如:
appcmd set config -section:system.webServer/fastCgi "/+[fullPath='D:\Programs\Python\Python311\python.exe',arguments='D:\Programs\Python\Python311\Lib\site-packages\wfastcgi.py',signalBeforeTerminateSeconds='30']" /commit:apphost
注意:fullPath 必须是解释器绝对路径,arguments 必须是 wfastcgi.py 绝对路径,中间用空格分隔 —— 不是竖线 |,也不是引号包裹的字符串。
web.config 里最常漏掉的两个环境变量
IIS 不会自动把你的 Flask 应用和 wfastcgi 关联起来,必须显式告诉它“从哪找代码、哪个变量是 WSGI 实例”。缺一不可:
-
PYTHONPATH:值为 Flask 项目根目录(比如D:\inetpub\wwwroot\flask-app),不是venv路径,也不是app.py所在目录 -
WSGI_HANDLER:值为app.app或myapp:app这类模块名加实例名,取决于你主文件怎么写的 —— 如果是app.py里app = Flask(__name__),就填app.app
这两个变量要写进 IIS 的「FastCGI 设置」界面(不是 web.config),双击对应条目 → 「环境变量」→ 点「添加」。填错会导致 500 错误,日志里只显示“Handler was unable to return a response”,没别的线索。
处理程序映射必须关掉“请求限制”勾选
在 IIS 管理器中进入网站 → 「处理程序映射」→ 添加模块映射时,最后一步弹出「请求限制」对话框,里面有个默认勾选的选项:
仅当请求映射至以下内容时才调用处理程序
这个勾必须取消。否则 IIS 只会把 / 或 /index.html 这类明确路径交给 wfastcgi,而 Flask 的 /api/status、/static/xxx.js 全部 404。原因在于 Flask 是单入口路由,所有请求都该由它统一分发。
同时,「请求路径」填 *,「模块」选 FastCgiModule,「可执行文件」粘贴的是 fullPath 和 arguments 拼起来的完整字符串(带空格,不带引号),例如:
D:\Programs\Python\Python311\python.exe D:\Programs\Python\Python311\Lib\site-packages\wfastcgi.py
内存状态常驻应用必须禁用 IIS 应用程序池回收
如果你的 Flask 应用像采集控制台一样,靠全局变量或后台线程维持状态(比如轮询进度、缓存 token),那么 IIS 默认每 29 小时回收一次应用程序池的行为会直接清空所有内存数据。
进 IIS 管理器 → 左侧「应用程序池」→ 找到你网站对应池 → 「高级设置」→ 把这几项全设为 0:
-
常规 → 启动模式:改为AlwaysRunning -
回收 → 固定时间间隔(分钟):设为0 -
回收 → 虚拟内存限制(KB):设为0 -
进程模型 → 空闲超时(分钟):设为0
做完后务必右键重启该应用程序池,光改配置不重启无效。这是最容易被忽略的一环 —— 日志里看不到报错,但用户刷着刷着发现状态重置了,就是它在作怪。











