在本文中,您將瞭解 Azure App 服務 上裝載 Python Web 應用程式的自定義啟動檔案的時機和方式。 雖然本地開發不需要啟動檔,但 Azure App 服務 會在 Docker 容器中執行你部署的網頁應用程式,只要你提供啟動指令,容器就能使用啟動指令。
在下列情況下,您需要自定義啟動檔案:
自定義 Gunicorn 自變數:您想要以超出其預設值的額外自變數啟動 Gunicorn 預設網頁伺服器,也就是
--bind=0.0.0.0 --timeout 600。替代框架或伺服器:你的應用程式是用 Flask 或 Django 以外的框架建置,或者你想用其他網頁伺服器代替 Gunicorn。
非標準 Flask 應用程式結構:您的 Flask 應用程式主程式檔案名稱不是 app.py 或 application.py,而是其他名稱,或者應用程式物件的名稱不是
app。
換句話說,除非你的專案根目錄裡有一個名為 Flask 應用程式物件的 app.py 或 app 檔案,否則你需要自訂啟動指令。
如需詳細資訊,請參閱 設定 Python 應用程式 - 容器啟動程式。
先決條件
在設定自訂啟動檔案之前,您必須先有一個現有的、在 Linux 上執行 Python 的 App Service。 若要建立 App Service,請依照 App Service 的 Python 快速入門。 你也可以使用 Azure CLI 建立應用程式服務:
az webapp create --resource-group <group> --plan <plan> --name <app-name> --runtime "PYTHON:3.12"
建立啟動檔案
當您需要自訂啟動檔案時,請使用下列步驟:
在您的專案中建立名為 startup.txt、 startup.sh 或包含啟動命令之您選擇的另一個名稱的檔案。 如需 Django、Flask 和其他架構的詳細資訊,請參閱本文稍後的章節。
如有需要,啟動檔案可以包含多個命令。
將檔案認可至您的程式代碼存放庫,以便與應用程式的其餘部分一起部署。
在 Visual Studio Code 中,選取活動列中的 Azure 圖示、展開 [資源]、尋找並展開您的訂用帳戶、展開 [App Services],然後以滑鼠右鍵單擊 [App Service],然後選取 [ 在入口網站中開啟]。
在 Azure 入口網站中,從左側的服務功能表中,選擇 [ 設定>組態]。 在 App Service 的 [組態] 頁面上,選取 [一般設定],在 [堆棧設定啟動命令] 下輸入啟動檔案的名稱(例如 > 或 startup.sh),然後選取 [儲存]。
或者,你也可以使用 Azure CLI 來設定啟動指令:
az webapp config set --resource-group <group> --name <app-name> --startup-file "<startup-command>"備註
您可以直接將啟動命令本身放在 Azure 入口網站的 [ 啟動命令 ] 欄位中,而不是使用啟動命令檔案。 建議使用啟動命令檔案,因為它會將組態儲存在存放庫中。 這可讓版本控制追蹤變更,並簡化重新部署至其他 Azure App 服務 實例。
當系統提示您重新啟動 App Service 時,請選取 [ 繼續 ]。
如果您在部署應用程式程式代碼之前存取 Azure App 服務 網站,則會出現「應用程式錯誤」,因為沒有程式代碼可用來處理要求。
Django 啟動命令
根據預設,Azure App 服務 會找出包含您 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 應用程式符合以下條件:
- WSGI 可呼叫的名稱為
app。 - 應用程式程式代碼包含在名為 application.py 或 app.py 的檔案中。
- 應用程式檔位於應用程式的根資料夾中。
如果你的專案與此結構不同,你的自訂啟動指令必須在格式檔中標明應用程式物件的位置 :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命令會從目前的虛擬環境中叫用伺服器。
部署您的應用程式
設定啟動檔後,你需要將應用程式碼部署到 App Service。 請使用 Azure CLI 或您選擇的部署方式:
az webapp up --name <app-name>
更多部署選項,請參見 部署最佳實務。