一.部署环境准备

1.操作系统和IIS版本

操作系统的版本是Windows Server 2012R2,IIS版本为8.5.9600.16384:

如何通过IIS部署Flask项目_python



2.CGI和ISAPI安装

通过服务器管理器添加角色和功能,主要是安装CGI、ISAPI扩展、ISAPI筛选器:


如何通过IIS部署Flask项目_Server_02




二.IIS部署Flask项目

这里的Flask项目特指通过Flask框架封装的REST API后端接口的单个文件。

1.安装和启用wfastcgi模块

安装、启用和禁用wfastcgi命令如下所示:

pip install wfastcgi #安装

wfastcgi-enable #启用

wfastcgi-disable #禁用



通过命令wfastcgi-enable启用后输出结果如下:


如何通过IIS部署Flask项目_IIS_03




2.添加和绑定网站

添加和编辑网站如下所示:


如何通过IIS部署Flask项目_python_04





添加和编辑网站绑定如下所示:

如何通过IIS部署Flask项目_Server_05




3.添加模块映射

首先选中要配置的Flask项目,然后点击处理程序映射,添加模块映射:


如何通过IIS部署Flask项目_python_06





(1)请求路径:*
(2)模块:FastCgiModule
(3)可执行文件:执行命令wfastcgi-enable的输出
(4)名称:自定义填写
说明:填写完毕后,在弹出的对话框中选择是。


4.请求限制

取消"仅当请求映射至以下内容时才调用处理程序'前面的对号:


如何通过IIS部署Flask项目_IIS_07




5.FastCGI设置

首先选中服务器,然后点击FastCGI设置:


如何通过IIS部署Flask项目_Server_08





对环境变量PYTHONPATH和WSGI_HANDLER的设置:

如何通过IIS部署Flask项目_IIS_09





其中,PYTHONPATH表示Flask项目的根目录,WSGI_HANDLER表示文件名.app。



6.项目配置

主要是Flask项目根目录下面的web.config文件:


<?xml versinotallow="1.0" encoding="UTF-8"?>
<configuration>
 <system.webServer>
 <handlers>
 <add name="XXX" path="*" verb="*" modules="FastCgiModule" scriptProcessor="d:\python37\python.exe|d:\python37\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
 </handlers>
 </system.webServer>

 <appSettings>
 <add key="WSGI_HANDLER" value="server_fastapi.app" />
 <add key="PYTHONPATH" value="YYY" />
 <add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
 </appSettings>
</configuration>



wfastcgi官方完整的web.config配置文件[4]如下所示:

<configuration>
 <system.webServer>
 <handlers>
 <add name="Python FastCGI"
 path="*"
 verb="*"
 modules="FastCgiModule"
 scriptProcessor="C:\Python36\python.exe|C:\Python36\Lib\site-packages\wfastcgi.py"
 resourceType="Unspecified"
 requireAccess="Script" />
 </handlers>
 </system.webServer>

 <appSettings>
 <!-- Required settings -->
 <add key="WSGI_HANDLER" value="my_app.wsgi_app()" />
 <add key="PYTHONPATH" value="C:\MyApp" />

 <!-- Optional settings -->
 <add key="WSGI_LOG" value="C:\Logs\my_app.log" />
 <add key="WSGI_RESTART_FILE_REGEX" value=".*((\.py)|(\.config))$" />
 <add key="APPINSIGHTS_INSTRUMENTATIONKEY" value="__instrumentation_key__" />
 <add key="DJANGO_SETTINGS_MODULE" value="my_app.settings" />
 <add key="WSGI_PTVSD_SECRET" value="__secret_code__" />
 <add key="WSGI_PTVSD_ADDRESS" value="ipaddress:port" />
 </appSettings>
</configuration>


说明:重新启动服务器后就可以使用https+域名访问Flask项目接口了。

三.关于TTFB延迟大的问题

1.首次请求TTFB延迟大

通过IIS部署Flask接口后,发现在首次请求API的时候,TTFB延迟大:


如何通过IIS部署Flask项目_IIS_10




再次请求API的时候,响应速度就非常的快了:

如何通过IIS部署Flask项目_IIS_11




2.没有得到解决

主要参考了[5]和其它的相关文章,无论是网站高级设置->预加载已启用,还是配置编辑器,还是应用程序池高级设置(队列长度|启动模式|固定时间间隔|闲置超时)等都做了尝试,但是首次请求API的时候,TTFB延迟大的问题仍然存在。现在的权宜之计是在app启动的时候自动发一次测试请求,这样用户在首次使用的时候不会觉得请求时间过长,毕竟TTFB几十秒的延迟实在是太高了。