3

我尝试让 Flask 应用程序在 Windows 上的 IIS 上运行。

原因是使用 IIS 机制完成 Windows 身份验证的单点登录。

我让它在我的开发机器上运行。但是在实际的生产环境中是行不通的。由于某些原因,我收到错误 500,但我没有看到实际的 Flask 错误消息。

在设置写入日志文件的权限之前,我在设置过程中看到了 python 错误消息。它告诉我缺少的权利。我猜这应该意味着 FastCGI 配置正确。

现在,在我设置写访问权限后,我收到一个 IIS 错误 500 页面,告诉我 FastCGI 出了问题。但是我没有得到任何日志条目,即使我设置了写入它们的权限。Windows 事件日志中没有日志文件和条目。没有什么。

您知道获取实际错误消息的方法吗?

[更新] 启用失败的请求跟踪后,我收到以下错误:

<RenderingInfo Culture="en-US">
  <Opcode>FASTCGI_UNKNOWN_ERROR</Opcode>
  <Keywords>
   <Keyword>FastCGI</Keyword>
  </Keywords>
  <freb:Description Data="ErrorCode">The directory name is invalid.
(0x8007010b)</freb:Description>
</RenderingInfo>

web.config 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="PYTHONPATH" value="C:\inetpub\wwwroot\app_name" />
    <!-- The handler here is specific to Bottle; see the next section. -->
    <add key="WSGI_HANDLER" value="main.app" />
    <add key="WSGI_LOG" value="C:\inetpub\wwwroot\app_name\LogFiles\wfastcgi.log" />
  </appSettings>
  <system.web>
            <customErrors mode="Off" />
  </system.web>
  <system.webServer>
    <handlers>
      <clear />
      <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" 
                          scriptProcessor="&quot;c:\program files\python37\python.exe&quot;|&quot;c:\program files\python37\lib\site-packages\wfastcgi.py&quot;" 
                          resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />                       
                        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>

如果我猜的话,里面有空白的“程序文件”文件夹的路径会导致错误。

4

4 回答 4

2

要在 iis 中配置 python flask 应用程序,您可以按照以下步骤操作:

  • 首先,您需要在您的服务器上安装 python、wfastcgi 和 flask。
  • 您可以从以下链接下载 python:

https://www.python.org/downloads/

注意:如果可能,请使用 3.6 以上的 python 版本。

安装 python 后,安装 wfastcgi。以管理员身份运行命令提示符并运行以下命令:

pip install wfastcgi

wfastcgi-enable

下面是我的烧瓶示例:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello from FastCGI via IIS!"
if __name__ == "__main__":
    app.run()

创建应用程序以运行它后,请使用以下命令:

python app.py

现在启用 iis 的 cgi 功能:

在此处输入图像描述

  • 现在打开iis。
  • 右键单击服务器名称并选择添加站点。

在此处输入图像描述

  • 输入站点名称物理路径和站点绑定。
  • 添加站点后,选择站点名称并从中间窗格中选择处理程序映射功能。

在此处输入图像描述

  • 点击“添加模块映射”</li>

在此处输入图像描述

可执行路径值:

C:\Python37-32\python.exe|C:\Python37-32\Lib\site-packages\wfastcgi.py

在此处输入图像描述

  • 单击“请求限制”。确保“仅当请求映射到时才调用处理程序:”复选框未选中:

在此处输入图像描述

  • 在此处单击“是”:

在此处输入图像描述

  • 现在返回并选择应用程序设置功能。

在此处输入图像描述

  • 单击操作窗格中的添加。

在此处输入图像描述

  • 设置 PYTHONPATH 变量(这是您的站点文件夹路径):

在此处输入图像描述

  • 还有 WSGI_HANDLER(我的 Flask 应用程序名为 app.py,因此值为 app.app - 如果您的应用程序名为 site.py,则为 site.app 或类似名称):

在此处输入图像描述

  • 单击确定并浏览到您的站点。

在此处输入图像描述

于 2019-12-04T08:28:38.113 回答
1

所有 IIS 站点的根目录中都有一个 web.config 文件,其中包含所有设置。您可以使用文本编辑器(它只是 XML)手动编辑它,也可以使用 IIS GUI。

在我看来,默认<customErrors>设置是On或者RemoteOnly这意味着它在您的本地开发机器上显示实际错误,但是当您远程查看站点时,在生产中使用“友好”(但无用)错误页面隐藏它们。

在您的 web.config 中查找元素<customErrors>内部(见下文)。system.web将其设置为mode="Off",这应该意味着您可以看到实际的错误消息。

<configuration>
    <system.web>
        <customErrors mode="Off">
        </customErrors>
    </system.web>
</configuration>
于 2019-12-03T20:41:38.563 回答
0

如果您的文件权限正确,则问题可能出在您的应用程序池设置中。

  1. 转到 IIS 管理器
  2. 单击服务器的Application Pools选项卡
  3. 点击Set Application Pool Defaults...
  4. Identity下设置Process Model为 LocalSystem
于 2021-06-29T02:00:00.040 回答
0

我遇到了同样的错误,并通过向 python 文件夹添加访问权限来解决它。在您的情况下,python 文件夹路径是c:\program files\python37,因此请尝试添加 IIS_IUSRS具有读取和执行访问权限的权限

在此处输入图像描述

另一种选择是将 Web 应用程序的AppPool标识更改LocalSystem为 IIS 管理器。

在此处输入图像描述

于 2021-04-14T09:33:31.990 回答