如何在IIS中部署Flask应用?
有没有人能帮我在IIS 6上运行一个Flask应用程序?我试过使用isapi-wsgi,但当我访问虚拟目录的地址时,页面上显示“找不到指定的模块”。还有其他的解决办法吗?
下面是我为isapi-wsgi写的Python脚本。我已经创建了虚拟目录,在IIS管理器中一切看起来都正常,但网站就是不工作。
from wof import app
import os
app.secret_key=os.urandom(24)
import isapi_wsgi
def __ExtensionFactory__():
return isapi_wsgi.ISAPISimpleHandler(app)
if __name__ == '__main__':
from isapi.install import *
params = ISAPIParameters()
sm = [ScriptMapParams(Extension="*", Flags=0)]
vd = VirtualDirParameters(Name="WOFPy_Sondes", Description="ISAPI-WSGI for WOFPY Sondes test", ScriptMaps=sm, ScriptMapUpdate="replace")
params.VirtualDirs = [vd]
HandleCommandLine(params)
3 个回答
我从来不使用IIS,但IIS支持CGI网关,所以你应该可以把CGI和WSGI结合起来使用。
IIS <--> CGI <--> WSGI
要把WSGI当作CGI脚本来运行,你可以使用Python标准库里的CGIHandler。
你可以看看Django关于这个主题的页面。这个页面帮我搭建了一个可以运行的Django项目,不过对于Flask应用来说,应该也差不多。
http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer
总体概述
HTTP -> IIS -> ISAPI -> FastCGI -> WSGI(Flask应用程序)
设置步骤
步骤 1:安装所需的程序
- 安装Python(可以是2.7或3.x版本,我用的是3.3)
- 安装pip-Win(我用的是1.6版本)
- 安装pywin32(我用的是218版本)
- 安装IIS FastCGI扩展,使用fcgisetup 1.5
步骤 2:安装可选的二进制包
我通过这个网站的安装程序.exe安装了pyodbc
。如果从源代码安装(比如用pip在虚拟环境中安装),需要一个C/C++编译器。
步骤 3:获取wfastcgi.py
的副本
选择一个适合你的版本,最好是支持Python 3.3的版本(我用的是David Ebbo的版本)。你也可以选择“官方”版本。
将wfastcgi.py
脚本安装到C:\Inetpub\wwwroot
,并确保提供应用程序的账户(默认是“网络服务”)对其有读取权限。
步骤 4:将virtualenv
安装到系统的site-packages中
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 Information Services (IIS) 管理器。确保为你创建的节点(网站或虚拟目录)设置本地路径为Flask应用程序的根文件夹。wfastcgi.py
使用本地路径来识别处理请求的Flask应用程序。
为节点提供读取和脚本(运行脚本)权限。
步骤 9:配置fcgiext.ini
这个文件位于步骤1中安装的fcgiext.dll
的同一目录下(默认是%SYSTEMROOT%\system32\inetsrv
)。
在配置这个文件时,你需要几个参数:
- {site id}: 你可以在Internet Information Services (IIS) 管理器的详细信息(右侧)窗格中找到的数字站点ID,当左侧树中选择“网站”时。
- {application name}:
fcgiext.ini
中提供FastCGI(ISAPI)处理程序参数的部分名称。你可以选择这个值——选择一个能代表你应用程序的名称。 - {path to app}: 对于虚拟目录,网站内的URL路径到要处理的虚拟目录。
- {approot}: 你应用程序的根目录路径。
使用这些参数来:
将FastCGI请求映射到处理部分:
- 对于整个网站,向
[Types]
部分添加*:{site id}={application name}
。 - 对于虚拟目录,向
[Types]
部分添加*:/lm/w3svc/{site id}/root/{path to app}={application name}
。
- 对于整个网站,向
添加一个处理部分(
[{application name}]
),并为这个应用程序提供参数(完整参考):ExePath={approot}\env\python.exe
Arguments=C:\Inetpub\wwwroot\wfastcgi.py
(或者你安装wfastcgi.py
适配器脚本的其他位置)EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value,等等。
(查看完整参考以了解引用规则)。这是设置你的WSGI_LOG环境变量的好地方——确保提供网站的账户(默认是“网络服务”)对文件有写入权限,并且(如果文件不存在)有权限在包含目录中添加文件。
步骤 10:为目标URL配置FastCGI处理
使用Internet Information Services (IIS) 管理器,从要由你的Flask应用程序提供服务的节点(网站或虚拟目录)的右键菜单中选择“属性...”并:
在“主目录”选项卡(网站)或“虚拟目录”选项卡(虚拟目录)中,点击“配置...”按钮。
在“通配符应用程序映射”部分,使用“插入...”按钮添加一个通配符映射:
- 可执行文件是步骤1中安装的FastCGI扩展DLL。它的默认位置是
%SYSTEMROOT%\system32\inetsrv\fcgiext.dll
。 - 确保“验证文件是否存在”未被选中。Flask应用程序会自行处理路由,这与磁盘上的文件没有直接关系。
- 可执行文件是步骤1中安装的FastCGI扩展DLL。它的默认位置是
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%
表示法),然后在分号处分割结果,并将条目附加到sys.path
中,然后再调用WSGI应用程序。因为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
在IIS 7中,FastCGI的一些内容发生了重大变化。从这个版本开始,FastCGI通过IIS直接支持,而不是通过扩展进行配置(即步骤1.4不再必要,fcgiext.ini
不再控制IIS 7+的FastCGI行为,也不需要创建/编辑它)。相反,请确保在控制面板 > 程序和功能 > 启用或关闭Windows功能中的Internet Information Services下启用了CGI。
Web.config
IIS 7是第一个从Web.config
文件读取与FastCGI相关的配置设置的IIS版本。你的Web.config
文件需要在<configuration>
元素内包含一个<system.webServer>
元素,其中包含一个<handlers>
元素,里面有一个<add>
元素,属性如下:
- path:
*
- verb:
*
- modules:
FastCgiModule
- resourceType:
Unspecified
- requireAccess:
Script
- scriptProcessor: 比较复杂的部分
scriptProcessor
属性
这个<add>
元素的属性必须包含你想使用的Python解释器.exe
文件的完整路径(在你的Python虚拟环境的Scripts
子文件夹中)后面跟一个|
,然后是你使用的wfastcgi.py
文件的完整路径。由于这些路径依赖于运行应用程序的机器的设置,你可能希望在部署过程中设置这个属性。
IIS服务器级别的设置
- 在
inetmgr
中,点击树中的服务器节点,然后在中间窗格中选择FastCGI设置。会弹出一个可执行文件/参数对的列表。 - 添加你使用的
python.exe
和wfastcgi.py
的完整路径。两者的显示方式应与Web.config
中的<handlers>/<add>
元素相同。 - 确保在新的FastCGI应用程序条目中设置
PYTHONPATH
环境变量,以包含你的应用程序代码库的根目录。关于在Web.config
的<applicationSettings>
中添加空PYTHONPATH
条目的建议可能不适用于这个版本的IIS。