教學課程:將 PHP、MySQL 和 Redis 應用程式部署至 Azure App Service
本教學課程說明如何在連線到 MySQL 資料庫的 Azure App Service 中建立安全的 PHP 應用程式 (使用適用於 MySQL 的 Azure 資料庫彈性伺服器)。 您也將部署 Azure Cache for Redis 以在應用程式中啟用快取程式碼。 Azure App Service 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 完成後,Linux 上的 Azure App Service 上將會執行 Laravel 應用程式。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
範例應用程式
若要繼續遵循本教學課程,請從存放庫複製或下載 Laravel 應用程式範例:
git clone https://github.com/Azure-Samples/laravel-tasks.git
如果您想要在本機執行應用程式,請執行下列動作:
在 .env 中,使用本機 MySQL 資料庫中的設定,設定資料庫設定 (例如
DB_DATABASE
、DB_USERNAME
和DB_PASSWORD
)。 您需要本機 MySQL 伺服器才能執行此範例。從存放庫的根目錄,使用下列命令啟動 Laravel:
composer install php artisan migrate php artisan key:generate php artisan serve
1 - 建立 App Service 和 MySQL 資源
在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立預設安全的 App Service 和適用於 MySQL 的 Azure 資料庫組態。 針對建立程序,您將指定:
- Web 應用程式的 [名稱]。 此名稱會以
https://<app-name>.azurewebsites.net
的形式作為 Web 應用程式 DNS 名稱的一部分。 - 應用程式的 [執行階段]。 您可以在此處選取要用於應用程式的 PHP 版本。
- 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。
登入 Azure 入口網站,遵循下列步驟建立您的 Azure App Service 資源。
步驟 1:在 Azure 入口網站中:
- 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
- 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈。
步驟 2:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。
- [資源群組] → 選取 [新建] 並使用 msdocs-laravel-mysql-tutorial 的名稱。
- 區域 → 您附近的任何 Azure 區域。
- [名稱] → msdocs-laravel-mysql-XYZ,其中 XYZ 是任意三個隨機字元。 此名稱在整個 Azure 中必須是唯一的。
- 執行階段堆疊 → PHP 8.2。
- 新增 Azure Cache for Redis? → [是]。
- 主控方案 → 基本。 當一切就緒時,您可以在之後擴大至生產定價層。
- MySQL - 預設會為您選取彈性伺服器作為資料庫引擎。 適用於 MySQL 的 Azure 資料庫是 Azure 上完全受控的 MySQL 資料庫即服務,可與最新的社群版本相容。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 3:部署需要數分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:
- 資源群組 → 所有已建立資源的容器。
- App Service 計畫 → 定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
- App Service → 代表您的應用程式,並在 App Service 方案中執行。
- 虛擬網路 → 與 App Service 應用程式整合,並隔離後端網路流量。
- 私人端點 → 虛擬網路中資料庫伺服器和 Redis 快取的存取端點。
- 網路介面 → 代表私人 IP 位址,每個私人端點各有一個位址。
- 適用於 MySQL 的 Azure 資料庫彈性伺服器 → 只能從其私人端點後方存取。 系統會為您在伺服器上建立資料庫和使用者。
- Azure Cache for Redis → 只能從其私人端點後方存取。
- Private DNS 區域 → 啟用虛擬網路中資料庫伺服器和 Redis 快取的 DNS 解析。
2 - 設定資料庫連線
步驟 1:在 [App Service] 頁面上的左側功能表,選取 [設定]。
步驟 2:
- 尋找以 AZURE_MYSQL_ 開頭的應用程式設定。 建立精靈從新的 MySQL 資料庫產生這些內容。
- 此外,尋找以 AZURE_REDIS_ 開頭的應用程式設定。 建立精靈從新的 Redis 快取產生這些內容。 若要設定應用程式,您僅需要此名稱即可進行。
- 您可視需要選取每個設定右側的 [編輯] 按鈕,並查看或複製其值。 稍後,您將變更應用程式程式碼以使用這些設定。
步驟 3:在 [設定] 頁面的 [應用程式設定] 索引標籤中,建立 CACHE_DRIVER
設定:
- 選取 [新增應用程式設定]。
- 在 [名稱] 欄位中輸入 CACHE_DRIVER。
- 在 [值] 欄位中輸入 redis。
- 選取 [確定]。
Laravel 應用程式程式碼中已使用
CACHE_DRIVER
。 此設定會告知 Laravel 使用 Redis 作為其快取。
步驟 4: 使用步驟 3 中的相同步驟,建立下列應用程式設定:
- MYSQL_ATTR_SSL_CA:使用 /home/site/wwwroot/ssl/DigiCertGlobalRootCA.crt.pem 作為值。 此應用程式設定會指向存取 MySQL 伺服器所需的 TLS/SSL 憑證路徑。 其包含在範例存放庫中,方便使用。
- LOG_CHANNEL:使用 stderr 作為值。 此設定會告知 Laravel 將記錄輸送至 stderr,以供 App Service 記錄使用。
- APP_DEBUG:使用 true 作為值。 這是 Laravel 偵錯變數,可啟用偵錯模式頁面。
- APP_KEY:使用 base64:Dsz40HWwbCqnq0oxMsjq7fItmKIeBfCBGORfspaI1Kw= 做為值。 這是 Laravel 加密變數。
- 在頂端的功能表列上,選取 [儲存]。
- 出現提示時,請選取 [繼續]。
重要
為方便起見,此處使用 APP_KEY
值。 針對生產案例,應該特別針對您的部署在命令列中使用 php artisan key:generate --show
。
3 - 部署範例程式碼
在此步驟中,您將使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push
都會開始建置和部署動作。 您將直接在瀏覽器中使用 Visual Studio Code 對程式碼基底進行一些變更,然後讓 GitHub Actions 自動為您部署。
步驟 1:在新的瀏覽器視窗中:
- 登入您的 GitHub 帳戶。
- 瀏覽至 https://github.com/Azure-Samples/laravel-tasks。
- 請選取分叉。
- 選取 [建立派生]。
步驟 2:在 [GitHub] 頁面中,按下 .
鍵,在瀏覽器中開啟 Visual Studio Code。
步驟 3:在瀏覽器中的 Visual Studio Code 中,從資料總管中開啟 config/database.php。 尋找 mysql
區段,並進行下列變更:
- 把
DB_HOST
替換為AZURE_MYSQL_HOST
。 - 把
DB_DATABASE
替換為AZURE_MYSQL_DBNAME
。 - 把
DB_USERNAME
替換為AZURE_MYSQL_USERNAME
。 - 把
DB_PASSWORD
替換為AZURE_MYSQL_PASSWORD
。 - 把
DB_PORT
替換為AZURE_MYSQL_PORT
。 請記住,這些AZURE_MYSQL_
設定是建立精靈為您建立的。
步驟 4: 在 config/database.php,捲動至 Redis cache
區段,並進行下列變更:
- 把
REDIS_HOST
替換為AZURE_REDIS_HOST
。 - 把
REDIS_PASSWORD
替換為AZURE_REDIS_PASSWORD
。 - 把
REDIS_PORT
替換為AZURE_REDIS_PORT
。 - 把
REDIS_CACHE_DB
替換為AZURE_REDIS_DATABASE
。 - 在相同的區段中,新增一行,內容是
'scheme' => 'tls',
。 此設定會告知 Laravel 使用加密以連線至 Redis。 請記住,這些AZURE_REDIS_
設定是建立精靈為您建立的。
步驟 5:
- 選取 [原始檔控制] 延伸模組。
- 在文字方塊中,輸入提交訊息,例如
Configure DB & Redis variables
。 - 選取 [提交並推送]。
步驟 6:回到 [App Service] 頁面上的左側功能表,選取 [部署中心]。
步驟 7:在 [部署中心] 頁面中:
- 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
- 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
- 在 [組織] 中,選取您的帳戶。
- 在 [存放庫] 中,選取 [laravel-tasks]。
- 在 [分支] 中,選取 [main]。
- 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至
.github/workflows
目錄中選擇的 GitHub 存放庫。
步驟 8:在 [部署中心] 頁面中:
- 選取 [記錄] 。 已啟動部署執行。
- 在部署執行的記錄項目中,選取 [建置/部署記錄]。
步驟 9:您會前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行到顯示 [完成] 狀態。 需要約 15 分鐘的時間。
4 - 產生資料庫結構描述
建立精靈會將 MySQL 資料庫伺服器放在私人端點後,因此只能從虛擬網路存取。 因為 App Service 應用程式已經與虛擬網路整合,所以使用資料庫執行資料庫移轉的最簡單方式,就是直接從 App Service 容器內執行資料庫移轉。
步驟 1:回到 [App Service] 頁面上的左側功能表,選取 [SSH]。
步驟 2:在 SSH 終端機中:
- 執行
cd /home/site/wwwroot
。 此處是所有已部署的檔案。 - 執行
php artisan migrate --force
。 如果成功,App Service 已成功連線至 MySQL 資料庫。 只有/home
中檔案的變更才能在應用程式重新開機之後保存。/home
以外的變更不會保存。
5 - 變更網站根目錄
Laravel 應用程式生命週期是在 /public 目錄中啟動。 App Service 的預設 PHP 容器會使用 Nginx,這會在應用程式的根目錄中啟動。 若要變更網站根目錄,您必須變更 PHP 容器中的 Nginx 設定檔 (/etc/nginx/sites-available/default)。 為了方便起見,範例存放庫包含稱為 default 的自訂組態檔。 如先前所述,您不想使用 SSH 殼層取代此檔案,因為您的變更在 /home
之外,而且會在應用程式重新啟動之後遺失。
步驟 1:
- 在左功能表中選取 [組態]。
- 選取一般設定索引標籤。
步驟 2:在 [一般設定] 索引標籤中:
- 在 [啟動命令] 方塊中輸入下列命令:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload。
- 選取 [儲存]。 命令會取代 PHP 容器中的 Nginx 設定檔,並重新啟動 Nginx。 此設定可確保每次啟動容器時,都會對容器進行相同的變更。
6 - 瀏覽至應用程式
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中選取 [概觀]。
- 選取應用程式的 URL。 您也可以直接瀏覽至
https://<app-name>.azurewebsites.net
。
第 2 步:將幾項工作新增至清單。 恭喜,您正在 Azure App Service 中執行資料驅動的安全 PHP 應用程式。
提示
應用程式範例會實作另行快取模式。 當您進行資料變更後重新載入頁面時,網頁中顯示的回應時間會較快,因為這是從快取載入資料而不是從資料庫載入。
7 - 串流診斷記錄
Azure App Service 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 樣本應用程式在其每個端點中輸出主控台記錄訊息,以展示此功能。 根據預設,Laravel 的記錄功能 (例如 Log::info()
) 會輸出至本機檔案。 您先前的 LOG_CHANNEL
應用程式設定讓您能從 App Service 記錄資料流存取記錄項目。
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中,選取 [App Service 記錄]。
- 在 [應用程式記錄] 下,選取 [檔案系統]。
步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。
清除資源
完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。
步驟 1:在 Azure 入口網站頂端的搜尋列中:
- 輸入資源群組名稱。
- 選取資源群組。
步驟 2:在資源群組頁面中,選取 [刪除資源群組]。
步驟 3:
- 輸入您確認要刪除的資源群組名稱。
- 選取 [刪除]。
常見問題集
- 這設定會產生多少費用?
- 如何使用其他工具連線到虛擬網路後方的 MySQL 資料庫?
- 本機應用程式開發如何與 GitHub Actions 搭配運作?
- 為何 GitHub Actions 部署速度過慢?
這設定會產生多少費用?
建立資源的定價如下:
- App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價。
- MySQL 彈性伺服器是在 B1ms 層中建立,並可相應增加或減少。 使用 Azure 免費帳戶時,B1ms 層免費 12 個月,最多可達每月限制。 請參閱適用於 MySQL 的 Azure 資料庫定價。
- Azure Cache for Redis 是在最低快取大小的基本層級中建立。 與此層級相關的成本不高。 您可以擴大至較高的效能層級以取得高可用性、叢集和其他功能。 請參閱 Azure Cache for Redis 定價。
- 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價。
- 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價。
如何使用其他工具連線到虛擬網路後方的 MySQL 資料庫?
- 若要從命令列工具進行基本存取,您可以從應用程式的 SSH 終端機執行
mysql
。 - 若要從 MySQL Workbench 之類的桌面工具連線,您的電腦必須位於虛擬網路內。 例如,該電腦可以是連線到其中一個子網路的 Azure VM,或內部部署網路中具有與 Azure 虛擬網路站對站 VPN 連線的電腦。
- 您也可以將 Azure Cloud Shell 與虛擬網路整合。
本機應用程式開發如何與 GitHub Actions 搭配運作?
以 App Service 自動產生的工作流程檔案為例,每個 git push
都會開始執行新的組建和部署。 從 GitHub 存放庫的本機複本,您會將所需的更新推送至 GitHub。 例如:
git add .
git commit -m "<some-message>"
git push origin main
為何 GitHub Actions 部署速度過慢?
App Service 自動產生的工作流程檔案會定義 build-then-deploy、two-job 執行。 由於每個作業都會在自己的清除環境中執行,因此工作流程檔案可確保 deploy
作業可以存取作業中的 build
檔案:
- 在
build
作業結束時,將檔案上傳為成品。 - 在
deploy
作業開始時,下載成品。
兩項作業程序花費的大部分時間都是上傳和下載成品。 如有需要,您可以將這兩個作業合併成一個作業來簡化工作流程檔案,這樣就不需要上傳和下載步驟。
下一步
前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。
或者,查看其他資源: