共用方式為


在 Azure App Service 上設定 Python 應用程式的自定義啟動檔案

在本文中,您將瞭解 Azure App Service 上裝載 Python Web 應用程式的自定義啟動檔案的時機和方式。 雖然本機開發不需要啟動檔案,但 Azure App Service 會在 Docker 容器內執行已部署的 Web 應用程式,如果提供的話,可以使用啟動命令。

在下列情況下,您需要自定義啟動檔案:

  • 自定義 Gunicorn 自變數:您想要以超出其預設值的額外自變數啟動 Gunicorn 預設網頁伺服器,也就是 --bind=0.0.0.0 --timeout 600

  • 替代架構或伺服器:您的應用程式是以 Flask 或 Django 以外的架構建置,或者您想要使用 Gunicorn 以外的不同網頁伺服器。

  • 非標準 Flask 應用程式結構:您的 Flask 應用程式的主要程式代碼檔案名不是 app.pyapplication.py*,而是其他名稱,或應用程式物件的名稱不是其他名稱

換句話說,除非您的專案在根資料夾中擁有名為的 Flask 應用程式物件,並且該物件存在於app.pyapp 檔案中,否則需要自定義啟動命令。

如需詳細資訊,請參閱 設定 Python 應用程式 - 容器啟動程式

建立啟動檔案

當您需要自訂啟動檔案時,請使用下列步驟:

  1. 在您的專案中建立名為 startup.txtstartup.sh 或包含啟動命令之您選擇的另一個名稱的檔案。 如需 Django、Flask 和其他架構的詳細資訊,請參閱本文稍後的章節。

    如有需要,啟動檔案可以包含多個命令。

  2. 將檔案認可至您的程式代碼存放庫,以便與應用程式的其餘部分一起部署。

  3. 在 Visual Studio Code 中,選取活動列中的 Azure 圖示、展開 [資源]、尋找並展開您的訂用帳戶、展開 [App Services],然後以滑鼠右鍵單擊 [App Service],然後選取 [ 在入口網站中開啟]。

  4. Azure 入口網站的 [App Service 組] 頁面上,選取 [一般設定],在 [堆棧設定啟動命令] 下輸入啟動檔案的名稱(例如 > 或 startup.sh),然後選取 [儲存]。

    備註

    您可以直接將啟動命令本身放在 Azure 入口網站的 [ 啟動命令 ] 欄位中,而不是使用啟動命令檔案。 建議使用啟動命令檔案,因為它會將組態儲存在存放庫中。 這可讓版本控制追蹤變更,並簡化重新部署至其他 Azure App Service 實例。

  5. 當系統提示您重新啟動 App Service 時,請選取 [ 繼續 ]。

    如果您在部署應用程式程式代碼之前存取 Azure App Service 網站,則會出現「應用程式錯誤」,因為沒有程式代碼可用來處理要求。

Django 啟動命令

根據預設,Azure App Service 會找出包含您 wsgi.py 檔案的資料夾,並使用下列命令啟動 Gunicorn:

# <module> is the folder that contains wsgi.py. If you need to use a subfolder,
# specify the parent of <module> using --chdir.
gunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi

如果您想要修改任何 Gunicorn 自變數,例如將逾時值增加到 1,200 秒(--timeout 1200),請建立自定義啟動命令檔案。 這可讓您以您的特定需求覆寫預設設定。 如需詳細資訊,請參閱 容器啟動程式 - Django 應用程式

Flask 啟動命令

根據預設,Linux 上的 App Service 會假設您的 Flask 應用程式符合下列 critear:

  • WSGI 可呼叫的名稱為 app
  • 應用程式程式代碼包含在名為 application.pyapp.py 的檔案中。
  • 應用程式檔位於應用程式的根資料夾中。

如果您的項目與這個結構不同,則您的自訂啟動命令必須以 file:app_object 格式識別應用程式物件的位置:

  • 不同的檔案名稱和/或應用程式物件名稱:如果應用程式的主要程式碼檔案 是 hello.py 且應用程式物件名為 myapp,啟動命令如下所示:

    gunicorn --bind=0.0.0.0 --timeout 600 hello:myapp
    
  • 啟動檔案位於子資料夾中:如果啟動檔案myapp/website.py ,而應用程式物件為 app,則使用 Gunicorn 的 --chdir 自變數來指定資料夾,然後將啟動檔案和應用程式物件命名為一般:

    gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:app
    
  • 啟動檔案位於模組內:在 python-sample-vscode-flask-tutorial 程式代碼中, webapp.py 啟動檔案包含在資料夾 hello_app內,其本身是具有 __init__.py 檔案的模組。 應用程式物件命名為 app ,且定義於 __init__.py 中, 且 webapp.py 使用相對匯入。

    由於這種安排,將 Gunicorn 指向 webapp:app 會產生錯誤:「嘗試在非套件中相對匯入」,導致應用程式無法啟動。

    在此情況下,請建立一個 shim 檔案,從模組中匯入應用物件,然後讓 Gunicorn 使用這個 shim 來啟動應用。 例如,python-sample-vscode-flask-tutorial 程式碼包含名為 startup.py 的檔案,其內容如下:

    from hello_app.webapp import app
    

    啟動命令接著為:

    gunicorn --bind=0.0.0.0 --workers=4 startup:app
    

如需詳細資訊,請參閱 容器啟動程式 - Flask 應用程式

其他架構和網頁伺服器

執行 Python 應用程式的 App Service 容器預設會安裝 Django 和 Flask,以及 Gunicorn Web 伺服器。

若要使用 Django 或 Flask 以外的架構(例如 FalconFastAPI 等),或使用不同的網頁伺服器:

  • 在您的 requirements.txt 檔案中包含架構和/或網頁伺服器。

  • 在啟動命令中,按照 上一節針對 Flask 的描述,辨識 WSGI 呼叫物件。

  • 若要啟動 Gunicorn 以外的網頁伺服器,請使用 python -m 命令,而不是直接叫用伺服器。 例如,下列命令會啟動 uvicorn 伺服器,假設 WSGI 可呼叫的名稱為 app ,且位於 application.py

    python -m uvicorn application:app --host 0.0.0.0
    

    python -m因為透過 requirements.txt 安裝的網頁伺服器不會新增至 Python 全域環境,因此無法直接叫用。 python -m命令會從目前的虛擬環境中叫用伺服器。