當您使用 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 資料夾中。 請根據您的路徑調整這些值。
修改
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>
在
web.config
檔案的<appSettings>
區段中,新增WSGI_HANDLER
、WSGI_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
金鑰是選擇性的,但建議使用金鑰來偵錯您的應用程式。
- 您可以自由擴充
根據您使用的架構,在
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" />
僅限 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 只會將專案檔複製到伺服器。 您負責所有伺服器端設定。
相關內容
- IIS 組態參考 (iis.net)
- 安裝 Python 解釋器
- 在 Azure 上 Windows 虛擬機