共用方式為


教學課程:將 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 訂閱,請在開始之前,先建立 Azure 免費帳戶

範例應用程式

若要繼續遵循本教學課程,請從存放庫複製或下載 Laravel 應用程式範例:

git clone https://github.com/Azure-Samples/laravel-tasks.git

如果您想要在本機執行應用程式,請執行下列動作:

  • .env 中,使用本機 MySQL 資料庫中的設定,設定資料庫設定 (例如 DB_DATABASEDB_USERNAMEDB_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 入口網站中:

  1. 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
  2. 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈

螢幕擷取畫面:顯示如何使用頂端工具列中的搜尋方塊以尋找 [Web 應用程式 + 資料庫] 建立精靈。

步驟 2:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。

  1. [資源群組] → 選取 [新建] 並使用 msdocs-laravel-mysql-tutorial 的名稱。
  2. 區域 → 您附近的任何 Azure 區域。
  3. [名稱]msdocs-laravel-mysql-XYZ,其中 XYZ 是任意三個隨機字元。 此名稱在整個 Azure 中必須是唯一的。
  4. 執行階段堆疊PHP 8.2
  5. 新增 Azure Cache for Redis? → [是]
  6. 主控方案基本。 當一切就緒時,您可以在之後擴大至生產定價層。
  7. MySQL - 預設會為您選取彈性伺服器作為資料庫引擎。 適用於 MySQL 的 Azure 資料庫是 Azure 上完全受控的 MySQL 資料庫即服務,可與最新的社群版本相容。
  8. 選取 [檢閱 + 建立]。
  9. 驗證完成時,選取 [建立]

螢幕擷取畫面:顯示如何在 [Web 應用程式 + 資料庫] 精靈中設定新的應用程式和資料庫。

步驟 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] 頁面上的左側功能表,選取 [設定]

螢幕擷取畫面:顯示如何在 App Service 中開啟設定頁面。

步驟 2:

  1. 尋找以 AZURE_MYSQL_ 開頭的應用程式設定。 建立精靈從新的 MySQL 資料庫產生這些內容。
  2. 此外,尋找以 AZURE_REDIS_ 開頭的應用程式設定。 建立精靈從新的 Redis 快取產生這些內容。 若要設定應用程式,您僅需要此名稱即可進行。
  3. 您可視需要選取每個設定右側的 [編輯] 按鈕,並查看或複製其值。 稍後,您將變更應用程式程式碼以使用這些設定。

螢幕擷取畫面:顯示如何建立應用程式設定。

步驟 3:在 [設定] 頁面的 [應用程式設定] 索引標籤中,建立 CACHE_DRIVER 設定:

  1. 選取 [新增應用程式設定]
  2. 在 [名稱] 欄位中輸入 CACHE_DRIVER
  3. 在 [值] 欄位中輸入 redis
  4. 選取 [確定]。 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 加密變數
  1. 在頂端的功能表列上,選取 [儲存]
  2. 出現提示時,請選取 [繼續]

顯示如何在組態頁面中儲存設定的螢幕快照。

重要

為方便起見,此處使用 APP_KEY 值。 針對生產案例,應該特別針對您的部署在命令列中使用 php artisan key:generate --show

3 - 部署範例程式碼

在此步驟中,您將使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push 都會開始建置和部署動作。 您將直接在瀏覽器中使用 Visual Studio Code 對程式碼基底進行一些變更,然後讓 GitHub Actions 自動為您部署。

步驟 1:在新的瀏覽器視窗中:

  1. 登入您的 GitHub 帳戶。
  2. 瀏覽至 https://github.com/Azure-Samples/laravel-tasks
  3. 請選取分叉
  4. 選取 [建立派生]

螢幕擷取畫面:顯示如何建立範例 GitHub 存放庫的分支。

步驟 2:在 [GitHub] 頁面中,按下 . 鍵,在瀏覽器中開啟 Visual Studio Code。

顯示如何在 GitHub 中開啟 Visual Studio Code 瀏覽器體驗的螢幕快照。

步驟 3:在瀏覽器中的 Visual Studio Code 中,從資料總管中開啟 config/database.php。 尋找 mysql 區段,並進行下列變更:

  1. DB_HOST 替換為 AZURE_MYSQL_HOST
  2. DB_DATABASE 替換為 AZURE_MYSQL_DBNAME
  3. DB_USERNAME 替換為 AZURE_MYSQL_USERNAME
  4. DB_PASSWORD 替換為 AZURE_MYSQL_PASSWORD
  5. DB_PORT 替換為 AZURE_MYSQL_PORT。 請記住,這些 AZURE_MYSQL_ 設定是建立精靈為您建立的。

螢幕快照,顯示瀏覽器中的 Visual Studio Code,以及已修改 MySQL 變數的已開啟檔案。

步驟 4:config/database.php,捲動至 Redis cache 區段,並進行下列變更:

  1. REDIS_HOST 替換為 AZURE_REDIS_HOST
  2. REDIS_PASSWORD 替換為 AZURE_REDIS_PASSWORD
  3. REDIS_PORT 替換為 AZURE_REDIS_PORT
  4. REDIS_CACHE_DB 替換為 AZURE_REDIS_DATABASE
  5. 在相同的區段中,新增一行,內容是 'scheme' => 'tls',。 此設定會告知 Laravel 使用加密以連線至 Redis。 請記住,這些 AZURE_REDIS_ 設定是建立精靈為您建立的。

螢幕快照,顯示瀏覽器中的 Visual Studio Code,以及已修改 Redis 變數的已開啟檔案。

步驟 5:

  1. 選取 [原始檔控制] 延伸模組。
  2. 在文字方塊中,輸入提交訊息,例如 Configure DB & Redis variables
  3. 選取 [提交並推送]

