在 Azure - App Services (Web Apps) 上運行 Laravel 5.1

繼上一篇將 Laravel 部署在 GCP - App Engine,這次要來試用 Azure 的 App Service - Web Apps。

Azure 目前文件增加的速度頗快,所以官方其實已經有一篇《建立、設定和部署 PHP Web 應用應式至 Azure》而且文章很潮的就是用 Laravel 作為範例。 (謎之音:所以你其實也不用寫文了?反正別人已經寫好了。)

不過因為 azure-cli 有改版,所以上面那篇官方教學少寫了一件事,因為個人覺得頗雷,所以我決定先賣個關子,這樣我這篇文似乎還是有點用處,只是不知道能存活多久就是了。

申請試用

目前 Azure 一樣有 Free Trial,提供 30 天內有 NT$6,300 的額度讓你試用,當然與 GCP 相同,在試用方案期間 Azure 對於資源上限會有所限制,所以你一樣沒辦法在試用期建立某些巨大的架構,但若只是要試試 Azure 的各種服務則是綽綽有餘。

試用 Azure 目前比較麻煩有兩件事:

  1. 需要 Microsoft 帳號,如果沒有就去註冊一個吧。
  2. 需要輸入信用卡資料,沒有信用卡,那就去銀行辦卡吧。

安裝 Azure-cli

操作過程中(可能)需要用到 Azure-cli,請事先安裝完畢,可以參考 MS 官方文件,但如果跟我一樣不想在本機上安裝一堆東西,那上面的 MS 文件中也有提到,MS 作出了 Docker Image - azure-cli 可以直接取用。

這個 Docker Image - azure-cli 內含 curl、git、vim 當然還有 azure-cli,算是一個簡單乾淨的環境,如果覺得還缺了什麼,它是以 debian:jessie 當作 baseimage,所以想要自己補安裝其他軟體也不困難,可以自己動手 build 一個你所需的版本。

預備 Laravel 5.1 程式碼

這應該不用多說,就直接用 composer create-project 建一個乾淨的 Laravel 5.1 來試試。

composer create-project --prefer-dist laravel/laravel trylaravel "5.1.*"

前置作業

同樣,App service - Web App 主要提供的是 Web Server,因此如果需要 DB 或其他服務我們一樣需要事先設定,另外就是首次使用 Azure 也會有一些其他的前置作業需要完成。

既然 Azure 有 cli,我們當然要試著利用它看看。

首先要在 cli 中登入 azure 以取得設定權限,這能透過 azure login 指令完成。

azure login

當輸入 azure login 之後,就如下圖,它會引導你前往某個 URL,然後輸入 cli 顯示的 code,即可完成登入。

URL 開啟後的流程大致如下面這幾張圖片。

 (雖然登入網頁的版面有點跑版,但不影響使用。)

首次使用 Azure,我們必須建立第一個 Resource Group。

但在建立之前,我們要先查詢可用的 Location 有哪些。 (Location 類似他牌雲端服務的 Region)

azure location list

接著就用 azure-cli 建立 Resource Group

指令用法為 azure group create [options] <name> <location>

這裡我就建立一個名稱為 g001,且 Location 位於 Japan West 的 Resource Group。

azure group create g001 japanwest

當然你也可以透過 Azure 的 Web 管理界面來操作,首先找到 Resource groups 這一項功能,若找不到可以按 Browse 用搜尋的方式尋找。

找到之後只要簡單填寫幾個欄位即可。

Resource groups 有些類似 GCP 的 Project 概念,你可以將某個專案會使用的 Resource 都放在同一個 Resource groups 來集中管理,當某天此專案廢棄了,你就能簡單的將專案有使用到的所有 Resource 一次全部關閉與刪除。

再來要設定 App Service plan

App Service plan 簡單來說可以想成是機器的規格設定,你希望 App Service 用哪種規格的主機來運行你的服務?就如上圖自己依據實際的需求來選擇吧。

接著我們終於要建立 Web App 了,一樣先來試試看 azure-cli。

指令用法為 webapp create [options] <resource-group> <name> <location> <plan>

這裡我建立一個名稱為 trylaravel,Resource Group 為 g001、 Location 位於 Japan West 且 App Service plan 為 p002 的 Web App。

azure webapp create g001 trylaravel japanwest p002

同樣這步驟也能在 Azure 的 Web 管理界面中完成。在 App Services 功能中按下 Add,然後同樣逐一設定即可。

稍等 Azure 建立完 Web App 之後,我們要針對 Laravel 環境需求做一些設定。

在 App Service 的 All settings 找到 Application settings,修改以下設定。

(如果想知道更多設定值的意義,可以參閱這篇官方文件《Configure web apps in Azure App Service》。)

  1. PHP version,目前也能選擇 php 7.0 喔!

 2. 將 Laravel 5.1 在 .env 裡面的環境變數設置於 App settings。

補充說明: 因為在 Laravel 5.1 的 .gitignore 中,有設定 .env 不會送入版控中,所以等一下我們從 Local Git Repository 直接 git push 部署至 Web App 時就會少了 .env。當然你也可以修改 .gitignore,讓 .env 可以被一併推上去,不過一般不會建議這麼做,畢竟 .env 還是別一併送入版控為佳。

 3. Default documents 只留下 index.php (個人潔癖,你不想刪也可以。)

 4. Application 的路徑指向 public

