为 IIS 配置 Python Web 应用

使用 Internet Information Services (IIS)作为 Windows 计算机上的 Web 服务器(包括 Azure 上的 Windows 虚拟机)时,需要配置 Python Web 应用程序,使 IIS 能够正确处理 Python 代码。 配置是通过 Python Web 应用的 web.config 文件中的设置完成的。 本文介绍如何配置必要的设置。

先决条件

  • 已在 Windows 上安装 Python。 若要运行 Web 应用,请先在 Windows 主机计算机上安装所需的 Python 版本,如 安装 Python 解释器中所述。

    • 标识 python.exe 解释器的位置。 为方便起见,可以将该位置添加到 PATH 环境变量。
  • 已安装所需的包。 对于专用主机,可以使用全局 Python 环境来运行应用,而不是虚拟环境。 因此,可以通过运行 pip install -r requirements.txt 命令将应用的所有要求安装到全局环境中。

将 web.config 设置为指向 Python 解释器

Python 应用程序的 web.config 文件指示在 Windows 上运行的 IIS Web 服务器(版本 7 或更高版本)如何通过 HttpPlatformHandler(推荐)或 FastCGI 处理 Python 请求。 Visual Studio 版本 2015 及更早版本会自动进行这些修改。 对于 Visual Studio 2017 及更高版本,必须手动修改 web.config 文件。

如果项目尚未包含 web.config 文件,可以通过右键单击项目目录、选择“>添加新项”并搜索 web.config 或创建空白web.configXML 文件来添加个文件。

选项 1:配置 HttpPlatformHandler

HttpPlatform 模块将套接字连接直接传递到独立的 Python 进程。 此直通允许运行你喜欢的任何 Web 服务器,但它需要运行本地 Web 服务器的启动脚本。 此方法通常通过使用 Python Web 框架(如 Flask 或 Django)来完成。 您在 web.config 文件的 <httpPlatform> 元素中指定脚本。 该 processPath 属性指向站点扩展的 Python 解释器。 该 arguments 属性指向运行本地 Web 服务器的启动脚本,在本例中 runserver.py,以及要提供的任何参数:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="c:\python36-32\python.exe"
                  arguments="c:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="c:\home\LogFiles\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

在此示例中,HTTP_PLATFORM_PORT 环境变量包含端口,本地服务器应通过此端口侦听来自 localhost 的连接。 此示例还演示如何创建另一个环境变量 SERVER_PORT。 可以根据需要创建和分配环境变量。

选项 2:配置 FastCGI 处理程序

或者,可以使用 FastCGI 配置应用。 FastCGI 是一个在请求级别工作的接口。 IIS 接收传入连接,并将每个请求转发到一个或多个持久 Python 进程中运行的 Web 服务器网关接口 (WSGI) 应用。

注释

虽然可以使用 FastCGI 设置项目,但我们建议使用 HttpPlatformHandler 配置应用,因为 WFastCGI 项目不再维护,并可能导致 bug。

若要使用 FastCGI,请首先按照 pypi.org/project/wfastcgi/ 中所述安装和配置 wfastcgi 包。

接下来,修改应用程序的 web.config 文件,以包含 python.exe可执行文件的完整路径以及密钥中的 PythonHandler 文件。 以下步骤假定 Python 安装在 c:\python36-32 文件夹中,应用代码位于 c:\home\site\wwwroot 文件夹中。 根据您的路径相应调整这些值。

  1. PythonHandler修改 web.config 文件中的条目,使路径与 Python 安装位置匹配。 有关详细信息,请参阅 iis.net 上的 IIS 配置参考

    <system.webServer>
       <handlers>
         <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
             scriptProcessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py"
             resourceType="Unspecified" requireAccess="Script"/>
       </handlers>
    </system.webServer>
    
  2. <appSettings>web.config 文件的<appSettings>部分中,添加WSGI_HANDLER、可选的WSGI_LOGPYTHONPATH密钥:

    <appSettings>
       <add key="PYTHONPATH" value="c:\home\site\wwwroot"/>
       <!-- The handler here is specific to Bottle; see the next section. -->
       <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
       <add key="WSGI_LOG" value="c:\home\LogFiles\wfastcgi.log"/>
    </appSettings>
    

    这些 <appSettings> 值作为环境变量可供应用使用:

    • 可以自由扩展密钥的值 PYTHONPATH ,但它必须包含应用的根目录。
    • 密钥 WSGI_HANDLER 必须指向可从应用导入的 WSGI 应用。
    • 密钥 WSGI_LOG 是可选的,但建议使用密钥来调试应用。
  3. 根据您所使用的框架,在web.config文件中适当设置WSGI_HANDLER条目。

    • Bottle:在值后面 app.wsgi_app 添加括号,如以下示例所示。 括号是必需的,因为对象是函数而不是变量。 可以在 app.py 文件中查看语法。

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask:将WSGI_HANDLER值更改为<project_name>.app,其中<project_name>与您的项目名称匹配。 可以通过查看 from <project_name> import app 文件中的语句来查找确切标识符。 例如,如果项目名为 FlaskAzurePublishExample,则条目如下所示:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django:Django 项目的 web.config 文件需要两项更改。

      • WSGI_HANDLER 值更改为 django.core.wsgi.get_wsgi_application()。 对象位于 wsgi.py 文件中。

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • WSGI_HANDLER键的条目之后,立即添加以下条目。 将值 DjangoAzurePublishExample 替换为项目的名称:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. 仅 Django 应用:在 Django 项目的 settings.py 文件中,将网站 URL 域或 IP 地址添加到 ALLOWED_HOSTS 条目。 将“1.2.3.4”替换为 URL 或 IP 地址:

    # Change the URL or IP address to your specific site
    ALLOWED_HOSTS = ['1.2.3.4']
    

    如果未将 URL 添加到数组结果,则会看到以下错误:

    DisallowedHost at / Invalid HTTP_HOST header: '<site URL>'. You might need to add '<site URL>' to ALLOWED_HOSTS.
    

当数组为空时,Django 会自动允许 'localhost''127.0.0.1' 作为主机。 如果添加生产环境 URL,则这些主机站点不会自动被允许。 因此,你可能希望维护 settings.py 文件的单独开发和生产副本,或使用环境变量来控制运行时值。

部署到 IIS 或 Windows 虚拟机

如果项目中有正确的 web.config 文件,则可以从 解决方案资源管理器发布到运行 IIS 的计算机。 右键单击项目,选择“ 发布”,然后选择 IIS、FTP 等。 在这种情况下,Visual Studio 仅将项目文件复制到服务器。 你负责所有服务器端配置。