發佈 Python Web 應用程式到 Linux 上的 Azure App Service

Visual Studio 提供直接發佈 Python Web 應用程式到 Linux 上的 Azure App Service 的功能。 發佈到 Linux 上的 Azure App Service,包括將必要的檔案複製到伺服器並設定適當的 web.config 檔案,其指示 Web 伺服器如何啟動您的應用程式。

注意

Linux 是在 App Service 中執行 Python 應用程式的唯一作業系統選項。 不再支援 Python on Windows,如 App Service Linux Docs - Python 支援中所述。 針對 Windows,您可以組建自己的自訂 Windows 容器映像,並在 App Service 中執行該映像。 如需詳細資訊,請參閱使用自訂 Docker 映像

必要條件

Visual Studio 版本

Visual Studio 2017 和更新版本以及 Visual Studio 2015 的發佈程序有所不同。 本文將說明這兩種方式。

  • Visual Studio 2015 會自動執行一些安裝步驟,包括建立 web.config 檔案,但這項自動化會導致長期的彈性和控制受到侷限。

  • Visual Studio 2017 和更新版本則需要更多的手動安裝步驟,但可讓您更精確地控制 Python 環境。

若要深入了解 Visual Studio 2015 與 Visual Studio 2017 及更新版本之間的變更,請參閱部落格文章 Publish to Azure in Visual Studio 2017 (使用 Visual Studio 2017 發佈到 Azure)。

建立測試專案

如果沒有要發佈的現有專案,則您可以建立測試專案來嘗試此程序。

  1. 在 Visual Studio 中,從工具列功能表選取 [檔案] > [新增] > [專案] 來開啟 [建立新專案] 對話方塊。

  2. 在此對話方塊中,在 [搜尋] 方塊中輸入 bottle,選取 [Bottle Web 專案] 範本,然後選取 [下一步]

    Python 開發工作負載中隨附 Bottle Web 專案範本。 如需詳細資訊,請參閱 Python Web 應用程式專案範本

  3. 輸入專案的名稱和路徑位置,然後選取 [建立]

  4. 遵循提示以安裝外部套件:選取 [安裝至虛擬環境],然後選擇您慣用的虛擬環境基底解譯器。

    虛擬環境通常符合 App Service 上安裝的 Python 版本。

準備好後,您可以選取 [偵錯] > [開始偵錯] 或使用鍵盤快速鍵 F5,在本機測試專案。

建立目標 Azure App Service

發佈至 Azure 要求 Azure 訂用帳戶具備目標 Azure App Service。

使用空的 Web 應用程式建立應用程式服務,如下所示:

  1. 登入 Azure 入口網站

  2. 移至 [應用程式服務] 頁面。

  3. 選取 [建立],然後從下拉式功能表選擇 [Web 應用程式]。 隨即開啟 [建立 Web 應用程式] 頁面。

  4. [基本] 索引標籤上,設定下列設定。

    設定 描述
    資源群組 忽略此欄位。 選擇執行階段設定之後,系統會更新此值。
    名稱 輸入 Web 應用程式的名稱。
    發行 選取 [程式碼]
    執行階段堆疊 從下拉式功能表中選擇適當的 Python 執行階段。 選擇項目之後,系統會更新 [資源群組] 欄位。
    區域 選取您附近的任何 Azure 區域。
    定價方案 選取 [免費 F1] 方案。

    針對本文中的範例,可以忽略其他索引標籤上的設定。

  5. 選取 [檢閱 + 建立] 。 檢閱您的選取項目,然後選取 [建立]

  6. (選用) App Service 就緒之後,您可以移至資源,選取 [下載發佈設定檔],然後將該檔案儲存在本機。

設定 Azure App Service 上的 Python

當您的 App Service 具有在訂用帳戶中執行的空白 Web 應用程式時,安裝所需的 Python 版本。 若要從 Visual Studio 2017 和更新版本發佈,請將與網站延伸模組一起安裝的 Python 解譯器確切路徑記錄下來。 如需詳細資訊,請參閱安裝 Python 解譯器

如有需要,也可以安裝 bottle 套件。 不過,此套件會在本逐步解說的後續步驟中安裝。

發佈至 App Service - Visual Studio 2017 和更新版本

從 Visual Studio 2017 和更新版本發佈至 Azure App Service 時,僅會將您專案中的檔案複製到伺服器。 您必須建立必要的檔案來設定伺服器環境。

  1. 在 Visual Studio 的 [方案總管] 中,以滑鼠右鍵按一下專案,然後選取 [新增] > [新增項目]。 在對話方塊中,選取 [Azure web.config (Fast CGI)] 範本並選取 [新增]。 此步驟會在您的專案根目錄中建立 web.config 檔案。

  2. 修改 web.config 檔案中的 PythonHandler 項目,使路徑符合伺服器上的 Python 安裝,如 IIS 設定參考 (iis.net) 中所述。 例如,若是 Python 3.6.1 x64,顯示的項目應如下所示:

    <system.webServer>
      <handlers>
        <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
            scriptProcessor="D:\home\Python361x64\python.exe|D:\home\Python361x64\wfastcgi.py"
            resourceType="Unspecified" requireAccess="Script"/>
      </handlers>
    </system.webServer>
    
  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 項目。 將 'vspython-test-02.azurewebsites.net' 取代為您的 URL:

    # Change the URL to your specific site
    ALLOWED_HOSTS = ['vspython-test-02.azurewebsites.net']
    

    如果沒有將 URL 新增至陣列結果,您會看到下列錯誤:

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

    當陣列為空時,Django 會自動允許 'localhost' 作為主機。 如果新增您的生產環境 URL,則 'localhost' 不會自動允許作為主機。 基於此原因,您可以考慮個別維護 settings.py 檔案的開發和生產版本,或使用環境變數來控制執行階段值。

  5. 選取範本。

    1. 在 [方案總管] 中,展開您的專案資料夾。
    2. 以滑鼠右鍵按一下 [static] 資料夾,並選取 [新增] > [新增項目]
    3. 選取 Azure 靜態檔案 web.config 範本,然後選取 [新增]

    這個動作會在 static 資料夾中建立另一個 web.config 檔案,以停用該資料夾的 Python 處理。 此組態會將靜態檔案的要求傳送給預設的網頁伺服器,而不是使用 Python 應用程式。

  6. 在 [方案總管] 中,儲存您的專案,然後以滑鼠右鍵按一下專案並選取 [發佈]

    顯示如何在 Visual Studio 中存取專案的 [發佈] 命令的螢幕擷取畫面。

  7. 在 [發佈] 視窗中,指定發佈目標:

    1. 針對 [目標],選取 [Azure],然後選取 [下一步]

    2. 針對 [特定目標],選取 [Azure App Service (Windows)],然後選取 [下一步]

      • 如果對話方塊指出完成安裝需要其他 [必要元件],請選取 [完成]。 Visual Studio 安裝程式會隨即開啟。 確認選項,然後選取 [安裝]
    3. 針對 [App Service],為您的訂用帳戶選取適當的 App Service,然後選取 [完成]

      顯示如何使用現有的訂用帳戶,在 Visual Studio 2017 和更新版本中準備到 Azure 的發佈程序的螢幕擷取畫面。

      發佈建立程序完成之後,選取 [關閉]

  8. Visual Studio 會在 [Web 發佈活動] 視窗和 [發行設定檔建立進度] 視窗中顯示狀態。 當您看到 Web 應用程式的 [準備發佈] 訊息時,請選取 [發佈]

    顯示如何在 Visual Studio 中發佈 Web 應用程式的螢幕擷取畫面。

  9. 當發佈成功時,預設瀏覽器會開啟網站 URL。 網站 URL 也會顯示在 [發佈] 視窗中。

    顯示瀏覽器開啟已發佈 Web 應用程式之網站 URL 的螢幕擷取畫面。

    如果網站 URL 未自動開啟,則請選取 [開啟網站],以在瀏覽器中檢視 Web 應用程式:

    顯示如何在瀏覽器中開啟已發佈 Web 應用程式之網站 URL 的螢幕擷取畫面。

  10. 當瀏覽器開啟時,您可能會看到下列訊息:「發生內部伺服器錯誤,無法顯示此網頁」。此訊息表示您在伺服器上的 Python 環境未完全設定,在此情況下,請執行下列步驟:

    1. 請確定您已安裝適當的 Python 網站延伸模組。 如需詳細資訊,請參閱快速入門:將 Python (Django 或 Flask) Web 應用程式部署至 Azure App Service

    2. 再次檢查 web.config 檔案中的 Python 解譯器路徑。 該路徑必須完全符合您所選擇的網站延伸模組安裝位置。

    3. 使用 Kudu 主控台升級應用程式 requirements.txt 檔案中所列的任何套件。 瀏覽至 web.config 檔案中使用的相同 Python 資料夾,例如 /home/python361x64。 執行下列命令,如 Kudu 主控台一節中所述:

      python -m pip install --upgrade -r /home/site/wwwroot/requirements.txt
      

      如果您在執行此命令時看到權限錯誤,則請確認您是在網站延伸模組資料夾中執行命令。 請勿在具有其中一個 App Service 預設 Python 安裝的資料夾中執行命令。 因為您無法修改預設環境,所以嘗試安裝套件必然會失敗。

    4. 如需詳細的錯誤輸出,請將下列這一行新增至 <system.webServer> 節點內的 web.config 檔案,即可提供更詳細的錯誤輸出:

      <httpErrors errorMode="Detailed"></httpErrors>
      
    5. 安裝新的套件之後,請嘗試重新啟動 App Service。 每當 web.config 檔案變更時,App Service 都會自動重新啟動,因此變更 web.config 檔案時,並不需要重新啟動。

      提示

      如果您針對應用程式的 requirements.txt 檔案進行任何變更,請務必再次使用 Kudu 主控台,安裝該檔案現在列出的任何套件。

  11. 完全設定好伺服器環境之後,請重新整理瀏覽器中的頁面,以查看 Web 應用程式:

    顯示將 Bottle、Flask 和 Django 應用程式發佈至 Visual Studio 中的 Azure App Service 之結果的螢幕擷取畫面。

發佈至 App Service - Visual Studio 2015

請遵循下列步驟,將 Python Web 應用程式發佈至 Visual Studio 2015 中的 Azure App Service。

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案並選取 [發行]

  2. 在 [發行] 對話方塊中,選取 [Microsoft Azure App Service]

    顯示如何在 Visual Studio 中發佈至 Azure 並選取 Azure App Service 的螢幕擷取畫面。

  3. 選取 [Microsoft Azure App Service] 作為發佈目標。 在下一個對話方塊中,選取一個現有的 App Service,或選取 [新增] 以建立新的 App Service。

  4. App Service 詳細資料會出現在 [發佈] 對話方塊的 [連線] 索引標籤中:

    顯示如何在 Visual Studio 中發佈至 Azure 並檢視 App Service 連線的螢幕擷取畫面。

  5. 視需要選取 [下一步],以檢閱其他設定。

  6. 選取發行。 將您的應用程式部署至 Azure 之後,您的預設瀏覽器會開啟網站 URL。

在這個程序期間,Visual Studio 也會完成下列步驟:

  • 在伺服器上建立一個 web.config 檔案,其中包含應用程式 wsgi_app 函式的適當指標,以及 App Service 的預設 Python 3.4 解譯器指標。
  • 關閉對專案 static 資料夾中的檔案的處理。 (此動作的規則位於 web.config 檔案中。)
  • 將虛擬環境發佈到伺服器。
  • 新增 web.debug.config 檔案與偵錯工具,以啟用遠端偵錯。 針對 Visual Studio 2019 版本 16.4 和更早版本,偵錯工具會是 ptvsd。 針對 Visual Studio 2019 版本 16.5 和更新版本,偵錯工具會是 debugpy。

如前文所述,這些自動步驟可以簡化發佈程序,但卻讓您更難控制 Python 環境。 例如,系統只會在伺服器上建立 web.config 檔案,而不會新增至您的專案。 發佈程序也會花較長的時間進行,因為它是從您的開發電腦複製整個虛擬環境,而不是仰賴伺服器組態。

最後,您可能會想要維護自己的 web.config 檔案,並使用 requirements.txt 檔案直接維護伺服器上的套件。 特別是當您使用 requirements.txt 檔案時,您可以協助確保開發和伺服器環境一律相符。