接下來還要新增 Web App 的 Extension。 (如果你打算連 vendor 一起 git push,並且沒有其他 composer 需求,這步驟也可以跳過。)

Web App 上預設是沒有 composer 的,但可以透過 Extension 安裝,如此當你將 code 部署至 Web App 時,就會自動幫你執行 composer install。

首先在 Web 管理界面中開啟剛才建立的 Web App,點擊 Tools。再來找到 Extensions 即可透過 Add 來安裝 Composer。

透過 Local git Repository 部署

前置動作很多,現在終於到了部署,這裡就參考這篇官文件《Local Git Deployment to Azure App Service》,在 App Services 中開放 Local Git Deployment。

幾個重點:

  1. 在 Azure 管理界面中,進入剛才所建立的 App Service,在 All settings 中有一項 Deployment source,點擊再接著找到 Local Git Repository。
  2. 接著在 Deployment credentials 設定 git push 會用到的帳號密碼。密碼有強度限制,強度太弱的密碼是不給用的噢!
  3. 續上,設定完畢之後,一樣在 All settings 裡有一項 Properties,即可找到 GIT URL。  (眼尖一點由上圖你會發現,其實也有提供 FTP 上傳的部署方式。)

然後就來 git push!

git init
git add -A
git commit -m "OPEN!"
git remote add azure <換成你的 GIT URL>
git push azure master

如上圖,你會發現它會自動地幫我們執行 composer install,沒意外就會如下圖一樣順利將 Code 都推上 Web App 裡的 Deployment source。

你也可以在 Web管理界面查看,只要回到 All settings 裡的 Deployment source 即可查閱 Log。

以上就是將 Laravel 5.1 部署在 Web App 上的操作步驟。剩下的篇幅用來說明踩雷及其他補充。

踩雷

老實說也不算雷,是自己沒先把工具的文件看清楚,所發生的烏龍事件。

其實我原本沒打算寫這一篇文,原本認為照官方文件《建立、設定和部署 PHP Web 應用應式至 Azure》寫的滿好的,應該只要照著操作即可。

但真的照做時,卻發現找不到文件內作者所使用的 azure-cli 指令 azure site

遇到這種狀況也沒多想,只因為曾聽聞 Azure 近期有很多改版,於是就推測大概 azure-cli 也有改版,拿掉了 site 指令,只是官方文件還來不及更新。

所以只好一邊參考官方文件,一邊自己摸索並寫文當成筆記。

但事實狀況是 azure 現在主推 Azure Resource Manager 逐漸取代原本的傳統模式(classic deployment),因此目前 azure-cli 有兩種不同的 mode 可以使用,分別是 armasm

上面那篇官方 PHP Web 教學文件中使用到的 azure siteasm mode 才會有的指令,而我利用官方 Docker Image 啟動的 azure-cli 預設為 arm mode,所以才會沒有 azure site 指令。

所以官方文件還是能參考照做,只是你在使用 azure-cli 之前要先確認一下目前的 mode 為何,你可以透過以下指令切換至 asm mode。

azure config mode asm

想要了更了解 azure-cli 的 mode 可以參考以下幾篇官方文件:

  1. 《Azure Resource Manager vs. classic deployment: Understand deployment models and the state of your resources》
  2. 《Azure Resource Manager overview》
  3. 《Azure CLI commands in Azure Service Management (asm) mode》
  4. 《Azure CLI commands in Resource Manager mode》

再補充說明

官方文件《建立、設定和部署 PHP Web 應用應式至 Azure》與本文的差異在於官方文件主要是透過 azure site 指令來一次完成本文中的許多步驟,這樣很多動作都可以在 Command Line 裡完成,不用一直回到 Web 管理界面去操作。

指令用法為 site create [options] [name]

範例:

azure site create --git try-azure-cli-site

上面的指令會幫我 create 一個 Web App 名稱為 try-azure-cli-site。

加上了 --git 參數的意思是,當 Web App 建立之後,幫我在現在這個路徑裡,設定 Local Git Repository 及 Git Remote。

(也就是 git initgit remote add <GIT URL>

所以一行指令就一次完成許多動作,很方便吧!

不過這行指令幫你建立的 Web App,會預設幫你建立一個新的 Resource group 及 App Service Plan。

Resource group 會依據你選擇的 Location 來命名,例如 Default-Web-JapanWest。

而 App Service Plan 則是新增並命名為 Default1,而且會設定為 F1 Free 最低規格的主機。如果需要好一點規格,記得自己去升級 App Service Plan。

(若再執行一次 azure site create 則會新增 Default2,以此類推。)

然後再官方文件接著教你如何透過 azure site set 指令在 command line 中設定 PHP 版本或 App Setting 中各種 Laravel 5.1 所需的環境變數。

 (明明 Web 界面已有 PHP 7.0,但還不能用 azure-cli 設定。)

即便較多的動作都可以透過 azure-cli 完成,但官方文件的做法依然免不了有些動作需要回到 Web 管理界面去處理,看來 Azure 目前還無法達到只用 Command Line 就搞定一切的境界。

轉貼本文時禁止修改,禁止商業使用,並且必須註明來自「艦長,你有事嗎?」原創作者 Cheng Wei Chen,及附上原文連結。

工商服務

更多文章