在生产中在Windows上部署Flask

时间:2014-04-09 21:02:51

标签: python windows nginx flask production-environment

我已经找到了很多使用各种技术在Linux / Unix上运行Flask的指南(nginx / apache / uWSGI / gunicorn /等),但是它们在Linux上看起来效果最好,只是偶然在Windows上运行,或者在Windows上根本不工作。有没有推荐的方法在Windows环境中为生产中的Flask应用程序提供服务?

5 个答案:

答案 0 :(得分:2)

我已经做过几次了。只需适度降低性能即可完成此操作。您将需要利用IIS和FastCGI。

这里是指向博客文章的链接,其中详细介绍了一种方法:https://medium.com/@bilalbayasut/deploying-python-web-app-flask-in-windows-server-iis-using-fastcgi-6c1873ae0ad8

以下是指向SO帖子的链接,其中详细介绍了相同的方法:https://stackoverflow.com/a/22107980/8508792

及其内容,以防万一帖子被删除...


高级概述

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


设置步骤

步骤1:安装所需的二进制文件

  1. 安装Python(2.7或3.x-我使用的是3.3)
  2. 安装pip-Win(我使用的是1.6版)
  3. 安装pywin32(我使用的是218版)
  4. 使用fcgisetup 1.5
  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:完全控制此文件夹,子文件夹和文件
    • 创建者所有者:完全控制子文件夹和文件
    • NT AUTHORITY \ NETWORK SERVICE:对此文件夹,子文件夹和文件的读取权限
    • NT AUTHORITY \ SYSTEM:完全控制此文件夹,子文件夹和文件
  • 添加任何必要的本地配置(我的应用程序使用版本控制系统忽略的local.cnf文件)-例如数据库网址。

  • 确保您的应用程序在Web.config中包含一个%APPROOT%文件-有关文件格式的信息,请参见以下部分。

步骤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应用程序。

同时授予该节点的读取和脚本(运行脚本)权限。

步骤9:配置fcgiext.ini

此文件与步骤1中安装的fcgiext.dll位于同一目录(默认为%SYSTEMROOT%\system32\inetsrv)。

在配置此文件时,您需要几个参数:

  • {站点ID} :在“网站”中,您可以在 Internet信息服务(IIS)管理器的详细信息(右侧)窗格中找到的数字站点ID。 ”是从窗口左侧的树中选择的。
  • {应用程序名称} fcgiext.ini中提供FastCGI(ISAPI)处理程序参数的部分的名称。您选择此值-选择代表您的应用程序的内容。
  • {应用程序的路径} :对于虚拟目录,是网站中要处理的虚拟目录的URL路径。
  • {approot} :应用程序根目录的路径。

使用这些参数可以:

  • 将FastCGI请求映射到处理部分:

    • 对于整个网站,请将*:{site id}={application name}添加到[Types]部分。
    • 对于虚拟目录,将*:/lm/w3svc/{site id}/root/{path to app}={application name}添加到[Types]部分。
  • 添加带有此应用程序(full reference)参数的处理部分([{application name}]):

    • ExePath={approot}\env\python.exe
    • Arguments=C:\Inetpub\wwwroot\wfastcgi.py(或安装了wfastcgi.py适配器脚本的任何地方)
    • EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value,etc.(有关报价规则,请参见完整参考)。这是设置WSGI_LOG environment variable的好地方-确保为网站提供服务的帐户(默认情况下为“网络服务”)具有文件的写入权限,并且(如果文件不存在)具有添加文件的权限。文件到包含目录。

步骤10:为目标网址配置FastCGI处理

