Homestead 可以运行在 Windows、Mac 以及 Linux 等主流操作系统上,预装的软件和工具列表如下:
- Ubuntu 16.04
- Git
- PHP 7.1
- Nginx
- MySQL
- MariaDB
- SQLite 3
- Postgres
- Composer
- Node(With Yarn, Bower, Grunt, and Gulp)
- Redis
- Memcached
- Beanstalkd
- Mailhog
- ngrok
注:如果你使用的是 Windows,需要开启系统的硬件虚拟化(VT-x),这通常可以通过 BIOS 来开启。如果你是在 UEFI 系统上使用 Hyper-V,则需要关闭 Hyper-V 以便可以访问 VT-x。
准备
先下载安装VirtualBox和Vagrant。
安装及配置
以下命令本人使用的是git bash
1、安装
使用Vagrant安装Homestead盒子
命令:
vagrant box add laravel/homestead
安装过程需要较长时间(取决于你的网络连接速度),并且容易网络中断。
推荐:
复制上面图片中的下载地址并用迅雷下载( 下载之后的名字可能是一串乱码)
通过这种方式下载的话需要手动将其添加到 Vagrant:
vagrant box list
vagrant box remove laravel/homestead --all
vagrant box add laravel/homestead 下载文件的路径
运行上述命令有可能报错:
Check your Homestead.yaml file, the path to your private key does not exist.
解决办法如下:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/id_rsa
再次运行上述命令即可添加成功
添加成功提示
==> box: Successfully added box 'laravel/homestead' (v0) for 'virtualbox'!
安装 Homestead
你可以通过克隆仓库代码来实现 Homestead 安装。将仓库克隆到用户目录下的 Homestead 目录,这样 Homestead 盒子就可以作为所有其他 Laravel 项目的主机:
cd ~
git clone https://github.com/laravel/homestead.git Homestead
克隆完成后,你需要检查 Homestead 的版本标签,因为 master 分支不会总是稳定版本,你可以在 GitHub Release Page 查找到最新稳定版本然后在本地将其检出:
cd Homestead
// Clone the desired release...
git checkout v6.1.0
接下来,在 Homestead 目录下运行 bash init.sh 命令来创建 Homestead.yaml 配置文件,生成的 Homestead.yaml 配置文件文件位于当前 Homestead 目录:
// Mac/Linux... windows下使用git bash也使用下面的命令
bash init.sh
// Windows...
init.bat
2、配置 Homestead
设置 Provider
Homestead.yaml 文件中的 provider 键表示使用哪个 Vagrant 提供者:virtualbox、vmware_fushion、 vmware_workstation 或 parallels,你可以将其设置为自己喜欢的提供者,当然对大部分人来说也没得选:
provider: virtualbox
配置共享文件夹
Homestead.yaml 文件中的 folders 属性列出了所有主机和 Homestead 虚拟机共享的文件夹,一旦这些目录中的文件有了修改,将会在本地和 Homestead 虚拟机之间保持同步,如果有需要的话,你可以配置多个共享文件夹:
folders:
- map: ~/Development
to: /home/vagrant/Code
如果要开启 NFS,只需简单添加一个标识到同步文件夹配置:
folders:
- map: ~/Development
to: /home/vagrant/Code
type: "nfs"
注:使用 NFS 的话,需要考虑安装 vagrant-bindfs 插件。该插件可用于在 Homestead 盒子中为文件和目录维护正确的用户/组权限。
你还可以通过 options 传递其他 Vagrant 支持的同步文件夹选项:
folders:
- map: ~/Development
to: /home/vagrant/Code
type: "rsync"
options:
rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
rsync__exclude: ["node_modules"]
配置 Nginx 站点
对 Nginx 不熟?没关系!通过 sites 属性你可以方便地将“域名”映射到 Homestead 虚拟机的指定目录,Homestead.yaml 中默认已经配置了一个示例站点。和共享文件夹一样,你可以配置多个站点:
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public
- map: firm.cn
to: /home/vagrant/laravelapp/firm/public
如果你是在 Homestead 盒子启动之后进行了上述修改,需要运行 vagrant reload –provision 更新虚拟机上的 Nginx 配置。
Hosts文件
不要忘记把 Nginx 站点配置中的域名添加到本地机器上的 hosts 文件中,该文件会将对本地域名的请求重定向到 Homestead 虚拟机,在 Mac 或 Linux上,该文件位于 /etc/hosts,在 Windows 上,位于 C:\Windows\System32\drivers\etc\hosts,添加方式如下:
192.168.10.10 firm.cn
确保 IP 地址和你的 Homestead.yaml 文件中列出的一致,一旦你将域名添加到 hosts 文件,就可以在浏览器中通过该域名访问站点了:
http://firm.cn
注:在真正可以访问之前之前还需要通过 Vagrant 启动虚拟机上的 Homestead 盒子。
启动 Vagrant Box
配置好 Homestead.yaml 文件后,在 Homestead 目录下运行 vagrant up 命令,Vagrant 将会启动虚拟机并自动配置共享文件夹以及 Nginx 站点,初次启动需要花费一点时间进行初始化:
vagrant up
报错1:
蓝屏重启
没有关闭Hyper-V和VT-x冲突
控制面板→程序→启用或关闭Windows功能 将Hyper-V以及子项全部去掉勾选就行了。确定后记得重新启动
报错2:
Check your Homestead.yaml file, the path to your private key does not exist.
运行命令:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add -k ~/.ssh/id_rsa
报错3:
Failed to connect to vagrantcloud-files-production.s3.amazonaws.com port 443: Timed out
Vagrant没有发现 laravel/homestead 这个Box虚拟机,这是因为版本的问题
进入Homestead目录下
vim scripts/homestead.rb
修改:config.vm.box_version = settings["version"] ||= ">= 0.4.0"
为 config.vm.box_version = settings["version"] ||= ">= 0"
报错4:
Path: C:/Users/Administrator/.vagrant.d/data/machine-index/index
进入上面提示的目录删除 index 和index.lock
启动之后,就可以在浏览器中访问配置的站点 http://firm.cn
No input file specified. 说明配置成功
要登录到该虚拟机,使用 vagrant ssh 命令;关闭该虚拟机,可以使用 vagrant halt 命令;销毁该虚拟机,可以使用 vagrant destroy –force 命令。
可选操作
为指定项目安装 Homestead
全局安装 Homestead 将会使每个项目共享同一个 Homestead 盒子,你还可以为每个项目单独安装 Homestead,这样就会在该项目下创建 Vagrantfile,允许其他人在该项目中执行 vagrant up 命令,在指定项目根目录下使用 Composer 执行安装命令如下:
composer require laravel/homestead --dev
这样就在项目中安装了 Homestead。Homestead 安装完成后,使用 make 命令生成 Vagrantfile 和 Homestead.yaml 文件,make 命令将会自动配置 Homestead.yaml 中的 sites 和 folders 属性。该命令执行方式如下:
Mac/Linux:
php vendor/bin/homestead make
Windows:
vendor\bin\homestead make
或者
vendor\\bin\\homestead make
接下来,在终端中运行 vagrant up 命令然后在浏览器中通过 http://homestead.app 访问站点。不要忘记在 /etc/hosts 文件中添加域名 homestead.app(已配置的话忽略)。
日常使用
全局访问 Homestead
要想在文件系统的任意路径都能够运行 vagrant up 启动 Homestead 虚拟机,在 Mac/Linux 系统中,可以添加 Bash 函数到 ~/.bash_profile;在 Windows 系统上,需要添加“批处理”文件到 PATH。这些脚本允许你在系统的任意位置运行 Vagrant 命令,并且把命令执行位置指向 Homestead 的安装路径。
Mac/Linux
function homestead() {
( cd ~/Homestead && vagrant $* )
}
确保将该函数中的 ~/Homestead 路径调整为指向实际的 Homestead 安装路径。这样你就可以在系统的任意位置运行 homestead up 或 homestead ssh 来启动/登录虚拟机
补充知识点:/etc/profile 和 ~/.bash_profile 都可以用来设置系统 PATH,不同之处在于前者是给系统超级用户使用,后者是给普通登录用户使用的,此外要让 ~/.bash_profile 修改后生效,有两种方法,一种是退出系统重新登录,一种是使用 source ~/.bash_profile 命令。
Windows
在系统的任意位置创建一个批处理文件 homestead.bat:
@echo off
set cwd=%cd%
set homesteadVagrant=C:\Homestead
cd /d %homesteadVagrant% && vagrant %*
cd /d %cwd%
set cwd=
set homesteadVagrant=
你需要将脚本中实例路径 C:\Homestead 调整为 Homestead 实际安装路径。创建文件之后,添加文件路径到 PATH,这样你就可以在系统的任意位置运行 homestead up 或 homestead ssh 命令了。
通过 SSH 连接
你可以在 Homestead 目录下通过运行 vagrant ssh 以 SSH 方式连接到虚拟机。如果你设置了全部访问 Homestead,也可以在任意路径下通过 homestead ssh 登录到虚拟机。
如果你需要以更简捷的方式连接到 Homestead,可以为主机添加一个别名来快速连接到 Homestead 盒子,创建完别名后,可以使用 vm 命令从任何地方以 SSH 方式连接到 Homestead 虚拟机:
alias vm="ssh [email protected] -p 2222"
连接到数据库
Homestead 默认已经在虚拟机中为 MySQL 和 Postgres 数据库做好了配置,更方便的是,这些配置值与 Laravel 的 .env 中默认提供的配置一致。
想要通过本地的 Navicat 或 Sequel Pro 连接到 Homestead 上的 MySQL 或 Postgres 数据库,可以通过新建连接来实现,主机 IP 都是 127.0.0.1,对于 MySQL 而言,端口号是 33060,对 Postgres 而言,端口号是 54320,用户名/密码是 homestead/secret
站点类型
Homestead 支持多种框架,所以即使你没有使用 Laravel 的话,也可以使用 Homestead,例如,我们可以通过 symfony2 站点类型轻松添加一个 Symfony 应用:
sites:
- map: symfony2.app
to: /home/vagrant/Code/Symfony/web
type: symfony2
目前支持的站点类型包括 apache、laravel、proxy、silverstripe、statamic、symfony2 和 symfony4。
配置 Cron 调度任务
Laravel 提供了很方便的方式来调度 Cron 任务:只需每分钟调度运行一次 Artisan 命令 schedule:run 即可。schedule:run 会检查定义在 App\Console\Kernel 类中定义的调度任务并判断运行哪些任务。
如果想要为某个 Homestead 站点运行 schedule:run 命令,需要在定义站点时设置 schedule 为 true:
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public
schedule: true
该站点的 Cron 任务会被定义在虚拟机的 /etc/cron.d 目录下:
分享你的环境
有时候你可能希望和同事或客户分享自己当前的工作进度或成果
登录虚拟机运行命令
share firm.cn //配置的站点
运行完该命令之后,你就可以看到一个 Ngrok 界面出现,其中包含活动日志和分享站点所需的公开访问 URL:
可以看到我的分享 URL 是 http://95920d84.ngrok.io/ 以及 https://95920d84.ngrok.io/,你可以通过这两个域名在任意联网机器上访问我的 Homestead 站点:
如果你想要指定一个自定义的区域,子域名或者其他 Ngrok 运行时选项,可以将它们添加到 share 命令:
share homestead.app -region=us -subdomain=laravel
目前自定义域名只有付费用户才可以使用,所以 subdomain 会提示不可用。
注:记住两个点,一个是 Vagrant 并没有什么特别的安全防范措施,另一个是当你运行 share 命令的时候,你其实是在将自己的虚拟机曝光到互联网上。所以,当你要分享自己的站点之前,先想想安全隐患,并将其规避掉。
参考链接
- http://laravelacademy.org/post/7658.html,by 学院君
- https://laravel-china.org/topics/2090/homestead-installation-needs-to-know-some-information,by Summer
- https://simon8.com/article/207.html,by Simon
- Homestead 安装问题汇总