高级概述
HTTP -> IIS -> ISAPI -> FastCGI -> WSGI(Flask 应用程序)
设置步骤
第 1 步:安装所需的二进制文件
- 安装 Python(2.7 或 3.x -- 我用的是 3.3)
- 安装pip-Win(我用的是1.6版)
- 安装pywin32(我用的是218版)
- 使用fcgisetup 1.5 安装 IIS FastCGI 扩展
第 2 步:安装可选的二进制包
我使用来自this site 的安装程序.exe 安装了pyodbc。从源代码安装(例如 pip,用于安装到虚拟环境中)需要 C/C++ 编译器。
第 3 步:获取wfastcgi.py 的副本
选择适合您的版本,最好是支持 Python 3.3 的版本(我使用了David Ebbo's)。您可能想要“官方”版本from here。
将wfastcgi.py 脚本安装到C:\Inetpub\wwwroot 并确保将为您的应用程序提供服务的帐户(默认为“网络服务”)对其具有读取权限。
第 4 步:将virtualenv 安装到系统站点包中
C:\Python33\Scripts\pip.exe install virtualenv
(如果您使用的是 Python 3.3 并将所有内容安装在默认位置)
第 5 步:安装 Flask 应用程序
您可以将应用程序安装在系统上的任何位置。您可能希望将其安装在C:\Inetpub 下。对于本教程,我们将调用应用程序安装的根文件夹%APPROOT%。 (不要在环境变量中加引号。)
-
确保为您的应用程序提供服务的帐户(默认为“网络服务”)对所有脚本文件具有读取权限。这个命令:
cacls "%APPROOT%" /S:"D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;NS)(A;OICI;FA;;;SY)"
会给你的应用目录以下权限:
- BUILTIN\Administrators:完全控制此文件夹、子文件夹和文件
- CREATOR OWNER:完全控制子文件夹和文件
- NT AUTHORITY\NETWORK SERVICE:对此文件夹、子文件夹和文件的读取权限
- NT AUTHORITY\SYSTEM:完全控制此文件夹、子文件夹和文件
添加任何必要的本地配置(我的应用程序使用版本控制系统忽略的 local.cnf 文件)——例如数据库 URL。
确保您的应用程序在 %APPROOT% 中包含一个 Web.config 文件——有关文件格式的信息,请参阅以下部分。
第 6 步:为您的应用程序创建一个 virtualenv
C:\Python33\Scripts\virtualenv.exe --system-site-packages "%APPROOT%\env"
(如果您的应用程序已经使用该目录,请选择除 env 以外的名称。)
第 7 步:将应用程序所需的包安装到 virtualenv
cd "%APPROOT%"
env\Scripts\activate
pip install -r Packages
(我的项目将需求规范保存在一个名为 Packages 的文件中。)
第 8 步:为您的应用程序创建网站或虚拟目录
使用inetmgr.msc(开始 -> 运行...,然后在编辑框中输入inetmgr并按ENTER)启动Internet 信息服务 (IIS) 管理器。确保将您创建的节点(网站或虚拟目录)的本地路径设置为 Flask 应用程序的根文件夹。 wfastcgi.py 使用本地路径来识别 Flask 应用程序来处理请求。
同时授予节点的读取和脚本(运行脚本)权限。
第九步:配置fcgiext.ini
此文件与步骤 1 中安装的 fcgiext.dll 位于同一目录中(默认为 %SYSTEMROOT%\system32\inetsrv)。
在配置这个文件时,需要几个参数:
-
{site id} :数字站点ID可以在 Internet信息服务(IIS)管理器的详细信息(右手)窗格中找到 EM>时选择“网站”从窗口左侧的树上。
-
{应用程序名称}:
fcgiext.ini 中为 FastCGI (ISAPI) 处理程序提供参数的部分的名称。您选择此值 - 选择代表您的应用程序的内容。
-
{应用程序路径}:对于虚拟目录,是网站内要处理的虚拟目录的 URL 路径。
-
{approot}:应用程序根目录的路径。
使用这些参数:
第 10 步:为目标 URL 配置 FastCGI 处理
使用 Internet 信息服务 (IIS) 管理器,从您要服务的节点(网站或虚拟目录)的上下文(右键单击)菜单中选择“属性...” Flask 应用和:
Web.config
此文件(在此设置中)由wfastcgi.py 读取,不是由 IIS 读取。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<applicationSettings>
<add key=“PYTHONPATH” value=“”/>
<add key=“WSGI_HANDLER” value=“module.application”/>
</applicationSettings>
</configuration>
<add> 元素添加环境变量(Python 中为os.environ)。
必须指定WSGI_HANDLER——它告诉wfastcgi.py如何定位WSGI应用对象。如果值以“()”结尾,wfastcgi.py 将调用命名对象,期望它返回一个 WSGI 应用程序对象。
PYTHONPATH 被特殊处理 -- wfastcgi.py 对 PYTHONPATH 的值执行(环境)变量扩展(使用 Windows 标准 %VAR% 表示法),然后将结果拆分为分号并附加在调用 WSGI 应用程序之前输入sys.path。因为wfastcgi.py在导入包含WSGI应用程序对象的模块之前将当前目录更改为指定为网站本地路径或虚拟目录的路径,在PYTHONPATH中包含一个空字符串会导致搜索包含你的Flask应用程序目录作为起点。您还可以在 fcgiext.ini 中设置 PYTHONPATH(在这种情况下,它由解释器包含在 sys.path 中,然后由 wfastcgi.py 再次包含)。
WSGI_RESTART_FILE_REGEX 提供了一个 Python 正则表达式,用于过滤应该触发 FastCGI 处理程序进程重新启动的路径的文件更改通知。将此设置为在源文件或配置文件更改时触发。我用(?i).*\.(py|cnf|config)$。
WSGI_LOG可以设置在这里,但我觉得最好设置在fcgiext.ini。
对于 IIS 7
FastCGI 的某些方面在 IIS 7 中发生了巨大变化。从这个版本开始,FastCGI 直接通过 IIS 支持,而不是通过扩展配置(即步骤 1.4 不是必需的,fcgiext.ini 不控制 IIS 7 的 FastCGI 行为+ 并且无需创建/编辑它)。相反,请确保在 控制面板 > 程序和功能 > 打开或关闭 Windows 功能 中的 Internet 信息服务 下启用 CGI。。 p>
Web.config
IIS 7 是第一个从 Web.config 文件中读取与 FastCGI 相关的配置设置的 IIS 版本。您的Web.config 文件需要在<configuration> 元素内包含一个<system.webServer> 元素,该元素包含一个<handlers> 元素,该元素包含一个具有以下属性的<add> 元素:
- 路径:
*
- 动词:
*
- 模块:
FastCgiModule
- 资源类型:
Unspecified
- 要求访问:
Script
- scriptProcessor:棘手的
scriptProcessor 属性
<add> 元素的此属性必须包含您要使用的 Python 解释器 .exe 文件的完整路径(Python virtualenv 的 Scripts 子文件夹中的那个),后跟 |,然后您正在使用的 wfastcgi.py 文件的完整路径。由于这些路径取决于运行应用程序的机器的设置,因此您可能希望将此属性设置为部署过程的一部分。
IIS 服务器范围设置
- 在
inetmgr 中,单击树中的服务器节点,然后从中心窗格中选择FastCGI 设置。将出现可执行文件/参数对的列表。
- 为您正在使用的
python.exe 和wfastcgi.py 的完整路径添加一个条目。两者都应该以它们在Web.config 中的<handlers>/<add> 元素中显示的方式给出。
- 确保在新的 FastCGI 应用程序条目中设置
PYTHONPATH 环境变量以包含应用程序代码库的根目录。关于在 Web.config 的 <applicationSettings> 中添加空的 PYTHONPATH 条目的建议可能不适用于此版本的 IIS。