Laravel 開發環境使用 Homestead

Laravel Homestead

Laravel 為了讓開發者有更佳的開發環境,使用了 Vagrant 來打造 Homestead,一個整合了開發 Laravel 所需服務的 Vagrant Box。

Vagrant 簡單介紹

Vagrant 是一個建置開發環境的工具,可以透過簡單的配置,就能讓開發環境重覆使用及轉移。個人使用,可以快速建置開發環境,免去不斷的設定;團隊使用,可以讓開發環境一致,避免因開發環境不同而產生建置上的不同,導致執行應用程式時發生錯誤。

Vagrant 是透過配置檔來管理虛擬機器 (VM) 的工具,一個開發環境其實是一個預先安裝好作業系統並且在其中安裝好其他開發環境所需要的服務及工具,例如伺服器、資料庫等等的虛擬機器(Virtual Machine),在 Vagrant 中被稱為 Box。

Vagrant 支援的 VM 平台有 3 個,免費開源的 VirtualBox 及要收費的 VMwareParallels。Vagrant 可以透過命令工具,管理及控制 Box(VM) 的下載及啟動等等動作。

虛擬化技術簡單介紹

虛擬化技術是將電腦的硬體資源抽象化,重新調整分配為多個可獨立執行的環境,例如虛擬機器(VM)的 VirtualBox 就是在實際的作業系統上,再虛擬化一個獨立的作業系統。另外一個目前比較熱門的 Docker 則是在作業系統上對應用程式做虛擬化,將應用程式放在獨立的容器中執行。直接看下圖比較表: (圖片來源:https://www.docker.com/what-docker)
Homestead 所使用的 Vagrant Box 就是左邊的 VM 形式,我們可以裝好幾個不同版本的 Homestead,或自己建立一個 Box,這些 Box 可能會有些不同的內容,例如一個用 Apache,另一個用 Nginx,這樣我就能測試在不同伺服器上執行的情況。

但是你會發現,我僅僅只是換了一個伺服器,或可能只是版本不同,我就必須建一個容量頗大的 VM(Box),有點不符成本,這時候就可以改用 Docker。

Docker 可以將每個應用程式,例如一個 Apache 或 Nginx 伺服器各自建立一個 Docker 容器,MySQL 也是一個 Docker 容器,ubuntu 也可以是容器,或是組合好幾個服務為一個容器,這樣當你要抽換某一個服務時可以很容易就更換,而且 Docker 不只可以用在開發環境,也可以用在實際運作的機器上。

當我改用 Homestead 後,就少了好多麻煩事,也不用在本機上裝有的沒的服務,連 MAMP 這種套裝軟體都不用開了,再說 Homestead 可是 Laravel 的老爸做的,當然要用啦~

我好奇查了一下有沒有 Docker for Laravel 的工具,還真的有,laradock / laradock 是一套專門給 PHP 開發環境的開發者用的,預設以 Laravel 為主,有興趣可以玩玩看。
另外一套 laraedit / laraedit-docker 是 Docker 版的 Laravel Homestead,在 Laravel News 有影片介紹。

Homestead 介紹

首先,你要先知道 Homestead 其實是 Vagrant 的一個 Box,Homestead 只是這個 Box 的名稱,所以你在操作 Homestead 時,其實是在使用 Vagrant 工具所提供的服務。

讓我們來看看最新版的 Homestead 內建哪些應用程式:
  • Ubuntu 16.04
  • Git
  • PHP 7.1
  • Nginx
  • MySQL
  • MariaDB
  • Sqlite3
  • Postgres
  • Composer
  • Node (With Yarn, PM2, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd

前置安裝

在使用 Homestead 之前必須先把必要的軟體安裝好。

VirtualBox

實際上 Vagrant 只是透過指令來管理一個個用 VirtualBox 建立的虛擬機器(VM)。
到官網下載最新版本的 VirtualBox 執行安裝。

Vagrant

到官網下載最新版本的 Vagrant 執行安裝。
如果你想安裝其他的別人已經建置好的 Box,可以在 Discover Vagrant Boxes 頁面尋找,你可以看到 laravel/homestead,目前是 1.0.1 版,這就是 Laravel 老爸建立的 Box,在之後安裝使用的就是這個。

Vagrant 安裝好之後,可以在命令列輸入 vagrant -v 如果有顯示 Vagrant 的版本號,就是安裝成功了。

日後,假如你修改了官方版本的內容,或自己建立了一個 Box,想要將這個開發環境(Box)拿給別人用,或在別台電腦上執行,你可以研究一下 Package 指令 ,它可以讓你將這個 Box 打包帶走。

安裝 Homestead

終於來到正題了。不過,這裡要先說明一下什麼是「安裝 Homestead」,這個部份其實是在操作 Vagrant。

使用 Vagrant

使用 Vagrant 的流程大概是,先加入 box,接著設定 Vagrantfile,這樣就算完成了,之後當你使用指令啟動 (up) 時,它會從 vagrant 的 boxes 目錄找到指定的 box 並利用它建立(假如還未建立的話)一個虛擬機器(box => VM,你可以去查看 VirtualBox VMs 目錄,就可以看被建立的虛擬機器)並同時啟動它。

所以這裡所謂的安裝,其實是安裝 box 並設定 Vagrantfile 及 配置檔。而官方提供一個 Homestead 工具,已經幫我們處理好 box 及 Vagrantfile,我們只需要設定配置檔即可。

安裝 Homestead 工具的方式有兩種,全域安裝是建立一個 Homestead Vagrantfile、Homestead.yaml 及 VM,所有的專案都共用這些東西。
另一個依專案安裝的 Homestead 工具,則是將 Vagrantfile 及 Homestead.yaml 建立在該專案之中,跟著專案跑。

下載 Homestead Box

在命令列執行:
vagrant box add laravel/homestead
這個動作會把前面我們找到的 laravel/homestead 這個 box 下載到 boxes 目錄中(Mac/LInux:~/.vagrant.d/boxes, Windows:C:/Users/USERNAME/.vagrant.d/boxes),依你的網路速度,可能需要幾分鐘的時間,要等待一下。

全域安裝

下載 Homestead
cd ~
git clone https://github.com/laravel/homestead.git Homestead
先切換到根目錄,然後 clone 一份 homestead vagrant 工具,這行 git 指令會同時建立 Homestead 目錄,並將 clone 的內容放在裡面。
接著進入 Homestead 目錄並執行初始化:
// Mac 或 Linux
bash init.sh

// Windows
init.bat
完成後,它幫我們做了哪些事?首先它會在家目錄下建立一個 ~/.homestead (Mac)的隱藏目錄,其中有三個檔案:Homestead.yaml 是配置檔,等一下就是要在這裡做設定;after.sh 會在啟動 Homestead 執行,如果你有額外要執行的指令,可以寫在這裡,目前用不到;aliases 放了一些指令別名,方便你快速操作。
2018/5/19 備註:新版的 Homestead.yaml 等檔案會直接放在目錄中,不會有 ~/.homestead 這個隱藏目錄。
到這邊已經差不多快完成了。

配置 Homestead
1. 設定虛擬機器
現在把 ~/.homestead/Homestead.yaml 用文字編輯器打開,第一行看到的應該是
provider: virtualbox
表示我們是使用 VirtualBox 來執行。你可以加入其他設定,像是
name: Homestead  # 設定 VM 的名稱
ip: "192.168.10.10"  # 指定 IP
memory: 512  # 指定記憶體大小
cpus: 1   # 指定 CPU 數量
註:# 之後為註解。
這些設定等同於你自己打開 VirtualBox 軟體去對 VM 做設定是一樣的,透過配置檔可以方便管理及修改。
2. 設定共享目錄
接下來是目錄的對應,這裡會把你的電腦中的目錄,對應到 VM 中的目錄,這樣你可以在本機上寫程式,然後在 VM 中執行
folders:
    - map: ~/Code
      to: /home/vagrant/Code
意思是「將本機上的 ~/Code 目錄對應到虛擬機器上的 /home/vagrant/Code 目錄」
註:在這裡請先在本機上的 Code 目錄下建立一個 Laravel 網站,之後要來執行它。
3. 設定伺服器的網站
Homestead 是使用 Nginx 做為網頁伺服器。這時候 Homestead 的好處就出現了,假如你是初學者或不熟 Nginx 伺服器,你暫時不必費心去瞭解怎麼安裝及設定,你只要寫個配置檔就好了,如下:
sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
意思是「將 homestead.app 這個網址,對應到 /home/vagrant/Code/Laravel/public 這個目錄」
這裡要注意的是,假如你在執行 Homestead VM 之後,又有更動 sites 裡的設定的話,記得要執行
vagrant reload --provision
這個指令會更新虛擬機器中的 Nginx 設定檔。
4. 修改 Hosts 檔案
每台電腦都有一個內部使用的 Hosts 檔案,功能如同 DNS,只是它只能在本機上運作。我們要修改它來使用我們自訂的網址 「homestead.app」。
因為這個檔案有安全性的問題,所以要使用管理者帳號來開啟,Mac 或 Linux 放在 /etc/hosts,Windows 放在 C:\Windows\System32\drivers\etc\hosts
用文字編輯器打開後,在最下面加入一行
192.168.10.10  homestead.app
存檔後離開。
記得要在 Homestead.yaml 檔中加入相同的 ip 配置設定,請參考前面設定虛擬機器的內容。
這樣當你在本機瀏覽器上輸入 homestead.app 網址,它會受 Hosts 檔的影響,連入 192.168.10.10 這個內部 IP,而這個 IP 指向的是 Homestead 虛擬機器,這個虛擬機器中的 Nginx 接到請求後,將執行對應的 sites 中的目錄中的 Laravel 程式,並回傳結果給瀏覽器,你就可以在本機瀏覽器上看到在虛擬機器運作但存放於本機的 Laravel 程式的回應結果。

啟動 Vagrant Box

終於完成所有手續,準備按下紅色按鈕。
打開命令列,切換到一開始 clone 的 Homestead 目錄,執行
vagrant up
Vagrant 會啟動虛擬機器(如果還未被建立,會取得 Box 來建立)並且依 Homestead.yaml 中的配置內容做設定。
這裡要注意的事,當你執行 up 指令時,vagrant 會去取得該目錄中的 Vagrantfile,並依照它裡面所寫好的程式碼(它其實 Ruby 程式)來執行,這也就是你必須先切換到 Homestead 目錄才能執行指令的原因,而 Vagrantfile 你無須去更動則是因為官方都把內容寫好了。
而為了方便修改配置檔,因此將設定另外寫在 Homestead.yaml 中,Homestead 的 Vagrantfile 會去讀取它來做設定。
好了,如果沒有錯誤的話,執行完你會發現什麼事都沒發生,你可以先用 ping 192.168.10.10 確定連線是否正常,如果 OK 表示虛擬機器已經在運作了,然後開啟瀏覽器輸入 homestead.app 就可以看到 Laravel 網站了。(其實你也可以打開 VirtualBox,會看到你的 VM 是啟動狀態)
關閉虛擬機器
注意!當你要關閉電腦前或不使用虛擬機器了,記得把它關掉,因為看不到東西,很容易忘記把它關掉,VM 有可能會損壞。關機指令:
vagrant halt
刪除虛擬機器
如果你要把這個虛擬機器刪除:
vagrant destroy --force
當你下次執行 vagrant up 時,它會重新建立一個新的。這裡是刪除 VM 不是 Box,所以你如果把它玩壞掉了,刪掉它重新 up 就好了。如果是要刪除 box 請用 vagrant box remove 指令。

針對專案安裝

現在你知道,所謂的安裝只不過是下載要執行 Homestead Vagrantfile 相關的檔案。
這個方式可以讓你的 Vagrantfile 跟著你的專案被打包,方便在其他地方或其他人直接使用。
安裝方式可以使用 composer 指令:
composer require laravel/homestead --dev
這樣會將工具安裝在 Laravel 專案目錄下的 vendor/laravel/homestead 目錄中,裡面的內容和全域安裝是差不多的,只是 Vagrantfile 只會抓取專案目錄下的配置檔。
這時候,專案根目錄中還沒有 Vagrant 相關的檔案,我們要執行 Homestead 工具來幫我們建立,先切換到本機中 Laravel 專案的根目錄,然後執行 make:
// Mac,Linux
php vendor/bin/homestead make

// Windows
vendor\\bin\\homestead make
現在你會看到專案根目錄多了 Vagrantfile 及 Homestead.yaml,你可以依照前面的說明,設定配置檔及 Hosts 檔,然後就能啟動 vagrant up 它了。

日常使用

全域存取 Homestead

當你要使用指令來啟動 Homestead VM 的時候,你必須先切換到先前 clone 下來的 Homestead 目錄,才能執行 Vagrant 指令。因為很常用,如果每天都要做這個切換目錄的動作,工作實在太沒效率。
你可以加入一段 Bash 函式到你的 Bash profile 檔中,如此就可以讓你在任何目錄中執行 Vagrant 指令。
這個函式的內容其實是將你輸入的 Vagrant 指令指向 Homestead 目錄:
function homestead() {
    ( cd ~/Homestead && vagrant $* )
}
將以上程式碼加入(Mac/Linux)使用者家目錄底下的 .bash_profile.bash_aliases 中,這裡記得要將 ~/Homestead 換成你自己的 Homestead 目錄的路徑。儲存後執行 source .bash_profilesource .bash_aliases重新讀取設定內容。
之後就可以使用 homestead up 指令來啟用 Homestead VM 了。
你可以修改 homestead() 這個函式名稱,例如改成 home(),這樣你的指令就變成home up,這個函式等同於切換到 Homestead 目錄後執行 vagrant up

透過 SSH 連線到 Homestead 虛擬機器

通常最常用到的指令就是
  • 開機:vagrant up
  • 關機:vagrant halt
因為你是在本機上寫程式,所以通常不必連線到 VM 上,但有時候你可能需要在 VM 上做一些事情,你可以透過 vagrant ssh 連線到 VM 上。

連線到資料庫

假如你要在本機上使用 Sequel Pro 這類的客戶端軟體,來連線到 Homestead VM 中的 MySQL 或 Postgres 資料庫,你必須設定以下的連線資料:
  • Host:127.0.0.1
  • port: 33060(MySQL) 或 54320(Postgres)
  • Username: homestead
  • Password: secret
這裡要注意的是,33060 和 54320 這兩個 port 是非標準的 port ,只有當你從本機(Host)連線到虛擬機器(VM)時才能使用。如果在 VM 中,MySQL 的 port 是預設的 3306 ,Postgres 則是 5432。

增加新的網站

這裡是指全域安裝的情況下。當你執行 Homestead VM 時,你可以透過修改配置檔(Homestead.yaml)來增加網站。用文字編輯器打開 ~/.homestead/Homestead.yaml 檔,在 sites: 區段內增加一對 - map:, to: 即可,可以參考前面設定伺服器的網站的說明。
當你增加了新網站後,必須在命令列執行
vagrant reload --provision
記得要在 Homestead 目錄下執行指令。

Port 的重導向

以下的 Port 預設會重導向到 Homestead VM 環境中:
  • SSH: 2222 → 22
  • HTTP: 8000 → 80
  • HTTPS: 44300 → 443
  • MySQL: 33060 → 3306
  • Postgres: 54320 → 5432
如果你有額外想重導向的 Port ,可以設定 Homestead.yaml,例如:
ports:
 - send: 93000
   to: 9300
 - send: 7777
   to: 777
   protocol: udp

更新 Homestead

1. 更新 Box

使用 Vagrant 指令來更新 Box:
vagrant box update

2. 更新 Homestead 原始碼

假如你是用 clone 的方式全域安裝,只要直接 pull 原始碼即可:
git pull origin master
記得先切換到先前 clone 的 Homestead 目錄。

如果是透過 composer 針對專案安裝,只要直接執行:
composer update laravel/homestead

總結一下使用流程

安裝的部份:
  1. 安裝 VirtualBox
  2. 安裝 Vagrant
  3. 下載 Box:
    vagrant box add laravel/homestead
  4. 下載 Homestead:
    cd ~
    git clone https://github.com/laravel/homestead.git Homestead
    
  5. 初始化:
    // Mac 或 Linux
    bash init.sh
    
    // Windows
    init.bat
    
  6. 設定配置檔 Homestead.yaml
  7. 修改 Hosts 檔
使用的部份:
  1. 啟動:
    vagrant up
    
  2. 在本機寫程式
  3. 在本機瀏覽器觀看網頁執行結果
  4. 關機:
    vagrant halt
    

參考資料

本文網址:http://blog.tonycube.com/2016/12/laravel-homestead.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。