螢幕擷取畫面:顯示要認可並推送至 GitHub 的變更。

步驟 6:回到 [App Service] 頁面上的左側功能表,選取 [部署中心]

螢幕擷取畫面:顯示如何在 App Service 中開啟 [部署中心]。

步驟 7:在 [部署中心] 頁面中:

  1. 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
  2. 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
  3. 在 [組織] 中,選取您的帳戶。
  4. 在 [存放庫] 中,選取 [laravel-tasks]
  5. 在 [分支] 中,選取 [main]
  6. 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至 .github/workflows 目錄中選擇的 GitHub 存放庫。

螢幕擷取畫面:顯示如何使用 GitHub Actions 設定 CI/CD。

步驟 8:在 [部署中心] 頁面中:

  1. 選取 [記錄] 。 已啟動部署執行。
  2. 在部署執行的記錄項目中,選取 [建置/部署記錄]

螢幕擷取畫面:顯示如何在 [部署中心] 開啟部署記錄。

步驟 9:您會前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行到顯示 [完成] 狀態。 需要約 15 分鐘的時間。

螢幕擷取畫面:顯示 GitHub 執行進行中。

4 - 產生資料庫結構描述

建立精靈會將 MySQL 資料庫伺服器放在私人端點後,因此只能從虛擬網路存取。 因為 App Service 應用程式已經與虛擬網路整合,所以使用資料庫執行資料庫移轉的最簡單方式,就是直接從 App Service 容器內執行資料庫移轉。

步驟 1:回到 [App Service] 頁面上的左側功能表,選取 [SSH]

螢幕擷取畫面:顯示如何從 Azure 入口網站開啟您應用程式的 SSH 殼層。

步驟 2:在 SSH 終端機中:

  1. 執行 cd /home/site/wwwroot。 此處是所有已部署的檔案。
  2. 執行 php artisan migrate --force。 如果成功,App Service 已成功連線至 MySQL 資料庫。 只有 /home 中檔案的變更才能在應用程式重新開機之後保存。 /home 以外的變更不會保存。

螢幕擷取畫面:顯示要在 SSH 殼層及其輸出中執行的命令。

5 - 變更網站根目錄

Laravel 應用程式生命週期是在 /public 目錄中啟動。 App Service 的預設 PHP 容器會使用 Nginx,這會在應用程式的根目錄中啟動。 若要變更網站根目錄,您必須變更 PHP 容器中的 Nginx 設定檔 (/etc/nginx/sites-available/default)。 為了方便起見,範例存放庫包含稱為 default 的自訂組態檔。 如先前所述,您不想使用 SSH 殼層取代此檔案,因為您的變更在 /home 之外,而且會在應用程式重新啟動之後遺失。

步驟 1:

  1. 在左功能表中選取 [組態]
  2. 選取一般設定索引標籤。

顯示如何在 App Service 設定頁面中開啟 [一般設定] 索引標籤的螢幕快照。

步驟 2:在 [一般設定] 索引標籤中:

  1. 在 [啟動命令] 方塊中輸入下列命令:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload
  2. 選取 [儲存]。 命令會取代 PHP 容器中的 Nginx 設定檔,並重新啟動 Nginx。 此設定可確保每次啟動容器時,都會對容器進行相同的變更。

顯示如何在 App Service 中設定啟動命令的螢幕快照。

6 - 瀏覽至應用程式

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中選取 [概觀]
  2. 選取應用程式的 URL。 您也可以直接瀏覽至 https://<app-name>.azurewebsites.net

螢幕擷取畫面:顯示如何從 Azure 入口網站啟動 App Service。

第 2 步:將幾項工作新增至清單。 恭喜,您正在 Azure App Service 中執行資料驅動的安全 PHP 應用程式。

在 App Service 中執行的 Laravel 應用程式螢幕快照。

提示

應用程式範例會實作另行快取模式。 當您進行資料變更後重新載入頁面時,網頁中顯示的回應時間會較快,因為這是從快取載入資料而不是從資料庫載入。

7 - 串流診斷記錄

Azure App Service 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 樣本應用程式在其每個端點中輸出主控台記錄訊息,以展示此功能。 根據預設,Laravel 的記錄功能 (例如 Log::info()) 會輸出至本機檔案。 您先前的 LOG_CHANNEL 應用程式設定讓您能從 App Service 記錄資料流存取記錄項目。

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中,選取 [App Service 記錄]
  2. 在 [應用程式記錄] 下,選取 [檔案系統]

螢幕擷取畫面:顯示如何在 Azure 入口網站中啟用 App Service 的原生記錄。

步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。

螢幕擷取畫面:顯示如何在 Azure 入口網站中檢視記錄串流。

清除資源

完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。

步驟 1:在 Azure 入口網站頂端的搜尋列中:

  1. 輸入資源群組名稱。
  2. 選取資源群組。

螢幕擷取畫面:顯示如何在 Azure 入口網站中搜尋並瀏覽至資源群組。

步驟 2:在資源群組頁面中,選取 [刪除資源群組]

螢幕擷取畫面:顯示 Azure 入口網站中 [刪除資源群組] 按鈕的位置。

步驟 3:

  1. 輸入您確認要刪除的資源群組名稱。
  2. 選取 [刪除]

Azure 入口網站中刪除資源群組確認對話方塊的螢幕擷取畫面。 :

常見問題集

這設定會產生多少費用?

建立資源的定價如下:

  • 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 檔案:

兩項作業程序花費的大部分時間都是上傳和下載成品。 如有需要,您可以將這兩個作業合併成一個作業來簡化工作流程檔案,這樣就不需要上傳和下載步驟。

下一步

前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。

或者,查看其他資源: