在Windows上使用FastCgiModule设置Python和Flask时出现500内部服务器错误

JQ9*_*JQ9 8 python iis fastcgi flask

有人能用IIS设置Python吗?一直试图弄清楚,但它不起作用,这让我发疯.我看到很多例子,但我无法让它发挥作用.


这是我的设置


  • Windows 2008R2
  • IIS 7.5(7.5.7600.16385)
  • wfastcgi.py(2.2.0)
  • 烧瓶(0.10.1)
  • Python(3.5.1)

Python + Flask网络应用程序的路径

C:\inetpub\wwwroot
Run Code Online (Sandbox Code Playgroud)

以下是我遵循的步骤:

  1. 确保已安装CGI窗口功能.
  2. 在IIS管理器中,突出显示的Web服务器和FastCGI设置中添加了一个具有以下值的应用程序:

    Full Path: C:\python35\python.exe
    
    Arguments: C:\inetpub\wwwroot\wfastcgi.py
    
    Environment Variable Collection:
    
      PYTHONPATH: C:\inetpub\wwwroot\
      WSGI_HANDLER: app.app
      WSGI_LOG: C:\logs\app.txt
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建了一个名为MyWebSite的网站,指向C:\ inetpub\wwwroot

  4. 在网站的处理程序映射设置中,为FastCgiModule添加了一个模块映射:

    Request path: *
    Module: FastCgiModule
    Executable: C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py
    Name: FlaskHandler
    
    Run Code Online (Sandbox Code Playgroud)

使用Flask的简单Python应用程序在网络上找到并添加到Web根文件夹.所以在C:\ inetpub\wwww只有3个文件:app.py,web.configwfastcgi.py

web.config中

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appSettings>
        <add key="PYTHONPATH" value="" />
        <add key="WSGI_HANDLER" value="app.app" />
        <add key="WSGI_RESTART_FILE_REGEX" value="(?i).*\.(py|cnf|config)$" />
    </appSettings>
    <system.webServer>
        <handlers>
            <add name="FlaskHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from FastCGI via IIS!"

if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)

applicationHost.config:

全球模块部分:

<add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />
Run Code Online (Sandbox Code Playgroud)

模块部分:

<add name="FastCgiModule" lockItem="true" />
Run Code Online (Sandbox Code Playgroud)

系统网络服务器部分:

<section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
...
<fastCgi>
    <application fullPath="C:\Python35\python.exe" arguments="C:\inetpub\wwwroot\wfastcgi.py">
        <environmentVariables>
            <environmentVariable name="PYTHONPATH" value="C:\inetpub\wwwroot\" />
            <environmentVariable name="WSGI_HANDLER" value="app.app" />
        <environmentVariable name="WSGI_LOG" value="c:\logs\my_log.txt" />
        </environmentVariables>
    </application>
</fastCgi>
Run Code Online (Sandbox Code Playgroud)

所以有些原因它不能按预期工作.

这就是我所经历的:

HTTP Error 500.0 - Internal Server Error

C:\python35\python.exe - The FastCGI process exited unexpectedly
Run Code Online (Sandbox Code Playgroud)

我试过的东西.

似乎没有正确调用处理程序的scriptProcessor.它似乎确实被调用,因为当我将值更改为其他东西时,我收到一个错误:

HTTP Error 500.0 - Internal Server Error
<handler> scriptProcessor could not be found in <fastCGI> application configuration
Run Code Online (Sandbox Code Playgroud)

我认为这是一个权限的事情,所以我确保NETWORK SERVICE帐户具有读取和执行.我甚至给每个人帐号完全控制.我认为NETWORK SERVICE是需要许可的帐户.

我添加了日志记录以在app.py中注销调试信息.我没有得到任何日志信息能够写出日志文件.我不确定wfastcgi.py如何使用IIS配置,即使我将其添加到web.config,也可以设置日志文件的位置.也许如果scriptProcessor实际上被调用,它最终会设置它.但是看看它似乎使用系统环境变量的代码,所以我只是将WSGI_LOG值添加为OS环境变量.仍然没有将调试信息记录到日志文件中.

所以我尝试在命令行上直接运行带有wfastcgi文件的python可执行文件作为参数,它似乎按预期工作,进入wfastcgi while循环并等待请求.它还将调试信息记录到日志文件中.

python.exe c:\inetpub\wwwroot\wfastcgi.py
Run Code Online (Sandbox Code Playgroud)

当我运行python服务器时,它在浏览器中导航到localhost:8081时工作,所以我怀疑它是配置的东西.

python app.py runserver 0.0.0.0:8081
Run Code Online (Sandbox Code Playgroud)

那么发生了什么.我没有想法.任何帮助,将不胜感激.

谢谢!这让我疯了.

gms*_*msi 6

根据描述,您似乎需要对 IIS 进行一些配置更改。我在 IIS 7.5 上有以下配置设置,并使用 FastCgiModule 运行 Python Flask。以下是您可以采取的步骤:

  1. 打开 IIS 管理器。在左侧窗格中,单击“服务器名称”。然后在中间窗格中双击“FastCGI 设置”。您需要单击右侧窗格中的Actions>>Add并有两个设置。我有 Python 2.7,对于你的情况,你必须输入 Python 3.5 的路径

在此处输入图片说明

  1. 在 IIS 上“添加网站”来发布网站。对于下面的屏幕截图,站点名称为“pyprojects”,内容发布到物理文件夹“C:\inetpub\wwwroot\pyprojects”

在此处输入图片说明

  1. 选择左侧的站点名称并双击处理程序映射。在右窗格中的操作下,单击“添加模块映射”并输入

    • 请求路径: handler.fcgi
    • 模块: FastCgiModule
    • 可执行文件:C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py(Python 版本特定路径)
    • 姓名: Python FastCGI

在此处输入图片说明

  1. 再次选择左侧的站点名称。现在双击应用程序设置。对于现有配置%ROOTDIR%需要替换为部署目录PYTHONPATHWSGI_ALT_VIRTUALENV_ACTIVATE_THIS

在此处输入图片说明

  1. 浏览您的网站

希望它可以帮助您并为将来遇到相同问题的人节省一些时间。