為 IIS 設定 Python Web 應用程式

當您在 Windows 電腦上 (包括 Azure 上的 Windows 虛擬機器) 上使用 Internet Information Services (IIS) 做為 Web 伺服器時,需要設定 Python Web 應用程式,IIS 才能夠正確地處理 Python 程式碼。 此組態透過 Python Web 應用程式之 web.config 檔案中的設定來完成。 本文章說明如何進行必要的設定。

必要條件

  • 已在 Windows 上安裝 Python。 若要執行 Web 應用程式,請先依照安裝 Python 解譯器所述,直接在 Windows 主機電腦上安裝您所需的 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.config XML 檔案。

設定 HttpPlatformHandler

HTTP 平台處理常式模組會將通訊端連線直接傳遞給獨立的 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。 您可以視需要建立並指派環境變數。

設定 FastCGI 處理常式

FastCGI 是一種在要求層級運作的介面。 IIS 會接收連入連線並將每個要求轉送至在一或多個持續性 Python 程序中執行的 WSGI 應用程式。

注意

我們建議您使用 HttpPlatformHandler 來設定應用程式,因為不再維護 WFastCGI 專案。

若要使用 FastCGI,請先依照 pypi.org/project/wfastcgi/ 中的說明安裝並設定 wfastcgi 套件。

接下來,修改應用程式的 web.config 檔案以包含 python.exe 可執行檔以及 PythonHandler 索引鍵中之 wfastcgi.py 檔案的完整路徑。 下列步驟假設 Python 已安裝在 c:\python36-32 資料夾中,而應用程式程式碼位於 c:\home\site\wwwroot 資料夾中。 依照您的路徑調整這些值。

  1. 修改 web.config 檔案中的 PythonHandler 項目,使路徑與 Python 的安裝位置相符。 如需詳細資訊,請參閱 IIS 組態參考 (iis.net)。

    <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. web.config 檔案的 <appSettings> 區段內,新增 WSGI_HANDLERWSGI_LOG (選用) 和 PYTHONPATH 的索引鍵:

    <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> 應符合您的專案名稱。 您可以查看 runserver.py 檔案中的 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 項目。 以您的 URL 或 IP 位址取代 '1.2.3.4':

    # 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 只會將專案檔複製到伺服器。 您負責所有伺服器端的設定。