如何在IIS中部署Flask应用?

35 投票
3 回答
54436 浏览
提问于 2025-04-16 12:15

有没有人能帮我在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 个回答

0

我从来不使用IIS,但IIS支持CGI网关,所以你应该可以把CGI和WSGI结合起来使用。

IIS <--> CGI <--> WSGI

要把WSGI当作CGI脚本来运行,你可以使用Python标准库里的CGIHandler

3

你可以看看Django关于这个主题的页面。这个页面帮我搭建了一个可以运行的Django项目,不过对于Flask应用来说,应该也差不多。

http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer

66

总体概述

HTTP -> IIS -> ISAPI -> FastCGI -> WSGI(Flask应用程序)


设置步骤

步骤 1:安装所需的程序

  1. 安装Python(可以是2.7或3.x版本,我用的是3.3)
  2. 安装pip-Win(我用的是1.6版本)
  3. 安装pywin32(我用的是218版本)
  4. 安装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应用程序会自行处理路由,这与磁盘上的文件没有直接关系。

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.exewfastcgi.py的完整路径。两者的显示方式应与Web.config中的<handlers>/<add>元素相同。
  • 确保在新的FastCGI应用程序条目中设置PYTHONPATH环境变量,以包含你的应用程序代码库的根目录。关于在Web.config<applicationSettings>中添加空PYTHONPATH条目的建议可能不适用于这个版本的IIS。

撰写回答