教學課程:將 PHP、MySQL 和 Redis 應用程式部署至 Azure App 服務
本教學課程示範如何在連線到 MySQL 資料庫的 Azure App 服務 中建立安全的 PHP 應用程式(使用 適用於 MySQL 的 Azure 資料庫 彈性伺服器)。 您也會部署 Azure Cache for Redis,以啟用應用程式中的快取程式碼。 Azure App 服務 是一種可高度擴充、自我修補、Web 裝載的服務,可在 Windows 或 Linux 上輕鬆部署應用程式。 完成時,您會在 Linux 上的 Azure App 服務 上執行 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
作為 Webapp DNS 名稱的一部分。 - 應用程式的運行時間。 您可以選取要用於應用程式的 PHP 版本。
- 應用程式的資源群組。 資源群組可讓您將應用程式所需的所有 Azure 資源分組(在邏輯容器中)。
登入 Azure 入口網站,並遵循下列步驟來建立您的 Azure App 服務 資源。
步驟 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 →只能從其私人端點後方存取。
- 私用 DNS 區域→在虛擬網路中啟用資料庫伺服器和 Redis 快取的 DNS 解析。
2 - 設定資料庫連線能力
步驟 1: 在 App Service 頁面的左側功能表中,選取 [ 組態]。
步驟 2:
- 尋找以 AZURE_MYSQL_ 開頭的應用程式設定。 建立精靈會從新的 MySQL 資料庫產生它們。
- 此外,尋找以 AZURE_REDIS_ 開頭的應用程式設定。 它們是由建立精靈從新的 Redis 快取產生的。 若要設定您的應用程式,您需要此名稱。
- 如果您想要,您可以選取 每個設定右邊的 [編輯] 按鈕,並查看或複製其值。 稍後,您將變更應用程式程式代碼以使用這些設定。
步驟 3:在 [組態] 頁面的 [應用程式設定] 索引標籤中,建立CACHE_DRIVER
設定:
- 選取 [新增應用程式設定]。
- 在 [ 名稱] 欄位中,輸入 CACHE_DRIVER。
- 在 [ 值] 欄位中,輸入 redis。
- 選取 [確定]。
CACHE_DRIVER
已在 Laravel 應用程式程式代碼中使用。 此設定會告知 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 的許多方式之一,也是在部署程式中持續整合的絕佳方式之一。 根據預設,每個 git push
GitHub 存放庫都會啟動建置和部署動作。 您將直接在瀏覽器中使用 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-task]。
- 在 [分支] 中,選取 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 服務 中執行安全的數據驅動 PHP 應用程式。
提示
範例應用程式會實作另行 快取 模式。 當您在進行數據變更后重載頁面時, 網頁中的回應時間 會顯示較快的時間,因為它會從快取載入數據,而不是資料庫。
7 - 串流診斷記錄
Azure App 服務 會擷取記錄到主控台的所有訊息,以協助您診斷應用程式的問題。 範例應用程式會輸出其每個端點中的控制台記錄訊息,以示範這項功能。 根據預設,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 run。 由於每個作業都會在自己的乾淨環境中執行,因此工作流程檔案可確保 deploy
作業能夠存取作業中的 build
檔案:
- 在作業結束時
build
, 將檔案上傳為成品。 - 在作業開始時
deploy
,下載成品。
兩項作業程序花費的大部分時間都是上傳和下載成品。 如果您想要的話,您可以將這兩個作業合併成一個作業,以簡化工作流程檔案,而不需要上傳和下載步驟。
下一步
前進到下一個教學課程,瞭解如何使用自定義網域和憑證保護您的應用程式。
或者,查看其他資源: