共用方式為


教學課程:將 PHP、MySQL 和 Redis 應用程式部署至 Azure App Service

本教學課程示範如何在 Azure App Service 中建立安全的 PHP 應用程式,以連線到 MySQL 資料庫(使用適用於 MySQL 的 Azure 資料庫彈性伺服器)。 您也將部署 Azure Cache for Redis 以在應用程式中啟用快取程式碼。 Azure App Service 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 完成後,Linux 上的 Azure App Service 上將會執行 Laravel 應用程式。

標題為 [工作清單] 的 Azure 應用程式範例螢幕快照,其中顯示已新增的工作。

先決條件

1 - 執行範例

首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,範例存放庫 (英文) 包含開發容器 (英文) 設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。

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

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

步驟 2:在 GitHub fork 中:

  1. 選取 [程式碼]>[在主分支上建立 Codespace]。 設定 Codespace 需要幾分鐘的時間。 此外,提供的 .env 檔案已經包含 Laravel 必須在本機執行的虛擬APP_KEY變數

步驟 3:在 codespace 終端機中:

  1. 執行 composer install
  2. 使用 php artisan migrate 執行資料庫移轉。
  3. 使用 php artisan serve 執行應用程式。
  4. 當您看到通知 Your application running on port 80 is available. 時,請選取 [在瀏覽器中開啟]。 您應該會在新的瀏覽器索引標籤中看到應用程式範例。若要停止應用程式,請鍵入 Ctrl+C

有問題嗎? 查看疑難排解區段

2 - 建立 App Service、資料庫和快取

在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設安全的資源,包括 App Service、適用於 MySQL 的 Azure 資料庫,以及 Azure Cache for Redis。 針對建立程序,您會指定:

  • Web 應用程式的 [名稱]。 它用來做為應用程式的 DNS 名稱的一部分。
  • 要實際執行應用程式的區域。 其也會作為您應用程式的 DNS 名稱的一部分來使用。
  • 應用程式的執行階段堆疊。 您可以在此處選取要用於應用程式的 PHP 版本。
  • 應用程式的託管方案。 這是定價等級,其中包含應用程式的一組功能和擴充能力。
  • 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。

登入 Azure 入口網站,遵循下列步驟建立您的 Azure App Service 資源。

步驟 1:在 Azure 入口網站中:

  1. 在頂端搜尋列中,輸入 App Service
  2. 請在 [服務] 標題下選取標示為 App Service 的項目。
  3. 選取 [建立>Web 應用程式]。 您也可以直接瀏覽至建立精靈

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

  1. 名稱msdocs-laravel-mysql-XYZ。 系統會為您產生名為 msdocs-laravel-mysql-XYZ_group 的資源群組。
  2. 運行時間堆疊PHP 8.4
  3. 作系統Linux
  4. [區域]:您附近的任何 Azure 區域。
  5. Linux 方案新建 並使用 msdocs-laravel-mysql-XYZ 名稱。
  6. 定價方案基本。 準備好時,您可以 升級 至不同的定價層。

步驟 3:

  1. 選取 資料庫 索引標籤。
  2. 選取 [建立資料庫]。
  3. [引擎] 中,選取 [MySQL - 彈性伺服器]。
  4. 選取 建立 Azure Cache for Redis
  5. 在 [ 名稱 ] 中(在 [快取] 底下,輸入快取的名稱。
  6. [SKU] 中,選取 [ 基本]。

步驟 4:

  1. 選取 [部署] 索引標籤。
  2. 啟用 持續部署
  3. [組織] 中,選取您的 GitHub 別名。
  4. 在 [存放庫] 中,選取 [laravel-tasks]
  5. 在 [分支] 中,選取 [主要]
  6. 請確定 已停用基本身份驗證
  7. 選取 [檢閱 + 建立]。
  8. 驗證完成時,選取 [建立]

步驟 5: 部署需要幾分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用,但同時會建立下列資源:

  • 資源群組:所有已建立資源的容器。
  • App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
  • App Service:代表您的應用程式,並在 App Service 方案中執行。
  • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
  • 私人端點:虛擬網路中資料庫伺服器和 Redis 快取的存取端點。
  • 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
  • 適用於 MySQL 的 Azure 資料庫彈性伺服器:只能從其私人端點後方存取。 系統會為您在伺服器上建立資料庫和使用者。
  • Azure Cache for Redis:只能從其私人端點後方存取。
  • 私人 DNS 區域:啟用虛擬網路中資料庫伺服器和 Redis 快取的 DNS 解析。

3 - 保護聯機秘密

建立精靈已為您產生連線變數做為應用程式設定。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 您將利用服務連接器將您的祕密移至金鑰保存庫,並將您的應用程式設定變更為 Key Vault 參考

步驟 1:擷取現有的 連接字串

  1. 在 App Service 頁面的左側功能表中,選取 [ 設定 > 環境變數]。
  2. 選取 [連接字串]。
  3. 選取 AZURE_MYSQL_CONNECTIONSTRING
  4. [新增/編輯應用程式] 設定的 [ ] 字段中,複製使用者名稱和密碼以供稍後使用。 連接字串可讓您連線到私人端點後方所保護的 MySQL 資料庫。 不過,秘密會直接儲存在App Service 應用程式中,這不是最好的。 您要變更此設定。

步驟 2:建立金鑰保存庫以安全地管理秘密

  1. 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace]> [Key Vault]
  2. [資源群組] 中,選取 [msdocs-laravel-mysql-XYZ_group]。
  3. 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
  4. [區域] 中,將它設定為與資源群組相同的位置。

步驟 3:使用私人端點保護金鑰保存庫

  1. 選取網路索引標籤。
  2. 取消選取 [啟用公用存取]
  3. 選取 [建立私人端點]
  4. [資源群組] 中,選取 [msdocs-laravel-mysql-XYZ_group]。
  5. 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
  6. [名稱] 中,輸入 msdocs-laravel-mysql-XYZVaultEndpoint
  7. [虛擬網络] 中,選取 msdocs-laravel-mysql-XYZ_group 群組中的虛擬網络。
  8. [子網] 中,選取可用的兼容子網。 為了方便起見,Web 應用程式精靈已建立它。
  9. 選取 [確定]
  10. 選取 檢閱 + 建立,然後選取 建立。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。

步驟 4:建立 MySQL 連接器

  1. 在頂端搜尋列中,輸入 msdocs-laravel-mysql,然後選取名為 msdocs-laravel-mysql-XYZ 的 App Service 資源。
  2. 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]
  3. 選取 ,創建
  4. 針對 [服務類型],選取 [適用於 MySQL 的 DB 彈性伺服器]。
  5. 針對 MySQL 彈性伺服器,選取您的伺服器(例如 msdocs-laravel-mysql-235-server)。
  6. 針對 MySQL 資料庫,選取您的資料庫(例如 msdocs-laravel-mysql-235-database)。

步驟 5:設定 MySQL 連接器的驗證

  1. 選擇「驗證」索引標籤。
  2. 選取 [ 連接字串]。
  3. 在 [密碼] 中,貼上您先前複製的密碼。
  4. 選取 [在 Key Vault 中儲存秘密]
  5. 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。

步驟 6:建立 Key Vault 連線

  1. [建立連線] 對話方塊中,於[金鑰保存庫],選取您稍早建立的金鑰保存庫。
  2. 按一下 檢閱 + 建立
  3. 驗證完成時,請選取 建立

步驟 6:完成 MySQL 連接器設定

  1. 您回到 [MySQL 連接器] 對話框。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[Key Vault 連線] 下拉式清單會自動加以選取。
  2. 按一下 檢閱 + 建立
  3. 選取 ,創建。 等到 [更新成功] 通知出現為止。

步驟 7:設定 Redis 連接器以使用 Key Vault 機密

  1. 在 [服務連接器] 頁面中,選取 [Redis 快取] 連接器旁的複選框,然後選取 [ 編輯]。
  2. 選擇「驗證」索引標籤。
  3. 選取 [在 Key Vault 中儲存秘密]
  4. 在 [Key Vault 連線] 底下,選取您建立的金鑰保存庫。
  5. 請選取「下一步:網路」。
  6. 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
  7. 選擇儲存。 等到 [更新成功] 通知出現為止。

步驟 8:確認 金鑰保存庫 整合

  1. 從左側功能表中,再次選取 [ 設定 > 環境變數 ]。
  2. AZURE_MYSQL_PASSWORD旁,選取 [顯示值]。 該值應該是@Microsoft.KeyVault(...),這表示它是金鑰庫參考,因為密鑰現在由金鑰庫管理。
  3. 若要確認 Redis 連接字串,請選取 [AZURE_REDIS_CONNECTIONSTRING] 旁的 [顯示值]

總結來說,確保連線秘密的程序為:

  • 從 App Service 應用程式的環境變數擷取連線秘密。
  • 建立金鑰保存庫。
  • 使用系統指派的受控識別建立 金鑰保存庫 連線。
  • 更新服務連接器以將秘密儲存在金鑰保存庫中。

有問題嗎? 查看疑難排解區段


4 - 設定 Laravel 變數

步驟 1: 建立 CACHE_DRIVER 為應用程式設定。

  1. 在 [ 應用程式設定] 索引標籤中,選取 [ 新增]。
  2. 在 [名稱] 欄位中輸入 CACHE_DRIVER
  3. 在 [值] 欄位中輸入 redis
  4. 選取 [套用],然後再次 套用 ,然後 選取 [確認]。

步驟 2: 使用 步驟 1 中的相同步驟,建立下列應用程式設定:

  • 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

在理想情況下, APP_KEY 應用程式設定也應該設定為密鑰保存庫參考,這是多步驟程式。 如需詳細資訊,請參閱 如何將APP_KEY應用程式設定變更為 Key Vault 參考?

5 - 部署範例程序代碼

在此步驟中,請使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push 都會開始建置和部署動作。

步驟 1: 回到範例分支的 GitHub 程式代碼空間中,執行 git pull origin main。 這會將新認可的工作流程檔案提取到您的 Codespace。

步驟 2 (選項 1:使用 GitHub Copilot):

  1. 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
  2. 問:「@workspace應用程式如何連線到資料庫和 redis?」Copilot 可能會提供您在 config/database.php 中設定設定方式的一些說明。
  3. 詢問:「@workspace在生產模式中,我的應用程式正在App Service Web 應用程式中執行,而App Service Web 應用程式會使用 Azure 服務連接器來連線到 MySQL 彈性伺服器。我需要使用的環境變數名稱為何?」Copilot 可能會提供類似 選項 2:下列 GitHub Copilot 步驟的程式代碼建議,甚至告訴您在 config/database.php 檔案中進行變更。
  4. 在總管中開啟 config/database.php,然後新增程式碼建議。
  5. 詢問:「@workspace 我的 App Service 應用程式也會使用 Azure 服務連接器,使用 Django 用戶端類型連線到 Cache for Redis。 我需要使用哪些環境變數名稱?*“ Copilot 可能會提供類似選項 2 中的程式碼建議:沒有下面的 GitHub Copilot 步驟,甚至告訴您在 config/database.php 檔案中進行變更。 如果出現提示,請登入 GitHub Copilot for Azure 以取得更精確的答案。
  6. 新增程式碼建議。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

步驟 2 (選項 2:不含 GitHub Copilot):

  1. 在檔案總管中開啟 config/database.php 。 尋找 mysql 區段,並進行下列變更:
  2. 將 (第 49 行) 取代 DB_HOSTAZURE_MYSQL_HOST
  3. 將 (列 51) 取代 DB_DATABASEAZURE_MYSQL_DBNAME
  4. 將 (第 52 行) 取代 DB_USERNAMEAZURE_MYSQL_USERNAME
  5. 將 [第 53 行] 取代 DB_PASSWORDAZURE_MYSQL_PASSWORD
  6. 將 (第 50 行) 取代 DB_PORTAZURE_MYSQL_PORT
  7. 捲動至 [Redis] cache 區段並進行下列變更:
  8. 將 (行 142) 取代 REDIS_HOSTAZURE_REDIS_HOST
  9. 將 (第 144 行) 取代 REDIS_PASSWORDAZURE_REDIS_PASSWORD
  10. 將 (第 145 行) 取代 REDIS_PORTAZURE_REDIS_PORT
  11. 將 (行 146) 取代 REDIS_CACHE_DBAZURE_REDIS_DATABASE
  12. 在相同的區段中,新增一行,內容是 'scheme' => 'tls',。 此設定會告知 Laravel 使用加密以連線至 Redis。

步驟 3:

  1. 選取 Source Control 擴充功能。
  2. 在文字方塊中,輸入提交訊息,例如 Configure Azure database and cache connections。 或者,選取 並讓 GitHub Copilot 為您產生認可訊息。
  3. 請選擇認可,然後使用來確認。
  4. 選取 [同步變更 1],然後使用 [確定] 來確認。

步驟 4: 回到 Azure 入口網站的 [部署中心] 頁面:

  1. 選取記錄索引標籤,然後選取重新整理以查看新的部署執行結果。
  2. 在部署執行的記錄項目中,選取最新時間戳記的 建置/部署記錄 條目。

步驟 5: 系統會帶您前往 GitHub 存放庫,並查看 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行顯示成功狀態。 大約需要 10 分鐘的時間。

有問題嗎? 查看疑難排解區段

6 - 產生資料庫架構

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

第 1 步:回到 App Service 頁面,於左側選單中,

  1. 選取 [開發工具>SSH]。
  2. 選取 [開始]

步驟 2:在 SSH 終端機中:

  1. 執行 cd /home/site/wwwroot。 這裡是您所有已部署的檔案。
  2. 執行 php artisan migrate --force。 如果成功,App Service 已成功連線至 MySQL 資料庫。

小提示

在 SSH 工作階段中,只有 /home 中檔案的變更才能在應用程式重新啟動之後保存。 /home 以外的變更不會保存。

7 - 變更網站根目錄

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

步驟 1:

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

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

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

8 - 進入應用程式

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

  1. 從左側功能表中選取 [概觀]
  2. 選取您應用程式 的預設網域

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

小提示

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

9 - 串流診斷記錄

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

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

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

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

清除資源

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

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

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

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

步驟 3:

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

2.建立 Azure 資源並部署應用程式範例

在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和適用於 MySQL 的 Azure 資料庫。

GitHub Codespace 已經有 Azure 開發人員 CLI (AZD)。

  1. 使用 php artisan key:generate --show產生 Laravel 加密金鑰:

    php artisan key:generate --show
    
  2. 執行 azd auth login 命令並遵循提示來登入 Azure:

    azd auth login
    
  3. 使用 azd up 命令建立必要的 Azure 資源,並部署應用程式程式碼。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。

    azd up
    
  4. 出現提示時,請提供下列答案:

    問題 回答
    輸入新的環境名稱 輸入唯一名稱。 AZD 範本會使用此名稱作為 Azure 中 Web 應用程式的 DNS 名稱一部分 (<app-name>-<hash>.azurewebsites.net)。 允許英數字元與連字號。
    選取要使用的 Azure 訂用帳戶 選取您的訂用帳戶。
    選取要使用的 Azure 位置 選取位置。
    輸入 『appKey』 基礎結構安全參數的值 請在這裡使用 php artisan key:generate --show 的輸出。 AZD 樣本會為其建立金鑰保存庫秘密,以供您在應用程式中使用。
    輸入 『databasePassword』 基礎結構安全參數的值 MySQL 的資料庫密碼。 長度必須至少為 8 個字元,且包含大寫字母、小寫字母、數位和特殊字元。

    azd up 命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 它也會編譯及部署您的應用程式程序代碼,但您稍後會修改程序代碼以使用App Service。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。 完成時,命令也會顯示部署應用程式的連結。

    此 AZD 範本包含使用下列 Azure 資源產生預設安全架構的檔案 (azure.yamlinfra 目錄):

    • 資源群組:所有已建立資源的容器。
    • App Service 方案:定義 App Service 的計算資源。 系統會在 B1 層中建立 Linux 方案。
    • App Service:代表您的應用程式,並在 App Service 方案中執行。
    • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
    • 適用於 MySQL 的 Azure 資料庫 彈性伺服器:只能透過 DNS 區域整合從虛擬網路存取。 系統會為您在伺服器上建立資料庫。
    • Azure Cache for Redis:只能從虛擬網路中存取。
    • 私人端點:虛擬網路中的金鑰保存庫和 Redis 快取的存取端點。
    • 私人 DNS 區域:啟用虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的 DNS 解析。
    • Log Analytics 工作區:作為應用程式傳送記錄的目標容器,您也可以在其中查詢記錄。
    • 金鑰保存庫:當您使用 AZD 重新部署時,用來保留資料庫密碼。

有問題嗎? 查看疑難排解區段

3.在應用程式程序代碼中使用 Azure 連接字串

您使用的 AZD 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。

  1. 在 AZD 輸出中,尋找以 AZURE_MYSQL_AZURE_REDIS_開頭的應用程式設定。 只會顯示設定名稱。 其在 AZD 輸出中看起來像這樣:

     App Service app has the following app settings:
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
             - AZURE_MYSQL_DBNAME
             - AZURE_MYSQL_FLAG
             - AZURE_MYSQL_HOST
             - AZURE_MYSQL_PASSWORD
             - AZURE_MYSQL_PORT
             - AZURE_MYSQL_USERNAME
             - AZURE_REDIS_DATABASE
             - AZURE_REDIS_HOST
             - AZURE_REDIS_PASSWORD
             - AZURE_REDIS_PORT
             - AZURE_REDIS_SSL
     

    開頭 AZURE_MYSQL_ 為 的設定是 MySQL 資料庫的連線變數,而開頭 AZURE_REDIS_ 為的設定則為 Redis 快取的設定。 您稍後需要在程式碼中使用它們。 為了方便起見,AZD 範本會顯示 Azure 入口網站中應用程式設定頁面的直接連結。

  2. 從檔案總管開啟 config/database.php。 這是資料庫和 Redis 快取連線的組態檔。

  3. 尋找定義mysql連接的部分(第 46-64 行),並將DB_HOSTDB_PORTDB_DATABASEDB_USERNAMEDB_PASSWORD替換為AZD輸出中的AZURE_MYSQL_應用程式設定。 您的 mysql 連線看起來應該像下列程序代碼。

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('AZURE_MYSQL_HOST', '127.0.0.1'),
        'port' => env('AZURE_MYSQL_PORT', '3306'),
        'database' => env('AZURE_MYSQL_DBNAME', 'forge'),
        'username' => env('AZURE_MYSQL_USERNAME', 'forge'),
        'password' => env('AZURE_MYSQL_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    

    如需 Laravel 中資料庫組態的詳細資訊,請參閱 Laravel 檔

  4. 尋找定義 Redis 快取連線的部分(第 140-147 行),並將 REDIS_HOSTREDIS_PASSWORDREDIS_PORTREDIS_CACHE_DB 替換為 AZD 輸出中的 Azure_REDIS_ 應用程式設定。 此外,將 'scheme' => 'tls', 添加至連線。 快取連線看起來應該如下列程式碼所示:

    'cache' => [
        'scheme' => 'tls',
        'url' => env('REDIS_URL'),
        'host' => env('AZURE_REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('AZURE_REDIS_PASSWORD'),
        'port' => env('AZURE_REDIS_PORT', '6379'),
        'database' => env('AZURE_REDIS_DATABASE', '1'),
    ],
    

    如需 Laravel 中 Redis 快取組態的詳細資訊,請參閱 Laravel 檔

    備註

    請記住,尚未部署您的變更。 您將在下一個步驟結束時部署它們。

4.在 Web 應用程式中設定 Laravel 設定

  1. 從檔案總管開啟 infra/resources.bicep。 這是定義所建立 Azure 資源的 Bicep 檔案。

  2. 尋找定義應用程式設定的部分(第 510-514 行)並解除註解。 這些應用程式設定如下:

    設定 說明
    CACHE_DRIVER 告訴 Laravel 使用 Redis 作為其快取 (請參閱 Laravel 檔)。
    MYSQL_ATTR_SSL_CA 需要 開啟 Azure 中 MySQL 的 TLS 連線。 為了方便起見,憑證檔案會包含在範例存放庫中。 此變數會被 config/database.php 中的 mysql 聯機使用
    LOG_CHANNEL 告知 Laravel 將記錄傳送至 stderr,讓其可供 App Service 記錄使用(請參閱 Laravel 檔)。
    APP_DEBUG 在 Laravel 中啟用偵錯模式頁面(請參閱 Laravel 檔)。
    APP_KEY Laravel 加密變數。 AZD 範本已建立 Key Vault 密碼(第 212-217 行),因此您可以使用 Key Vault 參考來存取。
  3. infra/resources.bicep 中,尋找 App Service 應用程式的資源定義,並取消批注第 315 行:

    appCommandLine: 'cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload'
    

    Laravel 應用程式生命週期/public 目錄開始,而不是應用程式根目錄。 App Service 的預設 PHP 容器會使用 Nginx,這會在應用程式根目錄中啟動。 若要變更網站根目錄,您必須變更 PHP 容器中的 Nginx 設定檔 (/etc/nginx/sites-available/default)。 為了方便起見,範例存放庫包含稱為 default 的取代組態檔,可告訴 Nginx 查看 /public 目錄。 每當應用程式開始套用應用檔案取代,或每當 Linux 容器從初始狀態重新載入時,appCommandLine 中的這個自訂命令就會執行。

  4. 回到 Codespace 終端機,再次執行 azd up

    azd up
    

小提示

azd up 會一起執行 azd packageazd provisionazd deploy ,因為您同時進行基礎結構和應用程式變更,所以很合理。 若要只進行基礎結構變更,請執行 azd provision。 若只要將變更部署至應用程式程式碼,請執行 azd deploy

有問題嗎? 查看疑難排解區段

5.產生資料庫結構

使用受虛擬網路保護的 MySQL 資料庫,在 App Service 的 Linux 容器中透過 SSH 會話執行 Laravel 資料庫移轉是最簡單的方式。

  1. 在 AZD 輸出中,尋找 SSH 工作階段的 URL,並在瀏覽器中瀏覽至目標。 輸出中看起來像這樣:

     Open SSH session to App Service container at: <URL>
     
  2. 在 SSH 工作階段中,從 /home/site/wwwroot 目錄執行資料庫移轉:

    cd /home/site/wwwroot
    php artisan migrate --force
    

    如果成功,App Service 已成功連線至資料庫

備註

只有 /home 中檔案的變更才能在應用程式重新開機之後保存。

有問題嗎? 查看疑難排解區段

6.瀏覽至應用程式

  1. 在 AZD 輸出中,尋找您應用程式的 URL,然後在瀏覽器中開啟該 URL。 AZD 輸出中 URL 看起來像這樣:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
     
  2. 將幾項工作新增至清單。

    在 Azure 中執行的使用 MySQL 的 Laravel Web 應用程式的螢幕擷取畫面,顯示工作。

    恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至適用於 MySQL 的 Azure 資料庫。

有問題嗎? 查看疑難排解區段

7.資料流診斷記錄

Azure App Service 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 為了方便起見,AZD 範本已啟用本機檔案系統日誌功能,並將日誌送至 Log Analytics 工作區

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

Route::get('/', function () {
    Log::info("Get /");
    $startTime = microtime(true);
    // Simple cache-aside logic
    if (Cache::has('tasks')) {
        $data = Cache::get('tasks');
    } else {
        $data = Task::orderBy('created_at', 'asc')->get();
        Cache::add('tasks', $data);
    }
    return view('tasks', ['tasks' => $data, 'elapsed' => microtime(true) - $startTime]);
});

在 AZD 的輸出中,找到用於傳送 App Service 記錄的連結,然後在瀏覽器中打開該連結。 連結在 AZD 輸出中看起來像這樣:

Stream App Service logs at: <URL>

有問題嗎? 查看疑難排解區段

8.清除資源

若要刪除目前部署環境中的所有 Azure 資源,請執行 azd down 並遵循提示。

azd down

故障排除

我在資料庫移轉期間收到錯誤 php_network_getaddresses: getaddrinfo for mysqldb failed: No address associated with hostname...

它表示 MySQL 連線變數未正確設定。 確認 AZURE_MYSQL_ 應用程式設定正確設定於:3.在應用程式程式碼中使用 Azure 連接字串

我在瀏覽器中看到空白頁面。

它表示 App Service 在 /public 中找不到 PHP 啟動檔案。 請遵循 4 中的步驟 。在 Web 應用程式中設定 Laravel 設定

我在瀏覽器中看到顯示 Unsupported cipher or incorrect key length. 的偵錯頁面

這表示 APP_KEY 設定已設為無效的金鑰。 當您執行 azd up時,請務必將 appKey 設置為 php artisan key:generate --show 的輸出。

我在瀏覽器中看到顯示 Uncaught Error: Class "Illuminate\..." not found. 的偵錯頁面

此錯誤和類似的錯誤表示您未在composer install之前執行azd up,或者/vendor目錄中的套件已過時。 再次執行 composer installazd deploy

我在瀏覽器中看到顯示 php_network_getaddresses: getaddrinfo for redishost failed: Name or service not known. 的偵錯頁面

它表示 Redis 連接變數未正確設定。 確認 AZURE_REDIS_ 應用程式設定正確設定於:3.在應用程式程式碼中使用 Azure 連接字串

我在瀏覽器中看到顯示 SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXX-XXXXXXXXX-mysql-database.tasks' doesn't exist 的偵錯頁面

這表示您尚未執行資料庫移轉,或資料庫移轉未成功。 請遵循步驟 5。產生資料庫架構

常見問題集

這設定會產生多少費用?

已建立資源的價格如下:

  • 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 與虛擬網路整合

如何將APP_KEY應用程式設定變更為 Key Vault 參考?

4 - 設定 Laravel 變數中的入口網站步驟,您可以在 GitHub Codespace 中執行下列 Azure CLI 命令,以變更 APP_KEY 為 Key Vault 參考:

# Change the following variables to match your environment
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
KEY_VAULT_NAME=<key-vault-name>
APP_SERVICE_NAME=<app-name>
SECRET_NAME=laravelAppKey

# Set the subscription ID
az account set --subscription $SUBSCRIPTION_ID

# Assign 'Key Vault Secrets Officer' role to your user at the scope of the key vault
az role assignment create \
  --assignee $(az ad signed-in-user show --query id -o tsv) \
  --role $(az role definition list --name "Key Vault Secrets Officer" --query "[].id" -o tsv) \
  --scope $(az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)

# Add the secret to the key vault
az keyvault secret set \
  --vault-name $KEY_VAULT_NAME \
  --name $SECRET_NAME \
  --value $(php artisan key:generate --show)

# Add Key Vault reference to the App Service configuration
az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP_SERVICE_NAME \
  --settings "APP_KEY=@Microsoft.KeyVault(SecretUri=https://$KEY_VAULT_NAME.vault.azure.net/secrets/$SECRET_NAME)"

您也可以在入口網站中執行相同的動作。 如需詳細資訊,請參閱:

  1. Key Vault 範圍的角色指派
  2. 將秘密新增至 金鑰保存庫
  3. 從 金鑰保存庫 擷取秘密
  4. 設定應用程式設定

本機應用程式開發如何與 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 檔案:

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

我沒有權限可建立使用者指派的身分識別

請參閱透過部署中心設定 GitHub Actions 部署

我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

您可能注意到建立 codespace 時,GitHub Copilot 聊天檢視已可供您使用。 為了方便起見,我們會在容器定義中包含 GitHub Copilot 聊天延伸模組 (請參閱 .devcontainer/devcontainer.json)。 不過,您需要一個 GitHub Copilot 帳戶 (英文) (可免費試用 30 天)。

與 GitHub Copilot 交談時,有幾項提示可供您使用:

  • 在單一聊天工作階段中,問題和答案相互關聯,您可以調整問題來微調取得的答案。
  • 根據預設,GitHub Copilot 無法存取存放庫中的任何檔案。 若要詢問檔案相關問題,請先在編輯器中開啟檔案。
  • 為了讓 GitHub Copilot 在準備其解答時存取存放庫中的所有檔案,請在問題開頭加上 @workspace。 如需詳細資訊,請參閱Use the @workspace agent
  • 在聊天中,GitHub Copilot 可以建議變更,(使用 @workspace) 甚至可以建議在何處進行變更,但無法替您進行變更。 您可以自行新增建議的變更並加以測試。

下一步

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

或者,查看其他資源: