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

本教學示範如何在 Azure App 服務 中建立安全的 PHP 應用程式,並透過 適用於 MySQL 的 Azure 資料庫 Flexible Server 連接到 MySQL 資料庫。 要使用 Azure Managed Redis,請遵循 Azure Developer CLI 步驟。 Azure App 服務 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 完成後,你會有一個在 Azure Linux 上的 App Service 上運行的 Laravel 應用程式。

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

先決條件

執行範例程式

先建立一個以數據為基礎的範例應用程式作為起點。 範例倉庫包含開發容器設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。

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

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

步驟 2:在 GitHub fork 中:

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

步驟 3:在 codespace 終端機中:

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

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

建立應用程式服務與資料庫

在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和適用於 MySQL 的 Azure 資料庫。 在建立流程中,請指定:

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

登入 Azure 入口網站。 請依照以下步驟建立您的 Azure App 服務 資源。

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

  1. 在頂端搜尋列中,輸入 App Service。
  2. 請在 [服務] 標題下選取標示為 App Service 的項目。
  3. 選取 [建立>Web 應用程式]。 你也可以直接進入 「建立網頁應用程式 」。

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

  1. 名稱: msdocs-laravel-mysql。 Azure 入口網站建立了一個名為 msdocs-laravel-mysql_group 的資源群組。
  2. 執行時堆疊: PHP 8.3。
  3. 作系統: Linux。
  4. [區域]:您附近的任何 Azure 區域。
  5. Linux 計畫: 建立新 檔案並使用 msdocs-laravel-mysql 這個名稱。
  6. 定價方案: 基本。 準備好時,您可以 升級 至不同的定價層。

步驟 3:

  1. 選擇 「下一步 」以進入 資料庫 分頁。
  2. 選取 [建立資料庫]。
  3. 在 [引擎] 中,選取 [MySQL - 彈性伺服器]。
  4. 不要選取「建立 Azure Cache for Redis」。

步驟 4:

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

步驟 5: 部署需要幾分鐘的時間才能完成。 要查看網頁應用程式,請選擇 前往資源。 部署會產生以下資源:

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

安全連線秘密

部署已經在應用程式設定中產生連線能力變數。 安全最佳做法是完全將秘密排除在 App Service 之外。 將你的秘密移到金鑰保險庫,並利用服務連接器將應用程式設定改為 金鑰庫參考 。

步驟一: 取回現有的連接串。

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

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

  1. 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace]> [金鑰保存庫]。
  2. 在 資源群組中,選擇 msdocs-laravel-mysql_group。
  3. 在 鑰匙庫名稱中,輸入一個僅由字母和數字組成的名稱。
  4. 在 區域中,選擇與資源群組相同的位置。

步驟三: 用私人端點保護金鑰庫。

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

步驟四: 建立 MySQL 連接器。

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

步驟五: 設定 MySQL 連接器的認證。

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

步驟六: 建立金鑰庫連線。

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

步驟七: 完成 MySQL 連接器設定。

  1. 您會返回 [MySQL 連接器] 對話方塊。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成後, 金鑰保存庫 Connection 會自動選擇它。
  2. 按一下 檢閱 + 建立。
  3. 選取 ,創建。 等到 [更新成功] 通知出現為止。

步驟八:請確認 金鑰保存庫 的整合。

  1. 從左側選單再次選擇 設定>環境變數 。
  2. 在 AZURE_MYSQL_PASSWORD旁,選取 [顯示值]。 該值應該是@Microsoft.KeyVault(...),這表示它是金鑰庫參考,因為密鑰現在由金鑰庫管理。

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

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

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


配置 Laravel 變數

步驟一: 請建立以下應用程式設定。 完成後,選擇 「套用 」以更新 你的應用程式設定。

  1. 在你的網頁應用程式中,選擇 設定>的環境變數。
  2. 在 [ 應用程式設定] 索引標籤中,選取 [ 新增]。
  • MYSQL_ATTR_SSL_CA:用 /etc/ssl/certs/ca-certificates.crt 作為值。 此應用程式設定會指向存取 MySQL 伺服器所需的 TLS/SSL 憑證路徑。 它包含在 App Service 平台上。
  • 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應用程式設定變更為 金鑰保存庫 參考?

