在本文中,您將瞭解 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.py 或 application.py*,而是其他名稱,或應用程式物件的名稱不是其他名稱。
換句話說,除非您的專案在根資料夾中擁有名為的 Flask 應用程式物件,並且該物件存在於app.py 或 app
檔案中,否則需要自定義啟動命令。
如需詳細資訊,請參閱 設定 Python 應用程式 - 容器啟動程式。
建立啟動檔案
當您需要自訂啟動檔案時,請使用下列步驟:
在您的專案中建立名為 startup.txt、 startup.sh 或包含啟動命令之您選擇的另一個名稱的檔案。 如需 Django、Flask 和其他架構的詳細資訊,請參閱本文稍後的章節。
如有需要,啟動檔案可以包含多個命令。
將檔案認可至您的程式代碼存放庫,以便與應用程式的其餘部分一起部署。
在 Visual Studio Code 中,選取活動列中的 Azure 圖示、展開 [資源]、尋找並展開您的訂用帳戶、展開 [App Services],然後以滑鼠右鍵單擊 [App Service],然後選取 [ 在入口網站中開啟]。
在 Azure 入口網站的 [App Service 組態] 頁面上,選取 [一般設定],在 [堆棧設定啟動命令] 下輸入啟動檔案的名稱(例如 > 或 startup.sh),然後選取 [儲存]。
備註
您可以直接將啟動命令本身放在 Azure 入口網站的 [ 啟動命令 ] 欄位中,而不是使用啟動命令檔案。 建議使用啟動命令檔案,因為它會將組態儲存在存放庫中。 這可讓版本控制追蹤變更,並簡化重新部署至其他 Azure App Service 實例。
當系統提示您重新啟動 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.py 或 app.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 以外的架構(例如 Falcon、 FastAPI 等),或使用不同的網頁伺服器:
在您的 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
命令會從目前的虛擬環境中叫用伺服器。