我已经找到了很多使用各种技术在Linux / Unix上运行Flask的指南(nginx / apache / uWSGI / gunicorn /等),但是它们在Linux上看起来效果最好,只是偶然在Windows上运行,或者在Windows上根本不工作。有没有推荐的方法在Windows环境中为生产中的Flask应用程序提供服务?
答案 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应用程序)
我使用this site中的安装程序.exe安装了pyodbc
。从源代码安装(例如,用于安装到虚拟环境中的pip)需要C / C ++编译器。
wfastcgi.py
的副本选择一个适合您的版本,最好是一个支持Python 3.3的版本(我使用David Ebbo's)。您可能需要“官方”版本from here。
将wfastcgi.py
脚本安装到C:\Inetpub\wwwroot
中,并确保将为您的应用程序提供服务的帐户(默认为“网络服务”)对其具有读取权限。
virtualenv
安装到系统站点包中C:\Python33\Scripts\pip.exe install virtualenv
(如果您使用的是Python 3.3,并将所有内容都安装在默认位置)
您可以在系统上的几乎任何位置安装应用程序。您可能需要将其安装在C:\Inetpub
下。在本教程中,我们将调用应用程序安装%APPROOT%
的根文件夹。 (不要在环境变量中加上引号。)
确保将为您的应用程序提供服务的帐户(默认为“网络服务”)具有对所有脚本文件的读取访问权限。该命令:
cacls "%APPROOT%" /S:"D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;NS)(A;OICI;FA;;;SY)"
将为您的应用程序目录提供以下权限:
添加任何必要的本地配置(我的应用程序使用版本控制系统忽略的local.cnf文件)-例如数据库网址。
确保您的应用程序在Web.config
中包含一个%APPROOT%
文件-有关文件格式的信息,请参见以下部分。
C:\Python33\Scripts\virtualenv.exe --system-site-packages "%APPROOT%\env"
(如果您的应用程序已经使用该目录,则选择env
以外的其他名称。)
cd "%APPROOT%"
env\Scripts\activate
pip install -r Packages
(我的项目将需求规范保存在名为Packages
的文件中。)
使用inetmgr.msc
(开始-> 运行…,然后在编辑框中输入inetmgr
,然后按 ENTER )以启动 Internet信息服务(IIS)管理器。确保将您创建的节点(网站或虚拟目录)的本地路径设置为Flask应用程序的根文件夹。 wfastcgi.py
使用本地路径来标识用于处理请求的Flask应用程序。
同时授予该节点的读取和脚本(运行脚本)权限。
fcgiext.ini
此文件与步骤1中安装的fcgiext.dll
位于同一目录(默认为%SYSTEMROOT%\system32\inetsrv
)。
在配置此文件时,您需要几个参数:
fcgiext.ini
中提供FastCGI(ISAPI)处理程序参数的部分的名称。您选择此值-选择代表您的应用程序的内容。使用这些参数可以:
将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的好地方-确保为网站提供服务的帐户(默认情况下为“网络服务”)具有文件的写入权限,并且(如果文件不存在)具有添加文件的权限。文件到包含目录。使用 Internet信息服务(IIS)管理器,从要由您提供服务的节点(网站或虚拟目录)的上下文(右键单击)菜单中选择“属性...”烧瓶应用程序和:
在“主目录”选项卡(网站)或“虚拟目录”选项卡(虚拟目录)中,单击“配置...”按钮。
在“通配符应用程序映射”部分中,使用“插入...”按钮添加通配符映射:
%SYSTEMROOT%\system32\inetsrv\fcgiext.dll
。(在此设置中)此文件由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
中设置。
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
Unspecified
Script
scriptProcessor
属性 <add>
元素的此属性必须包含要使用的Python解释器.exe
文件的完整路径(Python virtualenv的Scripts
子文件夹中的路径),后跟|
,然后是您正在使用的wfastcgi.py
文件的完整路径。由于这些路径取决于运行应用程序的计算机的设置,因此您可能需要在部署过程中设置此属性。
inetmgr
中,单击树中的服务器节点,然后从中心窗格中选择 FastCGI设置。将会出现可执行文件/参数对的列表。python.exe
和您使用的wfastcgi.py
添加完整路径的条目。两者应以相同的方式显示在<handlers>/<add>
的{{1}}元素中。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上部署Python网络应用非常容易,无需在IIS管理中单击即可完成,只需编辑站点/应用eventHandler
文件即可。
答案 4 :(得分:-1)
尽管我认为这很复杂,但一个潜在的途径是让烧瓶应用程序在linux的Windows子系统中运行。
现有有关如何从子系统调用Powershell脚本的教程,例如:https://www.raymondcamden.com/2017/09/25/calling-a-powershell-script-from-wsl