首先,請明確一點:部署
homestead
意味著什麼?
本地開發的同時,已經在模擬生產環境(linux)中進行部署。我們在各種作業系統上碰到的各種奇怪的坑,在這裡也許都將不存在。但是,前提是你得擁有一臺高配計算機,不然會十分卡頓。
因為在部署homestead的過程中,出現了很多未知的問題,這些內容如果我們只是對網上的內容“照搬執行”,而沒有理解每個配置項的作用,那麼只會導致我們越來越心煩意亂,甚至有放棄的打算,當然,我也有過。在看別人的解決方案的同時,我們還需要去思考哪裡不一樣。
為了完整的部署homestead,這次整整花了3天左右時間部署(人不逼一逼自己,怎麼知道行還是不行。),並將每一處產生問題的細節整理成文,讓大家可以快速開心部署,學習應該是一種快樂的過程,分享也同樣令人感到愉悅!
正常步驟可先參考summer的:
一、版本選擇
我們要做的第一件事情是明確自己需要什麼樣的生產環境,是最新的,還是指定版本的。我們在下載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 協議》,轉載必須註明作者和本文連結