當您使用 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。 您在 <httpPlatform> 元素中指定web.config 檔案的腳本。
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 進程中執行的 Web 伺服器閘道介面 (WSGI) 應用程式。
注意
雖然您可以使用 FastCGI 來設定專案,但建議您使用 HttpPlatformHandler 來設定應用程式,因為 WFastCGI 專案已不再維護,而且可能會導致錯誤。
若要使用 FastCGI,請先安裝和設定 wfastcgi 套件,如 pypi.org/project/wfastcgi/中所述。
接下來,修改應用程式的 web.config 檔案,以包含索引鍵中 python.exe 可執行檔和 wfastcgi.py 檔案 PythonHandler 的完整路徑。 下列步驟假設 Python 安裝在 c:\python36-32 資料夾中,而應用程式程式代碼位於 c:\home\site\wwwroot 資料夾中。 請根據您的路徑調整這些值。
修改 web.config 檔案中的
PythonHandler項目,讓路徑符合 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>在
<appSettings>web.config 檔案的區段中,新增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>符合項目的名稱。 您可以在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 只會將專案檔複製到伺服器。 您負責所有伺服器端設定。