如何在IIS上部署基于Flask/FastAPI开发的Python Web API
如何在IIS上部署基于Flask/FastAPI开发的Python Web API
嘿,我之前刚好帮团队把Flask和FastAPI的API都部署到过内网的IIS服务器,结合你已经完成的前置准备(Python装到PATH、虚拟环境和依赖都弄好、本地测试正常),给你一步步梳理靠谱的操作流程:
一、先搞定IIS的必要组件安装
首先得确保IIS装了能跑Python的相关组件:
- 打开Windows的「控制面板」→「程序和功能」→「启用或关闭Windows功能」
- 找到「Internet Information Services」,展开后勾选以下选项:
- Web管理工具 → IIS管理控制台(必选)
- World Wide Web服务 → 应用程序开发功能 → CGI(必选,用来支持wfastcgi中间件)
- 其他基础的Web服务组件(比如静态内容、HTTP错误这些默认选上就行)
- 点击确定,等待安装完成后重启一下IIS管理器(或者直接重启服务器更稳妥)
二、安装并配置wfastcgi(适配Flask的WSGI模式)
如果是Flask项目,用wfastcgi作为IIS和Python之间的桥梁最直接:
- 激活你之前创建的虚拟环境(比如打开命令行,cd到项目根目录,运行
.\venv\Scripts\activate) - 安装wfastcgi:
pip install wfastcgi - 注册wfastcgi到IIS:运行
wfastcgi-enable,执行成功后会返回类似C:\path\to\venv\Scripts\python.exe|C:\path\to\venv\Lib\site-packages\wfastcgi.py的路径,把这个路径记下来,后面配置web.config要用
三、配置IIS网站(通用步骤,Flask/FastAPI都适用)
- 打开「IIS管理器」,右键左侧的「网站」→「添加网站」
- 填写站点信息:
- 站点名称:随便起(比如MyPythonAPI)
- 物理路径:选择你的API项目根目录(就是放app.py/main.py的文件夹)
- 绑定:IP地址选你内网的服务器IP(或者选「全部未分配」让所有IP都能访问),端口选一个没被占用的(比如8080,避免和默认的80端口冲突)
- 配置应用程序池:
- 右键刚才新建的站点→「管理网站」→「高级设置」,找到「应用程序池」,点击后面的「...」
- 新建一个应用程序池,名称和站点对应(比如MyPythonAPI_Pool),.NET CLR版本选「无托管代码」(因为我们跑的是Python,不需要.NET托管),托管管道模式选「集成」
- 把站点的应用程序池改成刚新建的这个
四、针对不同框架配置核心文件
情况1:Flask项目(WSGI)
在项目根目录新建一个web.config文件,把下面的内容粘贴进去,注意替换掉对应的路径和参数:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <add name="PythonFastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="这里替换成你刚才记的wfastcgi路径" resourceType="Unspecified" requireAccess="Script" /> </handlers> </system.webServer> <appSettings> <!-- Flask的入口配置:第一个app是你的文件名(比如app.py就写app),第二个app是Flask实例名 --> <add key="WSGI_HANDLER" value="app.app" /> <!-- 项目根目录路径 --> <add key="PYTHONPATH" value="你的项目根目录绝对路径" /> <!-- 可选:设置环境变量,比如FLASK_ENV --> <add key="FLASK_ENV" value="production" /> </appSettings> </configuration>
情况2:FastAPI项目(ASGI)
因为FastAPI是ASGI框架,wfastcgi支持不太好,我更推荐用反向代理的方式,操作更简单:
- 先确保你的虚拟环境里装了uvicorn:
pip install uvicorn - 写一个启动脚本(比如start_api.bat),内容是:
(这里的main是你的文件名,app是FastAPI实例名,端口8000可以自己改)@echo off cd /d "你的项目根目录绝对路径" call .\venv\Scripts\activate uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 - 把这个脚本设置成开机自启(可以放到Windows的「启动」文件夹里,或者用任务计划程序设置成后台运行)
- 回到IIS管理器,给刚才新建的站点配置反向代理:
- 先确保装了「URL重写」和「应用程序请求路由(ARR)」组件(如果没装,去IIS的「管理工具」→「Web平台安装程序」里搜索安装)
- 右键站点→「URL重写」→「添加规则」→「反向代理」
- 在「输入要转发的目标」里填
http://localhost:8000,勾选「启用SSL卸载」(如果不需要HTTPS可以忽略),点击确定 - 这样IIS就会把所有收到的请求转发到本地运行的uvicorn服务上
五、最后搞定权限和测试
- 权限设置:右键你的项目根目录→「属性」→「安全」→「编辑」→「添加」,搜索并添加
IIS_IUSRS和IUSR用户,给他们「读取和执行」「列出文件夹内容」「读取」的权限 - 测试:重启IIS站点(右键站点→「管理网站」→「重启」),然后在同一内网的其他电脑上访问
http://服务器内网IP:你设置的端口,比如http://192.168.1.100:8080,测试API的接口是否正常响应 - 常见坑:如果遇到500错误,去IIS的「错误页」里开启详细错误信息,或者查看项目根目录下的日志;如果是虚拟环境路径有空格,记得在web.config里给路径加双引号;确保Python的PATH在IIS的环境变量里能读到(可以在应用程序池的「高级设置」里添加环境变量)
备注:内容来源于stack exchange,提问作者Praveen Kumar




