本教學課程示範如何在 Azure App Service 中建立安全的 PHP 應用程式,以連線到 MySQL 資料庫(使用適用於 MySQL 的 Azure 資料庫彈性伺服器)。 您也將部署 Azure Cache for Redis 以在應用程式中啟用快取程式碼。 Azure App Service 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 完成後,Linux 上的 Azure App Service 上將會執行 Laravel 應用程式。
先決條件
- 具有有效訂閱的 Azure 帳戶。 如果您沒有 Azure 帳戶,可以建立一個免費帳戶。
- GitHub 帳戶。 您也可免費取得。
- 瞭解 PHP 與 Laravel 開發。
- (選擇性) 若要嘗試 GitHub Copilot,一個 GitHub Copilot 帳戶。 有 30 天免費試用版可用。
1 - 執行範例
首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,範例存放庫 (英文) 包含開發容器 (英文) 設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。
步驟 1:在新的瀏覽器視窗中:
- 登入您的 GitHub 帳戶。
- 瀏覽至 https://github.com/Azure-Samples/laravel-tasks/fork。
- 選取 [建立分支]。
步驟 2:在 GitHub fork 中:
- 選取 [程式碼]>[在主分支上建立 Codespace]。
設定 Codespace 需要幾分鐘的時間。 此外,提供的 .env 檔案已經包含 Laravel 必須在本機執行的虛擬
APP_KEY
變數。
步驟 3:在 codespace 終端機中:
- 執行
composer install
。 - 使用
php artisan migrate
執行資料庫移轉。 - 使用
php artisan serve
執行應用程式。 - 當您看到通知
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 入口網站中:
- 在頂端搜尋列中,輸入 App Service。
- 請在 [服務] 標題下選取標示為 App Service 的項目。
- 選取 [建立>Web 應用程式]。 您也可以直接瀏覽至建立精靈。
步驟 2: 在 [ 建立 Web 應用程式 ] 頁面中,填寫表單,如下所示。
- 名稱: msdocs-laravel-mysql-XYZ。 系統會為您產生名為 msdocs-laravel-mysql-XYZ_group 的資源群組。
- 運行時間堆疊: PHP 8.4。
- 作系統: Linux。
- [區域]:您附近的任何 Azure 區域。
- Linux 方案: 新建 並使用 msdocs-laravel-mysql-XYZ 名稱。
- 定價方案: 基本。 準備好時,您可以 升級 至不同的定價層。
步驟 3:
- 選取 資料庫 索引標籤。
- 選取 [建立資料庫]。
- 在 [引擎] 中,選取 [MySQL - 彈性伺服器]。
- 選取 建立 Azure Cache for Redis。
- 在 [ 名稱 ] 中(在 [快取] 底下,輸入快取的名稱。
- 在 [SKU] 中,選取 [ 基本]。
步驟 4:
- 選取 [部署] 索引標籤。
- 啟用 持續部署。
- 在 [組織] 中,選取您的 GitHub 別名。
- 在 [存放庫] 中,選取 [laravel-tasks]。
- 在 [分支] 中,選取 [主要]。
- 請確定 已停用基本身份驗證 。
- 選取 [檢閱 + 建立]。
- 驗證完成時,選取 [建立]。
步驟 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:擷取現有的 連接字串
- 在 App Service 頁面的左側功能表中,選取 [ 設定 > 環境變數]。
- 選取 [連接字串]。
- 選取 AZURE_MYSQL_CONNECTIONSTRING。
- 在 [新增/編輯應用程式] 設定的 [ 值 ] 字段中,複製使用者名稱和密碼以供稍後使用。 連接字串可讓您連線到私人端點後方所保護的 MySQL 資料庫。 不過,秘密會直接儲存在App Service 應用程式中,這不是最好的。 您要變更此設定。
步驟 2:建立金鑰保存庫以安全地管理秘密
- 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace]> [Key Vault]。
- 在 [資源群組] 中,選取 [msdocs-laravel-mysql-XYZ_group]。
- 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
- 在 [區域] 中,將它設定為與資源群組相同的位置。
步驟 3:使用私人端點保護金鑰保存庫
- 選取網路索引標籤。
- 取消選取 [啟用公用存取]。
- 選取 [建立私人端點]。
- 在 [資源群組] 中,選取 [msdocs-laravel-mysql-XYZ_group]。
- 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
- 在 [名稱] 中,輸入 msdocs-laravel-mysql-XYZVaultEndpoint。
- 在 [虛擬網络] 中,選取 msdocs-laravel-mysql-XYZ_group 群組中的虛擬網络。
- 在 [子網] 中,選取可用的兼容子網。 為了方便起見,Web 應用程式精靈已建立它。
- 選取 [確定]。
- 選取 檢閱 + 建立,然後選取 建立。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。
步驟 4:建立 MySQL 連接器
- 在頂端搜尋列中,輸入 msdocs-laravel-mysql,然後選取名為 msdocs-laravel-mysql-XYZ 的 App Service 資源。
- 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]。
- 選取 ,創建。
- 針對 [服務類型],選取 [適用於 MySQL 的 DB 彈性伺服器]。
- 針對 MySQL 彈性伺服器,選取您的伺服器(例如 msdocs-laravel-mysql-235-server)。
- 針對 MySQL 資料庫,選取您的資料庫(例如 msdocs-laravel-mysql-235-database)。
步驟 5:設定 MySQL 連接器的驗證
- 選擇「驗證」索引標籤。
- 選取 [ 連接字串]。
- 在 [密碼] 中,貼上您先前複製的密碼。
- 選取 [在 Key Vault 中儲存秘密]。
- 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。
步驟 6:建立 Key Vault 連線
- 在 [建立連線] 對話方塊中,於[金鑰保存庫],選取您稍早建立的金鑰保存庫。
- 按一下 檢閱 + 建立。
- 驗證完成時,請選取 建立。
步驟 6:完成 MySQL 連接器設定
- 您回到 [MySQL 連接器] 對話框。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[Key Vault 連線] 下拉式清單會自動加以選取。
- 按一下 檢閱 + 建立。
- 選取 ,創建。 等到 [更新成功] 通知出現為止。
步驟 7:設定 Redis 連接器以使用 Key Vault 機密
- 在 [服務連接器] 頁面中,選取 [Redis 快取] 連接器旁的複選框,然後選取 [ 編輯]。
- 選擇「驗證」索引標籤。
- 選取 [在 Key Vault 中儲存秘密]。
- 在 [Key Vault 連線] 底下,選取您建立的金鑰保存庫。
- 請選取「下一步:網路」。
- 選取 [設定防火牆規則以啟用對目標服務的存取權]。 應用程式建立精靈已使用私人端點保護 SQL 資料庫。
- 選擇儲存。 等到 [更新成功] 通知出現為止。
步驟 8:確認 金鑰保存庫 整合
- 從左側功能表中,再次選取 [ 設定 > 環境變數 ]。
- 在 AZURE_MYSQL_PASSWORD旁,選取 [顯示值]。 該值應該是
@Microsoft.KeyVault(...)
,這表示它是金鑰庫參考,因為密鑰現在由金鑰庫管理。 - 若要確認 Redis 連接字串,請選取 [AZURE_REDIS_CONNECTIONSTRING] 旁的 [顯示值]。
總結來說,確保連線秘密的程序為:
- 從 App Service 應用程式的環境變數擷取連線秘密。
- 建立金鑰保存庫。
- 使用系統指派的受控識別建立 金鑰保存庫 連線。
- 更新服務連接器以將秘密儲存在金鑰保存庫中。
有問題嗎? 查看疑難排解區段。
4 - 設定 Laravel 變數
步驟 1: 建立 CACHE_DRIVER
為應用程式設定。
- 在 [ 應用程式設定] 索引標籤中,選取 [ 新增]。
- 在 [名稱] 欄位中輸入 CACHE_DRIVER。
- 在 [值] 欄位中輸入 redis。
- 選取 [套用],然後再次 套用 ,然後 選取 [確認]。
步驟 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):
- 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
- 問:「@workspace應用程式如何連線到資料庫和 redis?」Copilot 可能會提供您在 config/database.php 中設定設定方式的一些說明。
- 詢問:「@workspace在生產模式中,我的應用程式正在App Service Web 應用程式中執行,而App Service Web 應用程式會使用 Azure 服務連接器來連線到 MySQL 彈性伺服器。我需要使用的環境變數名稱為何?」Copilot 可能會提供類似 選項 2:下列 GitHub Copilot 步驟的程式代碼建議,甚至告訴您在 config/database.php 檔案中進行變更。
- 在總管中開啟 config/database.php,然後新增程式碼建議。
- 詢問:「@workspace 我的 App Service 應用程式也會使用 Azure 服務連接器,使用 Django 用戶端類型連線到 Cache for Redis。 我需要使用哪些環境變數名稱?*“ Copilot 可能會提供類似選項 2 中的程式碼建議:沒有下面的 GitHub Copilot 步驟,甚至告訴您在 config/database.php 檔案中進行變更。 如果出現提示,請登入 GitHub Copilot for Azure 以取得更精確的答案。
- 新增程式碼建議。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?。
步驟 2 (選項 2:不含 GitHub Copilot):
- 在檔案總管中開啟 config/database.php 。 尋找
mysql
區段,並進行下列變更: - 將 (第 49 行) 取代
DB_HOST
為AZURE_MYSQL_HOST
。 - 將 (列 51) 取代
DB_DATABASE
為AZURE_MYSQL_DBNAME
。 - 將 (第 52 行) 取代
DB_USERNAME
為AZURE_MYSQL_USERNAME
。 - 將 [第 53 行] 取代
DB_PASSWORD
為AZURE_MYSQL_PASSWORD
。 - 將 (第 50 行) 取代
DB_PORT
為AZURE_MYSQL_PORT
。 - 捲動至 [Redis]
cache
區段並進行下列變更: - 將 (行 142) 取代
REDIS_HOST
為AZURE_REDIS_HOST
。 - 將 (第 144 行) 取代
REDIS_PASSWORD
為AZURE_REDIS_PASSWORD
。 - 將 (第 145 行) 取代
REDIS_PORT
為AZURE_REDIS_PORT
。 - 將 (行 146) 取代
REDIS_CACHE_DB
為AZURE_REDIS_DATABASE
。 - 在相同的區段中,新增一行,內容是
'scheme' => 'tls',
。 此設定會告知 Laravel 使用加密以連線至 Redis。
步驟 3:
- 選取 Source Control 擴充功能。
- 在文字方塊中,輸入提交訊息,例如
Configure Azure database and cache connections
。 或者,選取並讓 GitHub Copilot 為您產生認可訊息。
- 請選擇認可,然後使用是來確認。
- 選取 [同步變更 1],然後使用 [確定] 來確認。
步驟 4: 回到 Azure 入口網站的 [部署中心] 頁面:
- 選取記錄索引標籤,然後選取重新整理以查看新的部署執行結果。
- 在部署執行的記錄項目中,選取最新時間戳記的 建置/部署記錄 條目。
步驟 5: 系統會帶您前往 GitHub 存放庫,並查看 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行顯示成功狀態。 大約需要 10 分鐘的時間。
有問題嗎? 查看疑難排解區段。
6 - 產生資料庫架構
建立精靈會將 MySQL 資料庫伺服器放在私人端點後,因此只能從虛擬網路存取。 因為 App Service 應用程式已經與虛擬網路整合,所以使用資料庫執行資料庫移轉的最簡單方式,就是直接從 App Service 容器內執行資料庫移轉。
第 1 步:回到 App Service 頁面,於左側選單中,
- 選取 [開發工具>SSH]。
- 選取 [開始]。
步驟 2:在 SSH 終端機中:
- 執行
cd /home/site/wwwroot
。 這裡是您所有已部署的檔案。 - 執行
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:
- 在左功能表中選取 [組態]。
- 選取一般設定索引標籤。
步驟 2:在 [一般設定] 索引標籤中:
- 在 [啟動命令] 方塊中輸入下列命令:cp /home/site/wwwroot/default /etc/nginx/sites-available/default && service nginx reload。
- 選取 [儲存],然後選取 [ 繼續]。 命令會取代 PHP 容器中的 Nginx 設定檔,並重新啟動 Nginx。 此設定可確保每次啟動容器時,都會對容器進行相同的變更。
8 - 進入應用程式
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中選取 [概觀]。
- 選取您應用程式 的預設網域 。
第 2 步:將幾項工作新增至清單。 恭喜,您正在 Azure App Service 中執行資料驅動的安全 PHP 應用程式。
小提示
應用程式範例會實作另行快取模式。 當您進行資料變更後重新載入頁面時,網頁中顯示的回應時間會較快,因為這是從快取載入資料而不是從資料庫載入。
9 - 串流診斷記錄
Azure App Service 會擷取所有登入到主控台的訊息,以協助您診斷應用程式的問題。 樣本應用程式在其每個端點中輸出主控台記錄訊息,以展示此功能。 根據預設,Laravel 的記錄功能 (例如 Log::info()
) 會輸出至本機檔案。 您先前的 LOG_CHANNEL
應用程式設定讓您能從 App Service 記錄資料流存取記錄項目。
步驟 1:在 [App Service] 頁面中:
- 從左側功能表中,選取 [App Service 記錄]。
- 在 [應用程式記錄] 下,選取 [檔案系統]。
步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。
清除資源
完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。
步驟 1:在 Azure 入口網站頂端的搜尋列中:
- 輸入資源群組名稱。
- 選取資源群組。
步驟 2:在資源群組頁面中,選取 [刪除資源群組]。
步驟 3:
- 輸入您確認要刪除的資源群組名稱。
- 選取 [刪除]。
2.建立 Azure 資源並部署應用程式範例
在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和適用於 MySQL 的 Azure 資料庫。
GitHub Codespace 已經有 Azure 開發人員 CLI (AZD)。
使用
php artisan key:generate --show
產生 Laravel 加密金鑰:php artisan key:generate --show
執行
azd auth login
命令並遵循提示來登入 Azure:azd auth login
使用
azd up
命令建立必要的 Azure 資源,並部署應用程式程式碼。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。azd up
出現提示時,請提供下列答案:
問題 回答 輸入新的環境名稱 輸入唯一名稱。 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.yaml 和 infra 目錄):
- 資源群組:所有已建立資源的容器。
- 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 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。
在 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 入口網站中應用程式設定頁面的直接連結。從檔案總管開啟 config/database.php。 這是資料庫和 Redis 快取連線的組態檔。
尋找定義
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 檔。
尋找定義 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', '6379'), 'database' => env('AZURE_REDIS_DATABASE', '1'), ],
如需 Laravel 中 Redis 快取組態的詳細資訊,請參閱 Laravel 檔。
備註
請記住,尚未部署您的變更。 您將在下一個步驟結束時部署它們。
4.在 Web 應用程式中設定 Laravel 設定
從檔案總管開啟 infra/resources.bicep。 這是定義所建立 Azure 資源的 Bicep 檔案。
尋找定義應用程式設定的部分(第 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 參考來存取。 在 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
中的這個自訂命令就會執行。回到 Codespace 終端機,再次執行
azd up
。azd up
小提示
azd up
會一起執行 azd package
、 azd provision
和 azd deploy
,因為您同時進行基礎結構和應用程式變更,所以很合理。 若要只進行基礎結構變更,請執行 azd provision
。 若只要將變更部署至應用程式程式碼,請執行 azd deploy
。
有問題嗎? 查看疑難排解區段。
5.產生資料庫結構
使用受虛擬網路保護的 MySQL 資料庫,在 App Service 的 Linux 容器中透過 SSH 會話執行 Laravel 資料庫移轉是最簡單的方式。
在 AZD 輸出中,尋找 SSH 工作階段的 URL,並在瀏覽器中瀏覽至目標。 輸出中看起來像這樣:
Open SSH session to App Service container at: <URL>
在 SSH 工作階段中,從 /home/site/wwwroot 目錄執行資料庫移轉:
cd /home/site/wwwroot php artisan migrate --force
如果成功,App Service 已成功連線至資料庫。
備註
只有 /home
中檔案的變更才能在應用程式重新開機之後保存。
有問題嗎? 查看疑難排解區段。
6.瀏覽至應用程式
在 AZD 輸出中,尋找您應用程式的 URL,然後在瀏覽器中開啟該 URL。 AZD 輸出中 URL 看起來像這樣:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
將幾項工作新增至清單。
恭喜,您正在 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 install
和 azd 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)"
您也可以在入口網站中執行相同的動作。 如需詳細資訊,請參閱:
本機應用程式開發如何與 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
檔案:
- 在
build
作業結束時,將檔案上傳為成品。 - 在
deploy
作業開始時,下載成品。
兩項作業程序花費的大部分時間都是上傳和下載成品。 如有需要,您可以將這兩個作業合併成一個作業來簡化工作流程檔案,這樣就不需要上傳和下載步驟。
我沒有權限可建立使用者指派的身分識別
請參閱透過部署中心設定 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
) 甚至可以建議在何處進行變更,但無法替您進行變更。 您可以自行新增建議的變更並加以測試。
下一步
前進到下一個教學課程,了解如何使用自訂網域和憑證保護您的應用程式。
或者,查看其他資源: