一、什么是Laravel Homestead
Laravel Homestead 是一个官方预封装的 Vagrant box ,它为你提供了一个完美的开发环境,你不需要在本地机器安装 PHP、 web 服务器和其他的服务器软件。你再也不用担心会弄乱你的操作系统了! Vagrant boxes 是一次性的。 如果出现问题, 你可以在几分钟内销毁并重新创建 box !
Homestead 可以运行在任何 Windows、 Mac、 或 Linux 系统, 它包括了 Nginx web 服务器, PHP 7.3、 PHP 7.2、 PHP 7.1、 MySQL、PostgreSQL、Redis、 Memcached、 Node 以及你开发 Laravel 所需要的东西。
二、为什么要使用Laravel Homestead
Laravel Homestead可以保持开发环境的一致性,对于开发而言,开发环境不一致造成的代码不能正常运行简直是一场噩梦,作者就曾经深受其害。。。
然而是不是必须用Laravel Homestead?不一定。Laravel Homestead解决的本质问题是开发环境的一致性,docker其实也是一种很好的方案,但既然Laravel提供出这种方案也是值得学习一下的。
三、安装 VirtualBox 和 Vagrant
VirtualBox 是 Oracle 公司的开源虚拟机软件。VirtualBox 号称是最强的免费虚拟机软件,它不仅功能齐全,而且性能也很优异!VirtualBox 支持大部分流行的系统,如:Mac, Windows, Linux 等。
Vagrant 是用来管理虚拟机的工具,支持当前主流的虚拟机系统如 VirtualBox、VMware、AWS 等。Vagrant 的主要作用是提供一个可配置、可移植和复用的软件环境。Vagrant 让你通过编写一个 Vagrantfile 文件来控制虚拟机的启动、虚拟机网络环境的配置、虚拟机与主机间的文件共享,以及启动后自动执行一些配置脚本,如自动执行一个 Shell Script 来安装一些必备的开发工具,如安装配置MySQL、PHP,甚至是自动配置 Nginx 站点。这意味着,在一个多人开发的项目中,你只需要同步 Vagrantfile 文件,就可以保证参与项目的每个人各自的机器上拥有一致的开发环境。
至于如何在windows环境下安装这两个软件就不过多介绍了,提供下两个软件的下载地址。
四、Homestead 介绍
Homestead包含了两个东西:
- Homestead 管理脚本
- Homestead Box 虚拟机盒子
1、Homestead 管理脚本
Homestead 脚本使用 Ruby 和 Shell 脚本编写而成。原理是对 Vagrantfile 文件做定制。将从 ~/Homestead/Homestead.yaml 读取的配置信息,在 provision 时,解析为 Vagrant 命令并进行对虚拟机的配置。
Homestead 脚本的作用在于,提供了极其简单易用的接口,使我们只需要通过傻瓜化配置,即可完成复杂的任务。以下是几个常用的任务:
- IP 配置,端口映射
- Nginx Site 创建
- 数据库创建
- 主机文件夹挂载到虚拟机等任务
2、Homestead Box 虚拟机盒子
homestead.box 虚拟机盒子是提前打包好的 Vagrant Box 虚拟机盒子,里面可以预装所有你在使用开发时所需要用到的各种软件。
五、安装和使用 Homestead
1、安装 Homestead Vagrant Box
安装完 VirtualBox / VMware 和 Vagrant 之后, 你可以在终端执行下面的命令将 laravel/homestead box 添加到 Vagrant 中安装。 你可能需要几分钟的时间来下载 box , 因为它取决于你的网络连接速度:
$ vagrant box add laravel/homestead
如果命令执行失败了,请确保Vagrant是最新版本。
2、安装 Homestead
建议将代码克隆到你的 “home” 目录下的 Homestead 文件夹中, 这样 Homestead box 就可以作为你的所有 Laravel 项目的主机:
$ git clone https://github.com/laravel/homestead.git ~/Homestead
因为 Homestead 的 master 分支并不是稳定的,你应该使用打过标签的稳定版本。你可以在 GitHub 发行页 上找到最新的稳定版本:
$ cd ~/Homestead
// 克隆想要的版本
$ git checkout v8.1.0
克隆 Homestead 仓库以后, 在 Homestead 目录中使用 bash init.sh 命令来创建 Homestead.yaml 配置文件。 此 Homestead.yaml 文件将被放在 Homestead 目录中:
// Mac Linux
$ bash init.sh
// windows
$ init.bat
3、设置
---
ip: "192.168.10.10" # 虚拟机IP
memory: 2048 # 虚拟机内存大小
cpus: 1 # 虚拟机CPU数量
provider: virtualbox # 提供器 virtualbox | vmware_fusion | vmware_workstation | parallels | hyperv
# mariadb: true # 安装mariadb替代MySQL
mongodb: true # 安装mongodb,默认用户名:homestead,默认密码:secret
# 如果你要安装 Elasticsearch, 你可以在 Homestead.yaml文件中添加 elasticsearch 选项并指定支持的版本号。
# 默认安装会创建一个名为 'homestead' 的集群。
# 注意永远不要赋予 Elasticsearch 超过一半的操作系统的内存,因此请保证你的 Homestead 至少分配了两倍于 Elasticsearch 的内存:
elasticsearch: 2
# 默认安装的 Neo4j 会将数据库用户名设置为 homestead 对应的密码设置为 secret。
# 要查看 Neo4j 可以在浏览器访问 http://homestead.test:7474。
# Neo4j 对外提供了3个端口:7687 (Bolt)、7474 (HTTP)、7473 (HTTPS) 用于从客户端访问。
neo4j: true # 安装neo4j
backup: true # 备份数据库
authorize: ~/.ssh/id_rsa.pub # 公钥SSH KEY
# 你可以通过编辑 Homestead 目录下的 aliases 文件为 Homestead 机器添加 Bash 别名:
# alias c='clear'
# alias ..='cd ..'
keys:
- ~/.ssh/id_rsa # 私钥SSH KEY
folders: # 共享文件夹
- map: ~/code
to: /home/vagrant/code
- map: ~/code1 # 配置多个项目
to: /home/vagrant/code1
sites: # 配置 Nginx 站点
- map: homestead.test # 这里的域名需要添加到host文件
to: /home/vagrant/code/public
# 配置站点类型 apache | apigility | expressive | laravel(默认) | proxy | silverstripe | statamic | symfony2 | symfony4 | zf
type: "symfony2"
# 站点参数
params:
- key: FOO
value: BAR
# 配置Cron调度器
# Laravel 提供了一个简便的方式来调度 Cron 任务,通过 Artisan 命令 schedule:run 调度便会在每分钟运行一次。
# schedule:run 命令会检查定义在你 App\Console\Kernel 类中的调度任务,以此判断哪个任务该被运行。
# 如果你想对 Homestead 站点使用 schedule:run 命令,你需要在定义站点时将 schedule 选项设置为 true:
# 该站点的 Cron 任务会被定义在虚拟机的 /etc/cron.d 文件夹中。
schedule: true
# 多php版本,可用"7.1","7.2","7.3"(默认),只兼容nginx
php: "7.3"
databases:
- homestead
variables: # 配置环境变量
- key: APP_ENV
value: local
# ports: # 自定义端口转发
# - send: 50000
# to: 5000
# - send: 7777
# to: 777
# protocol: udp
# blackfire:
# - id: foo
# token: bar
# client-id: foo
# client-token: bar
# zray:
# If you've already freely registered Z-Ray, you can place the token here.
# - email: foo@bar.com
# token: foo
# Don't forget to ensure that you have 'zray: "true"' for your site.
3.1 配置 Mailhog
Mailhog 可以轻松的抓取到你发送的电子邮件并进行检查,而无需将邮件真正发送给收件人. 开始之前, 请更新你的 .env 文件并使用如下邮件设置:
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
3.2 配置 Minio
Minio 是一个开源的对象存储服务器,具有与 Amazon S3 兼容的API。
要安装 Minio ,可以通过下面的配置来修改你的 Homestead.yaml 文件
默认 Minio 会在端口9600上运行。你可以访问 http://homestead:9600/ 来查看 Minio 控制面板。
默认账户为homestead,默认密码为 secretkey。当访问 Minio 时,你需要总是使用 us-east-1 时区。
minio: true # Homestead.yaml配置
要使用 Minio ,你需要在 config/filesystems.php 配置文件中调整S3磁盘配置。你需要在磁盘配置中添加use_path_style_endpoint选项,并将url键更改为endpoint:
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_URL'),
'use_path_style_endpoint' => true
]
最后,确保你的 .env 文件配置了以下设置:
AWS_ACCESS_KEY_ID=homestead
AWS_SECRET_ACCESS_KEY=secretkey
AWS_DEFAULT_REGION=us-east-1
AWS_URL=http://homestead:9600
3.3 默认端口转发
SSH: 2222 → 转发至 22
ngrok UI: 4040 → 转发至 4040
HTTP: 8000 → 转发至 80
HTTPS: 44300 → 转发至 443
MySQL: 33060 → 转发至 3306
PostgreSQL: 54320 → 转发至 5432
MongoDB: 27017 → 转发至 27017
Mailhog: 8025 → 转发至 To 8025
Minio: 9600 → 转发至 9600
3.4 自定义转发接口
# Homestead.yaml
ports:
- send: 50000
to: 5000
- send: 7777
to: 777
protocol: udp
3.5 多PHP版本
# 支持命令行切换版本
php7.1 artisan list
php7.2 artisan list
php7.3 artisan list
3.6 Web服务器
Homestead 默认使用 Nginx 作为 web 服务器。
然而,如果站点类型被设置为 apache 时,Apache 也会被安装。
虽然两种 web 服务器可以同时存在,但它们不能同时运行。
flip shell 命令可以很方便地实现 web 服务器之间的切换。
flip 命令会自动检测当前运行的服务器类型,然后关闭它,再启动另外一类服务器。
只需 SSH 进入你的 Homestead 虚拟机,在终端运行该命令即可:
flip
3.7 邮件
Homestead 包含 Postfix 邮件代理,默认端口是 1025 。
所以,你可以让你的应用使用 smtp 邮件驱动在 localhost 端口是 1025。
然后,所有发送的邮件会被 Postfix 处理然后被 Mailhog 接收。
用浏览器打开 http://localhost:8025 去看你发的邮件。
3.8 网络接口
Homestead.yaml 的 networks 属性用于配置你的 Homestead 环境的网络接口。如果需要的话你可以配置很多的网络接口:
networks:
- type: "private_network"
ip: "192.168.10.20"
启用 bridged 接口,需要添加一个 bridge 设置并且把网络类型更改为 public_network:
networks:
- type: "public_network"
ip: "192.168.10.20"
bridge: "en1: Wi-Fi (AirPort)"
启用 DHCP, 只需从配置中将 ip 选项去掉即可:
networks:
- type: "public_network"
bridge: "en1: Wi-Fi (AirPort)"
3.9 扩充 Homestead
你可以使用 Homestead 根目录中的 after.sh 脚本扩充 Homestead。可在此脚本中,添加配置和自定义虚拟机所需的任何命令。
在自定义 Homestead 时,Ubuntu 可能会询问您是否要保留程序包的原始配置,或使用新配置文件覆盖它。为避免这种情况,应该在安装软件包时使用以下命令,以避免覆盖以前由 Homestead 编写的任何配置:
sudo apt-get -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
install your-package
3.10 更新 Homestead
更新 Homestead 只需要两个简单的步骤。首先,运行 vagrant box update 更新 Vagrant box :
$ vagrant box update
然后,你需要更新 Homestead 源代码。如果你使用 git 克隆仓库安装,你可以在仓库目录下运行 git pull origin master 命令。
如果你是通过项目 composer.json 文件安装的,你需要确保你的 composer.json 文件包含 “laravel/homestead”: “^7” 并更新你的依赖,然后运行:
$ composer update
4、提供器配置
4.1 VirtualBox
- natdnshostresolver
默认的, Homestead 的配置 natdnshostresolver 设置为 on 。这样可以允许 Homestead 使用你的宿主机操作系统中的 DNS 配置。如果你想更改,将下面两行添加到你的 Homestead.yaml 文件中:
provider: virtualbox
natdnshostresolver: off
4.2 Windows 上的符号链接
如果符号链接在你的 Windows 主机上无法正常工作,你需要添加下面的代码到 Vagrantfile 文件中:
config.vm.provider "virtualbox" do |v|
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
5、Vagrant Box 常用命令
命令 | 解释 |
---|---|
vagrant box list | 查看目前已有的box |
vagrant box add | 新增加一个box |
vagrant box remove | 删除指定box |
vagrant init | 初始化 vagrant |
vagrant up | 启动 vagrant |
vagrant ssh | ssh登录 vagrant |
vagrant suspend | 挂起 vagrant |
vagrant reload | 重启 vagrant |
vagrant halt | 关闭 vagrant |
vagrant status | 查看 vagrant 状态 |
vagrant destroy | 删除 vagrant |
6、查看效果
做完简单的配置以后,执行启动命令再把Laravel的框架代码放到配置文件里的对应位置就可以根据配置文件中的ip地址来访问了,当然前提记得要配好host。
$ vagrant up