使用 Internet信息服务(IIS)管理器,从要由您提供服务的节点(网站或虚拟目录)的上下文(右键单击)菜单中选择“属性...”烧瓶应用程序和:

  • 在“主目录”选项卡(网站)或“虚拟目录”选项卡(虚拟目录)中,单击“配置...”按钮。

  • 在“通配符应用程序映射”部分中,使用“插入...”按钮添加通配符映射:

    • 可执行文件是在步骤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%VAR%的值执行(环境)变量扩展(使用Windows标准PYTHONPATH表示法),然后在调用WSGI应用程序之前,将结果以分号分隔,并将条目追加到sys.path。由于wfastcgi.py在导入包含WSGI应用程序对象的模块之前将当前目录更改为指定为Web站点或虚拟目录的本地路径的路径,因此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不能控制FastCGI的行为) IIS 7+,则无需创建/编辑它)。相反,请确保在控制面板>程序和功能>打开或关闭Windows功能中的 Internet信息服务下启用 CGI

Web.config

IIS 7是IIS的第一个版本,可从Web.config文件读取与FastCGI相关的配置设置。您的Web.config文件将需要在<configuration>元素内包含一个<system.webServer>元素,该元素包含一个<handlers>元素,该元素包含一个具有以下属性的<add>元素:

  • 路径:*
  • 动词:*
  • 模块:FastCgiModule
  • resourceType:Unspecified
  • requireAccess:Script
  • scriptProcessor:棘手的人

scriptProcessor属性

<add>元素的此属性必须包含要使用的Python解释器.exe文件的完整路径(Python virtualenv的Scripts子文件夹中的路径),后跟|,然后是您正在使用的wfastcgi.py文件的完整路径。由于这些路径取决于运行应用程序的计算机的设置,因此您可能需要在部署过程中设置此属性。

IIS服务器级设置

  • inetmgr中,单击树中的服务器节点,然后从中心窗格中选择 FastCGI设置。将会出现可执行文件/参数对的列表。
  • 为您的python.exe和您使用的wfastcgi.py添加完整路径的条目。两者应以相同的方式显示在<handlers>/<add>的{​​{1}}元素中。
  • 确保在新的FastCGI应用程序条目中设置Web.config环境变量,以包含应用程序代码库的根。在PYTHONPATH的{​​{1}}中添加空白PYTHONPATH条目的建议可能不适用于此版本的IIS。

答案 1 :(得分:0)

你的头上钉了一针。在Windows上安装有点像试图在圆孔中安装方形钉。 Apache和mod_wsgi可能是最合适的,但整个体验在Linux机器上更顺畅,更直接(使用pip,apt-get等)。在Windows服务器上运行的Linux VM是否适合妥协?

答案 2 :(得分:0)

我已经成功地在Windows上的Flask网站上使用了简单的Twisted Web服务器。 其他人也可以在Windows上成功使用Twisted来验证该配置吗?

new_app.py

if name == "main":
reactor_args = {}

def run_twisted_wsgi():
    from twisted.internet import reactor
    from twisted.web.server import Site
    from twisted.web.wsgi import WSGIResource

    resource = WSGIResource(reactor, reactor.getThreadPool(), app)
    site = Site(resource)
    reactor.listenTCP(5000, site)
    reactor.run(**reactor_args)

if app.debug:
    # Disable twisted signal handlers in development only.
    reactor_args['installSignalHandlers'] = 0
    # Turn on auto reload.
    import werkzeug.serving
    run_twisted_wsgi = werkzeug.serving.run_with_reloader(run_twisted_wsgi)

run_twisted_wsgi()


old_app.py

if name == "main":
app.run()

答案 3 :(得分:0)

我建议采用以下方法:

  • IIS
  • ...启用了IIS CGI / FastCGI模块
  • ...使用wfastcgi python模块在IIS FastCGI下托管Python WSGI Web应用程序

正确设置后,在IIS上部署Python网络应用非常容易,无需在IIS管理中单击即可完成,只需编辑站点/应用eventHandler文件即可。

答案 4 :(得分:-1)

尽管我认为这很复杂,但一个潜在的途径是让烧瓶应用程序在linux的Windows子系统中运行。

现有有关如何从子系统调用Powershell脚本的教程,例如:https://www.raymondcamden.com/2017/09/25/calling-a-powershell-script-from-wsl