如何在 IIS 中部署 Flask 应用程序?
Posted
技术标签:
【中文标题】如何在 IIS 中部署 Flask 应用程序?【英文标题】:How do I deploy a Flask application in IIS? 【发布时间】:2011-07-01 15:00:54 【问题描述】:谁能帮我获得一个在 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)
【问题讨论】:
【参考方案1】:我从不使用 IIS,但 IIS 支持 CGI 网关,因此您应该能够将 CGI 与 WSGI 适配。
IIS <--> CGI <--> WSGI
要将 WSGI 作为 CGI 脚本运行,您可以使用 Python 标准库中的CGIHandler。
【讨论】:
CGI 不是一个可接受的解决方案,除非它是一个非常低流量的东西(例如,只供你自己使用)。每次请求页面时它都会启动一个进程。【参考方案2】:查看有关该主题的 Django 页面。它帮助我建立了一个有效的 Django 项目,但对于 Flask 应用程序来说应该没有什么不同。
http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer
【讨论】:
你确定你的答案吗?【参考方案3】:高级概述
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:应用程序根目录的路径。
使用这些参数:
将 FastCGI 请求映射到处理部分:
对于整个网站,将*:<b>site id</b>=<b>application name</b>
添加到[Types]
部分。
对于虚拟目录,将 *:/lm/w3svc/<b>site id</b>/root/<b>path to app</b>=<b>application name</b>
添加到 [Types]
部分。
添加一个带有此应用程序参数的处理部分 ([<b>application name</b>]
) (full reference):
ExePath=<b>approot</b>\env\python.exe
Arguments=C:\Inetpub\wwwroot\wfastcgi.py
(或安装了 wfastcgi.py
适配器脚本的任何位置)
EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value,<i>etc.</i>
(参见引用规则的完整参考)。这是设置WSGI_LOG environment variable 的好地方——确保服务于站点的帐户(默认为“网络服务”)具有文件的写入权限和(如果文件不存在)添加文件的权限包含目录。
第 10 步:为目标 URL 配置 FastCGI 处理
使用 Internet 信息服务 (IIS) 管理器,从您要服务的节点(网站或虚拟目录)的上下文(右键单击)菜单中选择“属性...” Flask 应用和:
在“主目录”选项卡(网站)或“虚拟目录”选项卡(虚拟目录)中,单击“配置...”按钮。
在“通配符应用程序映射”部分,使用“插入...”按钮添加通配符映射:
可执行文件是步骤 1 中安装的 FastCGI 扩展 DLL。其默认位置是%SYSTEMROOT%\system32\inetsrv\fcgiext.dll
。
确保“验证文件是否存在”未选中。 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。
【讨论】:
这是一个很好的总结,考虑到过去 6 年中 Windows 服务器/IIS 的变化,唯一的小调整是默认用户现在是 IIS_USRS 而不是网络服务。您可能需要使用命令appcmd unlock config /section:handler
使用位于 C:\windows\system32\inetsrv 中的 appcmd 解锁配置部分
是否可以在单个工作进程下运行多线程?因为当我部署应用程序时,它正在为每个请求创建新的 python 进程
> 根据IIS FastCGI配置文件(fcgiext.ini),“池中的每个进程一次处理一个请求。每个请求后,进程将返回池中等待另一个请求。” forums.iis.net/t/…以上是关于如何在 IIS 中部署 Flask 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章