将 Flask 应用部署到 Windows IIS 服务器上需要使用 WSGI 适配器(如 wfastcgi)将 HTTP 请求从 IIS 传递到 Flask 应用程序。本指南涵盖了完整的部署过程,适用于任何 Flask 应用。
安装 IIS:
安装 URL 重写模块(可选但推荐):
安装 Python:
python --version
为你的应用创建标准化的目录结构:
C:\inetpub\wwwroot\flask-app\ # 应用根目录
├── app\ # Flask 应用代码
│ ├── __init__.py # Flask 应用初始化
│ ├── views\ # 视图函数
│ ├── models\ # 数据模型
│ ├── static\ # 静态文件
│ └── templates\ # 模板文件
├── logs\ # 日志目录
├── venv\ # Python 虚拟环境
├── requirements.txt # 依赖列表
├── wsgi.py # WSGI 入口点
└── web.config # IIS 配置文件
创建应用目录:
mkdir C:\inetpub\wwwroot\flask-app
mkdir C:\inetpub\wwwroot\flask-app\logs
设置 Python 虚拟环境:
cd C:\inetpub\wwwroot\flask-app
python -m venv venv
venv\Scripts\activate
安装项目依赖:
pip install flask
pip install wfastcgi
pip install -r requirements.txt # 如果有项目特定的依赖
创建 WSGI 入口文件:
创建 C:\inetpub\wwwroot\flask-app\wsgi.py
文件:
from app import app as application
if __name__ == '__main__':
application.run()
注意:文件中的导入语句应该匹配你的 Flask 应用结构。例如,如果你的 Flask 应用在 app/__init__.py
中初始化,则使用上面的导入语句。
启用 wfastcgi:
venv\Scripts\activate
wfastcgi-enable
记下输出中显示的路径,形如:
"C:\inetpub\wwwroot\flask-app\venv\Scripts\python.exe|C:\inetpub\wwwroot\flask-app\venv\Lib\site-packages\wfastcgi.py"
创建 web.config 文件:
在应用根目录创建 C:\inetpub\wwwroot\flask-app\web.config
文件:
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="C:\inetpub\wwwroot\flask-app\venv\Scripts\python.exe|C:\inetpub\wwwroot\flask-app\venv\Lib\site-packages\wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script" />
handlers>
<rewrite>
<rules>
<rule name="Static Files" stopProcessing="true">
<match url="^static/.*" />
<action type="None" />
rule>
rules>
rewrite>
system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="wsgi.application" />
<add key="PYTHONPATH" value="C:\inetpub\wwwroot\flask-app" />
<add key="WSGI_LOG" value="C:\inetpub\wwwroot\flask-app\logs\wsgi.log" />
<add key="FLASK_ENV" value="production" />
<add key="FLASK_CONFIG" value="production" />
appSettings>
configuration>
注意:
WSGI_HANDLER
值应匹配你的 WSGI 入口点scriptProcessor
路径应使用从 wfastcgi-enable
命令输出中获取的路径PYTHONPATH
应指向应用根目录打开 IIS 管理器:
创建应用程序池:
FlaskAppPool
无托管代码
集成
配置应用程序池:
False
(如果使用64位 Python)ApplicationPoolIdentity
(或特定服务账户)0
(防止应用池回收)0
(禁用定期回收)部署选项 A - 创建新网站:
Flask Application
C:\inetpub\wwwroot\flask-app
部署选项 B - 作为现有网站的应用程序:
flask-app
C:\inetpub\wwwroot\flask-app
设置应用程序目录权限:
icacls "C:\inetpub\wwwroot\flask-app" /grant "IIS_IUSRS:(OI)(CI)(RX)"
icacls "C:\inetpub\wwwroot\flask-app\logs" /grant "IIS_IUSRS:(OI)(CI)(M)"
如果使用自定义应用程序池标识:
icacls "C:\inetpub\wwwroot\flask-app" /grant "IIS AppPool\FlaskAppPool:(OI)(CI)(RX)"
icacls "C:\inetpub\wwwroot\flask-app\logs" /grant "IIS AppPool\FlaskAppPool:(OI)(CI)(M)"
对需要写入权限的其他目录设置权限(例如上传文件目录):
icacls "C:\inetpub\wwwroot\flask-app\app\uploads" /grant "IIS_IUSRS:(OI)(CI)(M)"
确保 web.config 中包含静态文件规则:
<rewrite>
<rules>
<rule name="Static Files" stopProcessing="true">
<match url="^static/.*" />
<action type="None" />
rule>
rules>
rewrite>
为大型应用创建单独的静态文件目录(可选):
对于需要大量静态文件的应用,可以考虑设置单独的静态文件目录或虚拟目录:
static
C:\inetpub\wwwroot\flask-app\app\static
配置 HTTPS:
强制 HTTPS(使用 URL 重写模块):
在 web.config 中添加以下规则:
<rule name="HTTP to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
rule>
设置安全头:
在 Flask 应用中添加安全头,或在 web.config 中添加:
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="X-XSS-Protection" value="1; mode=block" />
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
customHeaders>
httpProtocol>
配置应用程序池设置:
启用输出缓存:
在 web.config 中添加:
<caching>
<profiles>
<add extension=".html" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
<add extension=".css" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
<add extension=".js" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
profiles>
caching>
配置静态内容压缩:
在 web.config 中启用压缩:
<urlCompression doStaticCompression="true" doDynamicCompression="true" />
Flask 应用级别优化:
症状:浏览器显示 500 - 内部服务器错误
解决方案:
C:\inetpub\wwwroot\flask-app\logs\wsgi.log
)症状:浏览器显示 404 - 未找到
解决方案:
症状:在 wsgi 日志中看到 ImportError 或 ModuleNotFoundError
解决方案:
症状:出现"拒绝访问"或权限相关错误
解决方案:
症状:CSS、JavaScript 或图像文件未正确加载
解决方案:
监控和日志记录:
备份策略:
高可用性(大型应用):
部署自动化:
定期维护:
按照本指南,你应该能够成功地将任何 Flask 应用部署到 Windows IIS 服务器上。记住,每个应用都可能有特定的需求,因此可能需要对某些步骤进行调整。
如果遇到问题,请查看 wsgi 日志文件、IIS 日志(通常在 C:\inetpub\logs\LogFiles
)以及 Windows 事件查看器中的应用程序日志。IIS 与 WSGI 部署 Flask 应用的详细步骤
下面是在 Windows 服务器上使用 IIS 与 WSGI 部署 Flask 应用的详细步骤:
确认安装必要组件
:
确认 IIS 已安装
:
创建应用目录
:
mkdir C:\inetpub\wwwroot\dingtalk-approval
复制应用文件
: 将你的 Flask 应用文件复制到这个目录下。确保包含:
创建虚拟环境
(可选但推荐):
cd C:\inetpub\wwwroot\dingtalk-approval
python -m venv venv
venv\Scripts\activate
安装依赖
:
pip install -r requirements.txt
pip install wfastcgi
激活 wfastcgi
:
venv\Scripts\activate # 如果使用虚拟环境
wfastcgi-enable
记下输出中的 scriptProcessor 路径,形如:
C:\inetpub\wwwroot\dingtalk-approval\venv\Scripts\python.exe|C:\inetpub\wwwroot\dingtalk-approval\venv\Lib\site-packages\wfastcgi.py
创建 web.config 文件
: 在应用根目录创建
web.config
文件,内容如下(注意替换路径):
xml
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="C:\inetpub\wwwroot\dingtalk-approval\venv\Scripts\python.exe|C:\inetpub\wwwroot\dingtalk-approval\venv\Lib\site-packages\wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script" />
handlers>
system.webServer>
<appSettings>
<add key="PYTHONPATH" value="C:\inetpub\wwwroot\dingtalk-approval" />
<add key="WSGI_HANDLER" value="app.app" />
<add key="WSGI_LOG" value="C:\inetpub\wwwroot\dingtalk-approval\logs\wfastcgi.log" />
<add key="FLASK_ENV" value="production" />
appSettings>
configuration>
创建并设置日志目录
:
mkdir C:\inetpub\wwwroot\dingtalk-approval\logs
确保 IIS 应用程序池的用户(通常是 IIS_IUSRS)有此目录的写入权限。
打开 IIS 管理器
:
创建应用程序池
:
DingTalkApprovalPool
无托管代码
集成
设置应用程序池
:
创建网站或应用程序
:
DingTalkApproval
DingTalkApprovalPool
C:\inetpub\wwwroot\dingtalk-approval
80
或 8080
设置目录权限
:
C:\inetpub\wwwroot\dingtalk-approval
目录处理 ApplicationPoolIdentity 权限
: 如果使用 ApplicationPoolIdentity,则添加相应的用户:
IIS AppPool\DingTalkApprovalPool
并赋予"修改"权限
重启 IIS
:
iisreset
访问应用: 在浏览器中访问 http://localhost
或 http://localhost:8080
(根据你配置的端口)
检查错误
: 如果应用不能正常运行:
C:\inetpub\wwwroot\dingtalk-approval\logs\wfastcgi.log
C:\inetpub\logs\LogFiles
)获取 SSL 证书
:
绑定 HTTPS
:
500 内部服务器错误
:
无法启动进程错误
:
模块不存在错误
:
访问拒绝错误
: