软件环境:在 Windows 10 上基于 VirtualBox 4.3.24 + Vagrant 1.7.1 使用 Laravel Homestead。
先下载安装VirtualBox和Vagrant。
安装完成后需要将vagrant
/vagrant.exe
所在目录放到系统路径中(这个需要根据Vagrant安装目录来,比如我的是D:\HashiCorp\Vagrant\bin
)。
使用Vagrant安装Homestead盒子
在控制台中执行如下命令:
vagrant box add laravel/homestead
安装过程需要较长时间(取决于你的网络连接速度),如果网络中断,直接再次执行上面的命令会报错:
HTTP server doesn't seem to support byte ranges. Cannot resume.
意思是说不支持断点下载,不能从上次中断的地方恢复下载,解决办法是去~/.vagrant.d/tmp
(Windows上需要将~替换成当前用户目录,比如你当前用户名是test
,则对应目录为C:\Users\test\.vagrant.d\tmp
)目录中删除下载的部分文件。然后再执行上面的命令即可重新开始下载:
这种方式是全局安装,即同一主机上所有项目共享该Homestead盒子,当然你也可以为每个项目单独指定Homestead盒子,可参考Laravel Homestead相应的文档,这里不再赘述。
使用Composer全局安装Homestead包
composer global require "laravel/homestead=~2.0"
安装完Homestead盒子后,默认配置文件位于~/.homestead/Homestead.yaml
(Windows下用户名为test的话对应目录是C:\Users\test\.homestead\Homestead.yaml
)。该配置文件内容如下所示:
由于我们在安装Homestead盒子时已经指定了provider
,所以这里没有该选项。如果系统没有配置过公共SSH KEY路径,可以参考Homestead文档设置SSH KEY部分去生成。
接下来,我们来配置主机和虚拟机之间的共享文件夹,这个通过folders
选项来配置。配置完成后,主机上对应文件夹下的任何文件修改都会实时同步到虚拟机相应的文件夹下。如果要开启NFS,只需在folders
选项下新增一个type
配置:
folders: - map: E:/xampp/htdocs/laravel to: /vagrant/laravel type: 'nfs'
这里我们将其修改为前一篇文章中已经安装好的Laravel应用目录laravelapp
:
folders: - map: E:/xampp/htdocs/laravelapp to: /vagrant/laravelapp
然后我们来进行Nginx站点配置,该配置允许我们在Homestead.yaml
文件中通过sites
选项进行简单域名解析,而不必去虚拟机上对Nginx进行复杂配置,就可以完成域名与Homestead上相应目录的映射。Homestead.yaml
默认已经为我们配置了一个示例站点homestead.app
,该域名映射到Homestead上的/vagrant/laravel/public
目录,这里我们相应将目录修改为/vagrant/laravelapp/public
:
sites: - map: homestead.app to: /vagrant/laravelapp/public hhvm: true
这里我们设置hhvm
为true
以让该站点使用HHVM。
配置完域名解析后,不要忘了在hosts
中添加对应的IP地址映射:
127.0.0.1 homestead.app
多站点配置
多站点配置很简单,只需要在sites
选项中新增匹配即可:
sites: - map: homestead.app to: /vagrant/laravelapp/public - map: laravel.app to: /vagrant/laravelapp/public
注意:配置多站点后需要使用
homestead provision
重启homestead虚拟机。
如果你使用ssh登录到Homestead的话,还可以通过如下命令新增站点:
serve laravel.app /vagrant/laravelapp/public 80
Homestead.yaml
中默认已经配置好了一个数据库配置示例,该配置示例对应新安装的Laravel应用中的.env
数据库配置:
APP_ENV=local APP_DEBUG=true APP_KEY=8PGeOBuLcDBHSvjBL19fGw5aySbb9M3d DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret
.env
中配置就是为Homestead准备的。这意味着我们在Homestead上可以通过homestead/secret连接上数据库,且该数据库中有一个名为homestead
的数据库。
对数据库配置我们不做任何更改。
默认情况下,Homestead端口转发配置如下:
如果要添加更多端口转发,可以通过在Homestead.yaml
中新增ports
选项配置:
ports:
- send: 93000
to: 9300
小贴士:想要对Homestead虚拟机有更多的自定义配置,可以去修改
~/AppData/Roaming/Composer/vendor/laravel/homestead/scripts/homestead.rb
文件,该文件对Homestead有更加细粒度的配置,然后被~/AppData/Roaming/Composer/vendor/laravel/homestead/Vagrantfile
引用。
完成上述配置后,我们可以使用homestead up
启动Homestead虚拟机了,如果启动时报错:
There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["hostonlyif", "create"] Stderr: 0%... Progress state: E_FAIL VBoxManage.exe: error: Failed to create the host-only adapter VBoxManage.exe: error: Code E_FAIL (0x80004005) - Unspecified error (extended in fo not available) VBoxManage.exe: error: Context: "int __cdecl handleCreate(struct HandlerArg *,in t,int *)" at line 66 of file VBoxManageHostonly.cpp
则对应的解决方案如下:
1)去C:\Users\test\AppData\Roaming\Composer\vendor\laravel\homestead\scripts
(假定你的Windows用户名为test
)然后打开homestead.rb
2)在homestead.rb
中注释第17行:
# config.vm.network :private_network, ip: settings["ip"] ||= "192.168.10.10"
3)去D:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.1\plugins\providers\virtualbox
(相关目录取决于你安装Vagrant的目录及版本)打开action.rb
4)在action.rb
中注释掉第64行:
# b.use ClearNetworkInterfaces
5)以管理员权限打开VirtualBox,去管理->全局设定->网络界面,点击第二个选项卡“仅主机(Host-only)网络”,选择一个适配器进行编辑(将IP设为与Homestead.yaml
中一致即192.168.10.10
)并保存:
6)接下来设置VirtualBox中homestead
的网络配置,选择其连接方式为:仅主机(Host-only)适配器“:
7)再次运行homestead up
:
然后我们可以通过homestead ssh
连接到虚拟机,当然也可以使用其他工具如putty连接:
putty连接配置信息如下:
IP:127.0.0.1 端口号:2222 用户名:vagrant 密码:vagrant
接下来我们迫不及待去浏览器中测试下吧(为区分我们将视图中文字略作修改):
我们使用Navicat For MYSQL对Homestead上的MySQL数据库连接做了测试:
数据库连接信息与上面数据库配置中.env
中的配置信息一样。
当然,在安装启动Homestead的过程还有各种其它小问题,这里只做了一个简单测试,在具体操作过程中有任何问题,欢迎在下面的评论框中提出,我们来一起探讨。
附:Homestead命令大全
命令 | 解释 |
---|---|
up | 启动homestead |
halt | 停止homestead |
init | 创建初始化的homestead.yaml |
edit | 编辑homestead.yaml |
suspend | 挂起homestead |
resume | 继续挂起的homestead |
ssh | 通过ssh登录homestead |
run | 通过ssh在homestead上运行命令 |
status | 获取homestead的状态 |
list | 列表命令 |
help | 显示命令的帮助 |
provision | 重新配置homestead |
destory | 销毁homestead |
update | 更新homestead镜像 |