在Windows

时间:2016-04-20 12:57:10

标签: python iis flask fastcgi

任何人都可以使用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

以下是我遵循的步骤:

  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
    
  3. 创建了一个名为MyWebSite的网站,指向C:\ inetpub \ wwwroot

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

    Request path: *
    Module: FastCgiModule
    Executable: C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py
    Name: FlaskHandler
    
  5. 使用Flask上的简单Python应用程序,并将其添加到Web根文件夹中。所以在C:\ inetpub \ wwww只有3个文件: app.py web.config wfastcgi.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>
    

    app.py

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

    的applicationHost.config

    全球模块部分:

    <add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />
    

    模块部分:

    <add name="FastCgiModule" lockItem="true" />
    

    系统网络服务器部分:

    <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>
    

    因此某些原因它无法按预期工作。

    这就是我所遇到的:

    HTTP Error 500.0 - Internal Server Error
    
    C:\python35\python.exe - The FastCGI process exited unexpectedly
    

    我尝试过的事情。

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

    HTTP Error 500.0 - Internal Server Error
    <handler> scriptProcessor could not be found in <fastCGI> application configuration
    

    我认为这是权限,所以我确保 NETWORK SERVICE 帐户具有Read&amp; Execute。我甚至给了所有人帐户完全控制。我认为 NETWORK SERVICE 是需要许可的帐户。

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

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

    python.exe c:\inetpub\wwwroot\wfastcgi.py
    

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

    python app.py runserver 0.0.0.0:8081
    

    那是怎么回事。我没有想法。任何帮助将不胜感激。

    谢谢!这让我疯了。

4 个答案:

答案 0 :(得分:2)

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

  1. 打开IIS管理 r。在左窗格中,单击“服务器名称”。然后在中间窗格中双击“FastCGI设置”。您需要点击Actions&gt;&gt;右窗格中显示Add并有两个设置。我有Python 2.7,为你的情况你必须输入Python 3.5的路径
  2. enter image description here

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

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

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

        1. 再次选择左侧的网站名称。现在双击“应用程序设置”。对于现有配置,%ROOTDIR%需要替换为PYTHONPATHWSGI_ALT_VIRTUALENV_ACTIVATE_THIS的部署目录。
        2. enter image description here

          1. 浏览您的网站
          2. 希望它能帮助你,并为将来遇到同样问题的人节省一些时间。

答案 1 :(得分:2)

我知道这个问题有几个月了,但我想我需要分享我的解决方案。它真的可以帮助某人陷入同样的​​境地,因为我无法找到解决此问题的单身人士。我们距离放弃了另一个服务器管理器只有两英寸,因为我花了不少于整整一天的工作来解决这个问题,爬上整个互联网以寻找解释或任何工作解决方案的线索。

似乎我遇到问题的输入是:

可执行(可选): C:\Python27\python.exe | C:\Python27\Scripts\wfastcgi.py

它做了什么,是删除&#34;可执行文件(可选)&#34;中的路径周围的间距?领域。我深深地假设这样一个带有两个输入的字段足以修剪解析的值,所以我每次都做了完全相同的间距。但我错了,我的结果是一个映射与赌博dumble路径前面有一个空格和什么。删除所有空格后,这对我来说非常不舒服,它按预期工作,甚至不必删除处理程序并将其放回原处。这种删除它并在IIS论坛上再次尝试建议正在污染开发人员的头脑,错误地认为一切都需要撤消,当它真的只需要良好的配置时。

工作输入:

可执行(可选): C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py

我希望这对某人有所帮助,如果一个MS开发者有机会到这里,请删除这个双输入字段的邪恶黑客,因为如果你进入fastCgi设置,它会分成两个不同的字段在全球范围内,在其他地方的某个领域询问两个输入只会产生误导。至少修剪这两个值,如此深入的输入列表填充从业者不会再次崩溃这个问题!面对这样一个问题是非常令人费解的,即错误表明基本上你输入的内容并不存在。

<强> 更新

值得一提的是,最后,您必须将python模块中的应用程序对象公开给IIS,仅此而已。对于某些人来说这似乎是显而易见的,但它没有很好的记录,如果python模块实际上也启动了他的应用程序,它也会崩溃。它绝对需要这样的东西才能拥有一个工作的开发环境:

Python - app.py

# <imports...>
# <routes...>
myApp.secret_key = 'this-is-a-secret-key'

if __name__ == '__main__':
   # start application in python

# IIS will get access to variable `myApp` and start it himself,
# without starting it twice because IIS won't run the script
# as `__main__`. In this scenario `WSGI_HANDLER` will be required
# to have `app.myApp` to reach your application.

IIS中的应用程序将完成其工作。您仍然可以使用python app.py在调试模式下启动它。

答案 2 :(得分:1)

就我而言,这是权限问题-

您需要对包含 python.exe 的整个 python 文件夹具有读取和执行权限 通过在文件夹位置 C:\Python36

的命令提示符下运行以下命令来提供所需的权限
icacls . /grant "NT AUTHORITY\IUSR:(OI)(CI)(RX)"

步骤

2.pip install wfastcgi

3.启用wfastcgi

4.创建myapp.py

5.创建web.config

----web.config------

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="FlaskFastCGI" path="*" verb="*" modules="FastCgiModule" 
      scriptProcessor="C:\python\python36\python.exe|C:\python\python36\lib\site-packages\wfastcgi.py"
      resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <security> 
        <requestFiltering allowDoubleEscaping="true"></requestFiltering> 
    </security> 
  </system.webServer>

  <appSettings>
    <!-- Required settings -->
    <add key="WSGI_HANDLER" value="myapp.app" />
    <add key="PYTHONPATH" value="~/" />
  </appSettings>
</configuration>

答案 3 :(得分:-1)

Windows->属性->安全->编辑->添加->所有->完全控制