教學課程:將 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 應用程式。

Screenshot of the Azure app example titled Task List showing new tasks added.

如果您沒有 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 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard.

步驟 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. 驗證完成時,選取 [建立]

A screenshot showing how to configure a new app and database in the Web App + Database wizard.

步驟 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 解析。

A screenshot showing the deployment process completed.

2 - 設定資料庫連線

步驟 1 :在 [App Service] 頁面上的左側功能表,選取 [設定]

A screenshot showing how to open the configuration page in App Service.

步驟 2:

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

A screenshot showing how to create an app setting.

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

  1. 選取 [新增應用程式設定]
  2. 在 [名稱] 欄位中輸入 CACHE_DRIVER
  3. 在 [值] 欄位中輸入 redis
  4. 選取 [確定]。 Laravel 應用程式程式碼中已使用 CACHE_DRIVER。 此設定會告知 Laravel 使用 Redis 作為其快取。

A screenshot showing how to see the autogenerated connection string.

步驟 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. 出現提示時,請選取 [繼續]

A screenshot showing how to save settings in the configuration page.

重要

為方便起見,此處使用 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. 選取 [建立派生]

A screenshot showing how to create a fork of the sample GitHub repository.

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

A screenshot showing how to open the Visual Studio Code browser experience in GitHub.

步驟 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_ 設定是建立精靈為您建立的。

A screenshot showing Visual Studio Code in the browser and an opened file with modified MySQL variables.

步驟 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_ 設定是建立精靈為您建立的。

A screenshot showing Visual Studio Code in the browser and an opened file with modified Redis variables.

步驟 5:

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

A screenshot showing the changes being committed and pushed to GitHub.

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

A screenshot showing how to open the deployment center in App Service.

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

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

A screenshot showing how to configure CI/CD using GitHub Actions.

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

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

A screenshot showing how to open deployment logs in the deployment center.

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

A screenshot showing a GitHub run in progress.

4 - 產生資料庫結構描述

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

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

A screenshot showing how to open the SSH shell for your app from the Azure portal.

步驟 2:在 SSH 終端機中:

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

A screenshot showing the commands to run in the SSH shell and their output.

5 - 變更網站根目錄

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

步驟 1:

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

A screenshot showing how to open the general settings tab in the configuration page of App Service.

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

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

A screenshot showing how to configure a startup command in App Service.

6 - 瀏覽至應用程式

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

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

A screenshot showing how to launch an App Service from the Azure portal.

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

A screenshot of the Laravel app running in App Service.

提示

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

7 - 串流診斷記錄

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

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

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

A screenshot showing how to enable native logs in App Service in the Azure portal.

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

A screenshot showing how to view the log stream in the Azure portal.

清除資源

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

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

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

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

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

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

步驟 3:

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

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal.

常見問題集

這設定會產生多少費用?

建立資源的定價如下:

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

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

下一步

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

或者,查看其他資源: