共用方式為


設定適用於 IIS 的 Python Web 應用程式

當您使用 Internet Information Services (IIS) 作為 Windows 電腦上的網頁伺服器時(包括 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 網頁伺服器(版本 7 或更新版本)如何透過 HttpPlatformHandler(建議)或 FastCGI 來處理 Python 要求。 Visual Studio 2015 版和更早版本會自動進行這些修改。 針對 Visual Studio 2017 和更新版本,您必須手動修改 web.config 檔案。

如果您的專案尚未包含 web.config 檔案,您可以以滑鼠右鍵點擊專案目錄,選取 [新增 > 新專案],然後搜尋 web.config 或建立一個空白的 web.config XML 檔案。

選項 1 :設定 HttpPlatformHandler

HttpPlatform 模組會將套接字連線直接傳遞至獨立 Python 程式。 此傳遞可讓您執行任何您想要的網頁伺服器,但需要執行本機網頁伺服器的啟動腳本。 這種方法通常是使用 Python Web 架構來完成,例如 Flask 或 Django。 您可以在 web.config 檔案的 <httpPlatform> 項目中指定文稿。 processPath 屬性會指向網站延伸模組的 Python 解釋器。 arguments 屬性會指向用於執行本機網頁伺服器的啟動腳本(在此案例中是 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 進程中執行的 WSGI 應用程式。

注意

雖然您可以使用 FastCGI 來設定專案,但建議您使用 HttpPlatformHandler 來設定應用程式,因為 WFastCGI 專案已不再維護,而且可能會導致錯誤。

若要使用 FastCGI,請先安裝和設定 wfastcgi 套件,如 pypi.org/project/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 條目。 將 '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 只會將專案檔複製到伺服器。 您負責所有伺服器端設定。