Homestead.yaml 配置文件深入讀懂

文章參考:(https://learnku.com/docs/laravel-development-environment/5.7/development-environment-windows/2902#3e3008)
Homestead.yaml裏的配置大致可以分爲以下幾種:

虛擬機設置;
SSH 祕鑰登錄配置;
共享文件夾配置;
站點配置;
數據庫配置;
自定義變量;

1. 虛擬機設置

對虛擬機的 IP,內存,CPU,虛擬機的默認提供者進行配置。這裏我們基本不需要做任何配置,(有時候ip會衝突,改一下ip)。

ip: "192.168c.10.10"
memory: 2048
cpus: 1
provider: virtualbox

2. SSH 祕鑰登錄配置

authorize 選項是指派登錄虛擬機授權連接的公鑰文件,此文件填寫的是主機上的公鑰文件地址,虛擬機初始化時,此文件裏的內容會被複制存儲到虛擬機的 /home/vagrant/.ssh/authorized_keys文件中,從而實現 SSH 免密碼登錄。在這裏我們默認填寫即可。

authorize: ~/.ssh/id_rsa.pub

keys 是數組選項,填寫的是本機的 SSH 私鑰文件地址。虛擬機初始化時,會將此處填寫的所有 SSH 私鑰文件複製到虛擬機的 /home/vagrant/.ssh/ 文件夾中,從而使虛擬機能共享主機上的 SSH 私鑰文件,使虛擬機具備等同於主機的身份認證。此功能爲 SSH 授權提供了便利,例如在後面章節中,我們只需要在 GitHub 上配置一個 SSH 公鑰,即可實現 GitHub 對虛擬機和主機共同認證。
此處我們將公鑰和私鑰一起同步到虛擬機中:

keys:
    - ~/.ssh/id_rsa
    - ~/.ssh/id_rsa.pub

接下來我們來生成 SSH Key,開始之前,我們先使用以下命令來檢查主機上是否已經生成過 SSH Key:

ls -al ~/.ssh

如果存在 id_rsa 和 id_rsa.pub的話,請跳過以下生成 SSH 的步驟繼續閱讀剩下內容。

否則使用以下方法來生成 SSH Key,請將 [email protected] 替換爲你的郵箱:

ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.

命令行會提示讓你指定祕鑰的名稱,按回車鍵將 SSH Key 保存到默認文件名即可:

Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]

接下來會詢問你爲 SSH Key 設置密碼,按回車鍵即可,默認爲空密碼:

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

可以都選擇默認,一路 Enter 鍵即可,大致如下:
在這裏插入圖片描述

3. 共享文件夾配置

我們可以通過 folders 來指明本機要映射到 Homestead 虛擬機上的文件夾。
map 對應的是我們本機的文件夾,格式例如:E:/Homestead/Code,以開發者實際項目目錄爲準。
to 對應的是 Homestead 上的文件夾。

folders:
    - map: ~/Code
      to: /home/vagrant/Code

我們將會在該文件夾下放置我們所有的 Laravel 項目,Homestead 會把該文件夾下的項目自動映射到虛擬機的 /home/vagrant/Code 文件夾上。

4. 站點配置

站點配置允許你在主機裏,通過域名來訪問虛擬機裏的 Laravel 應用。如下面 sites 配置所示,將 homestead.test 映射到一個 Laravel 項目的 public 目錄上。這一行配置,會命令 Homestead 爲我們新建一個 Nginx 站點,並且把 Web Root 配置到指定目錄下。Laravel 應用的 Nginx 站點 Web Root 配置,默認就是在根目錄下的 public 目錄。

sites:
    - map: homestead.test
      to: /home/vagrant/Code/Laravel/public

另外,主機裏直接訪問虛擬機站點,必須通過綁定 hosts 來實現。接下來我們利用 hosts 文件綁定 homestead.test 到虛擬機 IP 192.168.10.10 上。

5. 數據庫配置

我們可以爲 Homestead 指定數據庫名稱,這裏使用默認設置即可。

databases:
    - homestead

6. 自定義變量

最後,如果你需要自定義一些在虛擬機上可以使用的自定義變量,則可以在 variables 中進行定義。

variables:
    - key: APP_ENV
      value: local

附加:
解決 Windows 系統使用 Homestead 運行 Laravel 本地項目響應緩慢問題
點擊此處

嘗試過增加虛擬機配置, 但是沒有任何效果, 經過驗證也不是數據庫的原因,通過網上查詢瞭解到, 是因爲 VirtualBox 的 IO 引起的。
解決方法:

 vagrant plugin install vagrant-winnfsd

安裝成功後修改配置文件 修改配置文件前建議先備份,以免修改後出現問題!
文件1:homestead/scripts/homestead.rb

# Register All Of The Configured Shared Folders
if settings.include? 'folders'
   settings["folders"].each do |folder|
       if File.exists? File.expand_path(folder["map"])
           mount_opts = []

           if (folder["type"] == "nfs")
               mount_opts = folder["mount_options"] ? folder["mount_options"] : ['actimeo=1', 'nolock']
           elsif (folder["type"] == "smb")
               mount_opts = folder["mount_options"] ? folder["mount_options"] : ['vers=3.02', 'mfsymlinks']
           end

           # For b/w compatibility keep separate 'mount_opts', but merge with options
           options = (folder["options"] || {}).merge({ mount_options: mount_opts })

           # Double-splat (**) operator only works with symbol keys, so convert
           options.keys.each{|k| options[k.to_sym] = options.delete(k) }

           config.vm.synced_folder folder["map"], folder["to"], type: folder["type"] ||= nil, **options

           # Bindfs support to fix shared folder (NFS) permission issue on Mac
           if Vagrant.has_plugin?("vagrant-bindfs")
               config.bindfs.bind_folder folder["to"], folder["to"]
           end
       else
           config.vm.provision "shell" do |s|
               s.inline = ">&2 echo \"Unable to mount one of your folders. Please check your folders in Homestead.yaml\""
           end
       end
   end
end

查找此段代碼(可能略有不同),替換爲以下內容

if settings.include? 'folders'
  settings["folders"].sort! { |a,b| a["map"].length <=> b["map"].length }

  settings["folders"].each do |folder|
    config.vm.synced_folder folder["map"], folder["to"], 
    id: folder["map"],
    :nfs => true,
    :mount_options => ['nolock,vers=3,udp,noatime']
  end
end

文件2:Homestead.yaml

folders:
    - map: ~/Code
      to: /home/vagrant/Code
      type: nfs

重啓 Homestead 使配置文件生效,大功告成。再次運行項目響應時間已經正常了,希望幫助有相同情 況的小夥伴!

vagrant provision
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章