部署範例程式碼

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

步驟 1: 回到範例分支的 GitHub 程式代碼空間中,執行 git pull origin main。 此指令會將新提交的工作流程檔案拉入你的程式碼空間。

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

  1. 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
  2. 問:「@workspace 這個應用程式怎麼連接到資料庫?Copilot或許能解釋一下設定/database.php 裡的設定是怎麼設定的。
  3. 問:「@workspace在生產模式下,我的應用程式運行在一個 App Service 網頁應用程式中,該應用程式使用 Azure Service Connector 連接到 MySQL 的彈性伺服器。我需要使用哪些環境變數名稱?」Copilot 可能會給你類似選項 2 的程式碼建議 :沒有 GitHub Copilot 的步驟,甚至會告訴你要在 設定檔/設定檔database.php 裡做修改。
  4. 在總管中開啟 config/database.php,然後新增程式碼建議。

GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?。

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

  1. 在檔案總管中開啟 config/database.php 。 尋找 mysql 區段,並進行下列變更:
  2. 將 (第 49 行) 取代 DB_HOST 為 AZURE_MYSQL_HOST。
  3. 將 (列 51) 取代 DB_DATABASE 為 AZURE_MYSQL_DBNAME。
  4. 將 (第 52 行) 取代 DB_USERNAME 為 AZURE_MYSQL_USERNAME。
  5. 將 [第 53 行] 取代 DB_PASSWORD 為 AZURE_MYSQL_PASSWORD。
  6. 將 (第 50 行) 取代 DB_PORT 為 AZURE_MYSQL_PORT。

步驟 3:

  1. 選取 Source Control 擴充功能。
  2. 在文字框中輸入提交訊息,例如「配置 Azure 資料庫連線」。 或者,選取 並讓 GitHub Copilot 為您產生認可訊息。
  3. 請選擇認可,然後使用是來確認。
  4. 選取 [同步變更 1],然後使用 [確定] 來確認。

步驟 4:

  1. 在 Azure 入口網站,打開你的網頁應用程式,然後選擇 部署>部署中心。
  2. 選擇 日誌,然後選擇 重新整理 以查看新的部署執行。
  3. 在部署執行的記錄項目中,選取最新時間戳記的 建置/部署記錄 條目。

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

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

產生資料庫結構

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

步驟一: 回到 App Service 頁面,左側選單:

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

步驟 2:在 SSH 終端機中:

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

小提示

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

改變站點根目錄

Laravel 應用程式生命週期是在 /public 目錄中啟動。 App Service 的預設 PHP 容器會使用 Nginx,這會在應用程式的根目錄中啟動。 若要變更網站根目錄,您必須變更 PHP 容器中的 Nginx 設定檔 (/etc/nginx/sites-available/default)。 範例儲存庫包含一個稱為 default 的自訂設定檔。 如前所述,你不應該用 SSH shell 來替換這個檔案。 這個變更不在 /home 內,因此應用程式重新啟動後將會消失。

步驟 1:

  1. 從左側選單中,選擇 設定>設定。
  2. 選取一般設定索引標籤。

步驟二: 在 「一般設定 」標籤中:

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

瀏覽至應用程式

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

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

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

資料流診斷記錄

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

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

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

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

清除資源

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

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

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

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

步驟 3:

  1. 要確認你的刪除,請輸入資源群組名稱。
  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分鐘完成。 這個指令也會編譯並部署你的應用程式碼,但你之後會修改程式碼以配合 App Service。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。 完成時,命令也會顯示部署應用程式的連結。

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

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

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

