IIS 7/8/9上部署 Python Flask Web
在 IIS(Internet Information Services)上部署 Python Flask Web 应用,通常需要借助 wfastcgi 模块来实现。wfastcgi 是微软提供的一个 FastCGI 处理器,用于在 IIS 上运行 Python Web 应用。以下是详细的部署步骤:
一、前提条件
操作系统:Windows Server 或 Windows 桌面版(如 Windows 10/11)。
已安装 IIS:
打开“控制面板” > “程序” > “启用或关闭 Windows 功能”。
勾选“Internet Information Services”,确保以下组件被选中:
Web 管理工具
CGI(非常重要)
已安装 Python:
推荐使用 Python 3.7 及以上版本。
安装时勾选“Add Python to PATH”。
确认 Python 已正确安装,可以在命令行运行 python --version 或 py --version。
已创建 Flask 应用:
假设你的 Flask 应用位于 C:\FlaskApp 目录下,结构如下:
C:\FlaskApp
├── app.py
├── web.config
└── (其他必要的文件和文件夹,如 static、templates 等)
二、安装 wfastcgi
以管理员身份打开命令提示符(CMD)或 PowerShell。
安装 wfastcgi 模块:
pip install wfastcgi -i https://mirrors.aliyun.com/pypi/simple/
启用 wfastcgi:
找到python程序包wfastcgi所在目录,我的目录在:D:\Program Files\Python313\Scripts,在当前目录执行 cmd命令,
wfastcgi-enable
执行该命令后,会输出类似如下的信息:
ERROR ( message:新 application 对象缺少必需的属性。在组合的密钥属性“fullPath, arguments”分别设置为“"D:\Program Files\Python313\python.exe", "D:\Program Files\Python313\Lib\site-packages\wfastcgi.py"”时,无法添加类型为“application”的重复集合项
。 )
An error occurred running the command:
['C:\\Windows\\system32\\inetsrv\\appcmd.exe', 'set', 'config', '/section:system.webServer/fastCGI', '/+[fullPath=\'"D:\\Program Files\\Python313\\python.exe"\', arguments=\'"D:\\Program Files\\Python313\\Lib\\site-packages\\wfastcgi.py"\', signalBeforeTerminateSeconds=\'30\']']
Ensure your user has sufficient privileges and try again.
需要先执行,wfastcgi-disable,再执行wfastcgi-enable,执行完成后,正确的输出消息如下:
已经在配置提交路径“MACHINE/WEBROOT/APPHOST”向“MACHINE/WEBROOT/APPHOST”的“system.webServer/fastCgi”节应用了配置更改
""D:\Program Files\Python313\python.exe"|"D:\Program Files\Python313\Lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor
记录下 Executable 的路径,稍后在配置 web.config 时会用到。当前路径为"D:\Program Files\Python313\python.exe"|"D:\Program Files\Python313\Lib\site-packages\wfastcgi.py",由于路径中有空格,
所以都增加了双引号
三、配置 Flask 应用
使用visual studio 2022创建项目 空白Flask Web项目,你的 Flask 应用主文件为 app.py,部署拷贝到C:\FlaskApp,需要安装Flask,jsonify,内容示例如下:
pip install jsonify -i https://mirrors.aliyun.com/pypi/simple/
# C:\FlaskApp\app.py
from flask import Flask,jsonify
app.config.from_object(__name__)
app.config["JSON_AS_ASCII"] = False
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Flask on IIS!"
@app.route('/api/GetData', methods=['GET'])
def get_data():
#return jsonify({"message": "你好!这是一个python接口api"})
return "你好!这是一个python接口api !"
if __name__ == '__main__':
app.run()
四、部署网站
打开 IIS 管理器:
按 Win + R,输入 inetmgr,回车。
添加一个新的站点:
在左侧“连接”树中,右键点击“站点”,选择“添加网站”。
配置如下:
站点名称:例如 FlaskApp
物理路径:C:\FlaskApp
绑定:
类型:http 或 https(根据需求)
IP 地址:全部未分配 或指定 IP
端口:例如 8080或其他未被占用的端口
主机名:可留空或填写域名(如果配置了 DNS)
配置应用程序池:
在左侧“连接”树中,展开“应用程序池”。
找到你刚刚创建的站点所使用的应用程序池(如 FlaskApp),右键选择“高级设置”。
将“.NET CLR 版本”设置为“无托管代码”。
将“托管管道模式”设置为“经典”或“集成”。推荐使用“集成”模式。
设置文件夹的权限,增加everone,iis User,iUser的权限完全控制
五、创建并配置 web.config
打开IIS,找到创建的站点,点击处理程序映射,点击添加模块映射,请求录入输入* ,模块选择FastCgiModule,可执行文件为
D:\Program Files\Python313\python.exe|"D:\Program Files\Python313\Lib\site-packages\wfastcgi.py",需要有双引号。详细配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Flask_Web_CGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="D:\Program Files\Python313\python.exe|"D:\Program Files\Python313\Lib\site-packages\wfastcgi.py"" resourceType="Unspecified" />
</handlers>
</system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="app.app" />
<add key="PYTHONPATH" value="D:\WWWRoot\FlaskWebPrj" />
<add key="WSGI_LOG" value="D:\WWWRoot\FlaskWebPrj\LogFiles\wfastcgi.log" />
</appSettings>
</configuration>
重要:请根据你的实际环境修改以下路径:
scriptProcessor 和 fullPath、arguments 中的 Python 路径(如 C:\Python39\python.exe)应与你的 Python 安装路径一致。
WSGI_HANDLER 的值应为你的 Flask 应用实例的路径。如果你的 Flask 应用实例在 app.py 中名为 app,则值为 app.app。如果实例名称不同,请相应修改。
示例解释:
scriptProcessor:指定 Python 解释器和 wfastcgi.py 的路径,用于处理 FastCGI 请求。
WSGI_HANDLER:告诉 wfastcgi 如何找到你的 Flask 应用实例。
七、测试部署
在浏览器中访问你的站点:
如果使用 http 绑定且端口为 8080,在浏览器输入 http://你的服务器IP或域名:8080。
应该看到 Flask 应用返回的 "Hello, Flask on IIS!" 页面。
如果遇到问题:
检查 IIS 日志:位于 D:\WWWRoot\FlaskWebPrj\LogFiles\wfastcgi.log,查看是否有相关错误信息。
启用详细错误信息:在 IIS 管理器中,选择站点,双击“错误页”,选择“详细错误”。
检查 Python 和 wfastcgi 是否正确安装:确保 wfastcgi-enable 成功,并且路径配置正确。
权限问题:确保 IIS 用户(如 IIS_IUSRS)对 C:\FlaskApp 目录有读取权限。
八、其他建议
虚拟环境:推荐在部署时使用 Python 虚拟环境(venv),以隔离依赖包。配置 web.config 时,需要指向虚拟环境中的 Python 解释器和 wfastcgi.py。 示例:
<handlers>
<add name="PythonHandler"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="C:\FlaskApp\venv\Scripts\python.exe|C:\FlaskApp\venv\Lib\site-packages\wfastcgi.py"
resourceType="Unspecified" />
</handlers>
<fastCgi>
<application fullPath="C:\FlaskApp\venv\Scripts\python.exe"
arguments="C:\FlaskApp\venv\Lib\site-packages\wfastcgi.py" />
</fastCgi>
<environmentVariables>
<environmentVariable name="PYTHONPATH" value="C:\FlaskApp" />
<environmentVariable name="WSGI_HANDLER" value="app.app" />
</environmentVariables>
部署多个 Flask 应用:如果需要在同一 IIS 服务器上部署多个 Flask 应用,需要为每个应用配置独立的应用程序池和站点,确保路径和配置不冲突。
安全性:确保 IIS 和 Flask 应用的安全配置,如使用 HTTPS、限制访问权限、防止常见的 Web 攻击等。
通过以上步骤,你应该能够成功在 IIS 上部署 Python Flask Web 应用。如果在部署过程中遇到具体问题,可以参考错误日志,或提供详细错误信息以进一步诊断。