對 Summer 的 “Homestead 2.0 安裝筆記” 的補充

storefee發表於2017-04-19

首先,請明確一點:部署homestead意味著什麼?
本地開發的同時,已經在模擬生產環境(linux)中進行部署。我們在各種作業系統上碰到的各種奇怪的坑,在這裡也許都將不存在。但是,前提是你得擁有一臺高配計算機,不然會十分卡頓。

因為在部署homestead的過程中,出現了很多未知的問題,這些內容如果我們只是對網上的內容“照搬執行”,而沒有理解每個配置項的作用,那麼只會導致我們越來越心煩意亂,甚至有放棄的打算,當然,我也有過。在看別人的解決方案的同時,我們還需要去思考哪裡不一樣。
為了完整的部署homestead,這次整整花了3天左右時間部署(人不逼一逼自己,怎麼知道行還是不行。),並將每一處產生問題的細節整理成文,讓大家可以快速開心部署,學習應該是一種快樂的過程,分享也同樣令人感到愉悅!

正常步驟可先參考summer的:

  1. Homestead 安裝需要知道的一些資訊
  2. Homestead 2.0 安裝筆記

一、版本選擇

我們要做的第一件事情是明確自己需要什麼樣的生產環境,是最新的,還是指定版本的。我們在下載virtualbox.box的時候可以先去 https://atlas.hashicorp.com/laravel/boxes/... 獲取版本資訊(裡面含有每個box的ubuntu的版本,裡面所部署好的nginx等相關部件基本說明)。比如我們需要使用ubuntu14.04 LTS版,在剛才連結裡面查詢的結果是他對應著0.2.7版。(關於下載慢,或者不支援斷點續傳的問題,請參照summer的Homestead 安裝需要知道的一些資訊

二、安裝box

所以,我們的box安裝就應該如下:

vagrant box add laravel/homestead --box-version=0.2.7

有的網站上的文章在安裝的時候會提及到可以這樣來安裝:

vagrant box add homestead --box-version=0.2.7

也就是可以對安裝的box進行重新命名,但是這樣會造成異常:

> Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...

解決辦法:
如果上面我們將laravel/homestead重新命名為"lhu1404",在homestead.rb檔案中還需要重新配置,改為:

> #Configure The Box
config.vm.box = settings["box"] ||= "lhu1404"
config.vm.box_version = settings["version"] ||= "< 0.4.0"
config.vm.hostname = settings["hostname"] ||= "homestead"

我們再來安裝box:

vagrant box add lhu1404 --box-version=0.2.7

再執行list命令看看我們安裝的box:

vagrant box list

安裝laravel/homestead

composer global require "laravel/homestead=~2.0"

(請確定 ~/.composer/vendor/bin 目錄在你的 PATH 裡面.)
在命令列中執行homestead測試是否安裝完成。

注意

vagrant box add laravel/homestead 其實直接指向的是ubuntu最新版的。

homestead init (或:vagrant init laravel/homestead)
Creating Homestead.yaml file... 
Homestead.yaml file created at: C:\Users\Administrator\.homestead/Homestead.yaml
( The host path of the shared folder is missing: ~/Code):
folders :
    - map: H:\Laravel_Projects\hproject
(修改map為自己的實際專案地址,會自動對映到下面的“to”中)
      to: /home/vagrant/Code(伺服器中存放專案的根目錄)

ip: "192.168.10.10" (將這個地址放到host檔案中)

provider: virtualbox(provider為自己虛擬機器型別)

authorize: c:/Users/Administrator/.ssh/id_rsa.pub. (由git下面的ssh-keygen生成,一般放在此目錄,這樣就可以用ssh進行免密碼登入)

sites:
    - map: storefee.app
      to: /home/vagrant/newlaravelblog/public(專案中的public目錄)

databases:
    - homestead(此資料庫可配置為自己專案對應的資料庫)

在C:\Windows\System32\drivers\etc中找到host檔案,新增:

192.168.10.10    storefee.app (與上面 sites->map 中的內容一致)

異常(此異常發生在Vagrant的1.9.3版本中,有網友建議退回到1.8.6版,其實大可不必)
只需要在homestead.rb檔案中新增127.0.0.1相關的資訊即可,詳細如下:

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_open.rb:21:in initialize: The requested address is not valid in its context. -connect(2) for "0.0.0.0" port 8000 (Errno::EADDRNOTAVAIL)

下面為解決辦法,開啟檔案:

C:\Users\Administrator\AppData\Roaming\Composer\vendor\laravel\homestead\scripts\homestead.rb

將:

#Use Default Port Forwarding Unless Overridden
default_ports.each do |guest, host|
  unless settings["ports"].any? { |mapping| mapping["guest"] == guest }
    config.vm.network "forwarded_port", guest: guest, host: host, auto_correct: true
  end
end

#Add Custom Ports From Configuration
if settings.has_key?("ports"
  settings["ports"].each do |port|
    config.vm.network "forwarded_port", guest: port["guest"], host: port["host"], protocol: port["protocol"], auto_correct: true
  end
end

替換成:

#Use Default Port Forwarding Unless Overridden
unless settings.has_key?("default_ports") && settings["default_ports"] == false
    default_ports.each do |guest, host|
        unless settings["ports"].any? { |mapping| mapping["guest"] == guest }
            config.vm.network "forwarded_port", guest: guest, host: host, host_ip: "127.0.0.1", auto_correct: true
        end
    end
end

#Add Custom Ports From Configuration
if settings.has_key?("ports")
    settings["ports"].each do |port|
        config.vm.network "forwarded_port", guest: port["guest"], host: port["host"], protocol: port["protocol"], host_ip: "127.0.0.1", auto_correct: true
    end
end

注意:如果出現502異常,說明上面專案目錄配置有問題。

homestead預設登入賬號與密碼:
使用者名稱:homestead
密碼:secret
命令列登陸:$ mysql -uhomestead -psecret
發現在homestead.yaml中配置的資料庫也在資料庫列表中。

laravel專案.env中資料庫配置需要與homestead中一致:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelblog
DB_USERNAME=homestead
DB_PASSWORD=secret

在homestead中進行資料表遷移時出現異常:

[PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default val
  ue for 'published_at'

凡是在資料遷移表中,含有“$table->timestamps();”的地方,需要把它放在”$table->“的最後一行,否則就報上面這個錯誤。
將:

$table->timestamps();
$table->timestamp('published_at')->index();

調整為:

$table->timestamp('published_at')->index();
$table->timestamps();

此時,一定要注意如果你現在是否已經開啟了VPN或相關代理軟體(最好將其關掉),在進行多站點部署,訪問專案時,會出現如下問題(單個專案部署時,就算開啟VPN軟體也並不會出現這個問題):

500 internal server error

這會導致多專案(多站點)不能正常對映各個專案(所有專案都指向同一個):

folders:
    - map: H:\wamp\www\newlaravelblog
      to: /home/vagrant/newlaravelblog
    - map: H:\wamp\www\study-project
      to: /home/vagrant/study-project

sites:
    - map: storefee.app
      to: /home/vagrant/newlaravelblog/public
    - map: study.app
      to: /home/vagrant/study-project/public

databases:
    - laravelblog
    - study

注意:每個專案都需要在這3個配置項中進行配置,而且需要在各自專案的.env檔案中單獨配置各自需要的資料庫名。
要使新新增站點有效對應,必須配置完後,執行:

homestead up --provision

TODO:

2017.4.21 新增【待完善】
解決使用VPN的同時,可以進行多專案的部署。因為我們經常在開發專案時需要查閱國內外資料。

Done :
2017.4.24

解決方案一:
安裝的VPN軟體中含有白名單設定功能,可以直接將localhost或者127.0.0.1新增進去,從而進行“直接訪問”,而不通過代理模式,這樣的化,可以在任意瀏覽器中正常訪問自己的所有專案了。但是像藍燈這樣的軟體沒有辦法新增,所以我們有了第二套方案。


解決方案二:安裝好VPN軟體後,我們使用chrome瀏覽器,在裡面安裝SwitchyOmega外掛,然後在“代理伺服器”裡面設定如下內容,要特別注意這裡的代理埠需要設定為你的VPN的埠號。(可到啟動工作管理員中尋找):

網址協議 代理協議 代理伺服器 代理埠
(預設) socks 127.0.0.1 1080

然後在不代理的地址列表中配置好你不需要VPN代理的路由:
如:

127.0.0.1
::1
localhost
myproject.app

本文並不是替代開篇所提及2篇文章內容,只是作為補充。
也許是summer說過,不想摻雜過多個人思考的原因。本文行文更多的是對你所需要執行的每一個操作,每一處修改都進行解釋說明,為什麼需要這樣做。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

努力是不會騙人的!

相關文章