在應用程式代碼中使用 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_ 開頭的設定適用於 Azure Managed Redis。 您稍後需要在程式碼中使用它們。 AZD 範本會直接顯示 Azure 入口網站應用程式設定頁面的連結。

  2. 從檔案總管開啟 config/database.php。 此檔案為資料庫與 Redis 快取連線的設定檔。

  3. 尋找定義mysql連接的部分(第 46-64 行),並將DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME和DB_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. 找到定義 Azure Managed Redis 連線的部分(第 140-147 行),然後將 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 和 REDIS_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', '10000'),
        'database' => env('AZURE_REDIS_DATABASE', '0'),
    ],
    

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

    備註

    請記住,尚未部署您的變更。 您會在下一步驟的末尾部署它們。

在網頁應用程式中設定 Laravel 設定

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

  2. 找到 App Service 應用程式的資源定義,並取消第 319 行的評論:

    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 中的這個自訂命令就會執行。

  3. 找到定義應用程式設定的部分(第 514-518 行),然後取消註解。 這些應用程式設定如下:

    設定 說明
    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 範本已建立 金鑰保存庫 密碼(第 212-217 行),因此您可以使用 金鑰保存庫 參考來存取。
  4. 回到 Codespace 終端機,再次執行 azd up 。

    azd up
    

小提示

azd up 執行 azd package、azd provision、azd deploy,因為你同時進行基礎設施和應用程式的變更。 若要只進行基礎結構變更,請執行 azd provision。 若只要將變更部署至應用程式程式碼,請執行 azd deploy。

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

產生資料庫結構

使用受虛擬網路保護的 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 中檔案的變更才能在應用程式重新開機之後保存。

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

瀏覽至應用程式

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

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

    Laravel 網頁應用程式的截圖,MySQL 在 Azure 中執行,顯示任務。

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

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

資料流診斷記錄

Azure App 服務 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 為了方便起見,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: &lt;URL>

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

清除資源

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

azd down

故障排除

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

它表示 MySQL 連線變數未正確設定。 請驗證AZURE_MYSQL_應用程式設定是否已正確在於應用程式程式碼中使用 Azure 連接字串中設定。

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

它表示 App Service 在 /public 中找不到 PHP 啟動檔案。 請依照 網頁應用程式中的「配置 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 install 和 azd deploy。

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

它表示 Redis 連接變數未正確設定。 請驗證AZURE_REDIS_應用程式設定是否已正確在於應用程式程式碼中使用 Azure 連接字串中設定。

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

這表示您尚未執行資料庫移轉,或資料庫移轉未成功。 請依照 Generate database schema 的步驟操作。

常見問題集

這設定會產生多少費用?

已建立資源的價格如下:

  • App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價。
  • MySQL 靈活伺服器是在 B1ms 層中建立,並可進行向上或向下擴展。 使用 Azure 免費帳戶時,B1ms 層免費 12 個月,最多可達每月限制。 請參閱適用於 MySQL 的 Azure 資料庫定價。
  • Azure Managed Redis是在Basic層級建立,快取容量最小。 與此層級相關的成本不高。 您可以擴大至較高的效能層級以取得高可用性、叢集和其他功能。 參見 Azure Managed Redis。
  • 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價。
  • 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價。

如何使用其他工具連線到虛擬網路後方的 MySQL 資料庫?

  • 若要從命令列工具進行基本存取,您可以從應用程式的 SSH 終端機執行 mysql。
  • 要從像 MySQL Workbench 這樣的桌面工具連線,你的電腦必須在虛擬網路中。 例如,可能是連接到其中一個子網的 Azure 虛擬機器,或是本地網路中的電腦,透過 Azure 虛擬網路建立了 站對站 VPN 連線。
  • 您也可以將 Azure Cloud Shell 與虛擬網路整合。

如何將APP_KEY應用程式設定變更為 金鑰保存庫 參考?

在 Azure 入口網站的 Configure Laravel 變數步驟中,你可以透過在 GitHub 程式碼空間執行以下 Azure CLI 指令,切換 APP_KEY 到 金鑰保存庫 參考:

# 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)"

你也可以在 Azure 入口網站做同樣的事。 如需詳細資訊,請參閱:

  1. 金鑰保存庫 範圍的角色指派
  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來設定變更的地點,但不允許它替你做這些變更。 您可以自行新增建議的變更並加以測試。

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

或者參考這個資源: