Homestead

Homestead


Laravel Homestead

简介

Laravel 致力于让整个 PHP 开发体验变的更愉快,包括你的本地开发环境。 Vagrant 提供了一种简单、优雅的方式来管理和配置虚拟主机。

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 所需要的东西。

{note} 如果你使用的是 Windows, 你可能需要通过 BIOS 来启用硬件虚拟化 (VT-x)。如果你在 Hyper-V 系统上使用 UEFI 你可能还需要禁用 Hyper-V 以便访问 VT-x.

内置软件

  • Ubuntu 18.04
  • Git
  • PHP 7.3
  • PHP 7.2
  • PHP 7.1
  • Nginx
  • Apache (Optional)
  • MySQL
  • MariaDB (Optional)
  • Sqlite3
  • PostgreSQL
  • Composer
  • Node (With Yarn, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd
  • Mailhog
  • Neo4j (Optional)
  • MongoDB (Optional)
  • Elasticsearch (Optional)
  • ngrok
  • wp-cli
  • Zend Z-Ray
  • Go
  • Minio

安装 & 设置

第一步

在你启动 Homestead 环境之前,你必须安装  VirtualBox, VMWare, Parallels 或 Hyper-V 以及 Vagrant. 以上所有软件均针对不同的操作系统提供了易于使用的可视化安装包。

若要使用 VMware 提供器, 你需要购买 VMware Fusion / Workstation 和 VMware Vagrant plug-in. 虽然它不是免费的,但是 VMware 可以提供更快的共享文件夹性能。

若要使用 Parallels 提供器, 你需要安装 Parallels Vagrant plug-in。它是免费的哦。

由于受到 Vagrant 限制 , Hyper-V 提供程序会忽略所有的网络设置。

安装 Homestead Vagrant Box

一旦将 VirtualBox / VMware 和 Vagrant 都安装好之后,你可以在终端执行下面的命令将 laravel/homestead box 添加到 Vagrant 中安装。你可能需要几分钟的时间来下载 box , 因为它取决于你的网络连接速度:

vagrant box add laravel/homestead

如果这个命令失败了,请确保你安装的是最新版的 Vagrant。

安装 Homestead

你可以通过克隆代码来安装 Homestead。 建议将代码克隆到你的 "home" 目录下的 Homestead 文件夹中, 这样 Homestead box 就可以作为你的所有 Laravel 项目的主机:

git clone https://github.com/laravel/homestead.git ~/Homestead

因为 Homestead 的 master 分支并不是稳定的,你应该使用打过标签的稳定版本。你可以在 GitHub 发行页: 上找到最新的稳定版本:

cd ~/Homestead// 克隆期望的发行版本...git checkout v8.0.1

一旦克隆 Homestead 代码完成以后,在 Homestead 目录中使用 bash init.sh 命令来创建  Homestead.yaml 配置文件。  Homestead.yaml 文件将被放在 Homestead 目录中:

// Mac / Linux...bash init.sh// Windows...init.bat

配置 Homestead

设置提供器

Homestead.yaml 文件中的  provider 参数决定了你用的是哪一个 Vagrant 提供器 : virtualbox, vmware_fusion, vmware_workstation, parallels 以及 hyperv。 你可以根据你的喜好来设置他们:

provider: virtualbox

配置共享文件夹

Homestead.yaml 文件的 folders 属性里列出了所有与 Homestead 环境共享的文件夹。 这些文件夹中的文件如果发生变更,它们会保持本地机器与 Homestead 环境之间同步。 你可以根据需要配置多个共享文件夹:

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

如果你只创建几个网站,这种通用的映射将运行的很好。但是,随着网站数量的不断增加,你可能会开始遇到性能问题。在包含大量文件的低性能机器或项目中,这个问题会非常明显。如果遇到此问题,请尝试将每个项目映射到自己的 Vagrant 文件夹:

folders: 
   - map: ~/code/project1
      to: /home/vagrant/code/project1  
    - map: ~/code/project2
      to: /home/vagrant/code/project2

若要开启 NFS, 你只需要在共享的文件夹配置中添加一个简单的标志:

folders:    - map: ~/code
      to: /home/vagrant/code
      type: "nfs"

{note} 当使用 NFS 时,你最好使用 vagrant-winnfsd 扩展插件。 这个插件会替你处理 Homestead box 中的文件或目录权限的问题。

你也可以通过在 options 中列出 Vagrant's 的共享文件夹 支持的任何选项:

folders:    - map: ~/code
      to: /home/vagrant/code
      type: "rsync"
      options:
          rsync__args: ["--verbose", "--archive", "--delete", "-zz"]
          rsync__exclude: ["node_modules"]

配置 Nginx 站点

对 Nginx 不熟悉?没关系。 sites 功能可以让你在 Homestead 上轻松的映射一个 "域名" 到一个文件夹。在 Homestead.yaml 文件中包含了一个简单的站点配置示例。同样,您可以根据需要为您的 Homestead 环境添加很多的站点。Homestead 可以为你正在开发的每个 Laravel 项目提供一个方便的虚拟化环境:

sites:    - map: homestead.test
      to: /home/vagrant/code/my-project/public

如果你在配置 Homestead 虚拟机后更改了 sites 选项,你需要再次运行 vagrant reload --provision 命令去更新虚拟机上的 Nginx 配置.

Hosts 文件

你必须将 Nginx 站点中所添加的域名添加到你本机的 hosts 文件中。 hosts 文件会将把访问你 Homestead 站点的请求重定向到你的 Homestead 虚拟机上。在 Mac 和 Linux 中,该文件的地址在 /etc/hosts,在 Windows 中位于 C:\Windows\System32\drivers\etc\hosts。添加新站点的格式如下所示:

192.168.10.10  homestead.test

确保监听的 IP 地址是你在 Homestead.yaml 文件中所设置的。一旦你将将域名添加到 hosts 文件中并启动 Vagrant Box 后,你就可以通过浏览器访问该站点了:

http://homestead.test

启动 Vagrant Box

根据你的需求编辑完成 Homestead.yaml,在你的 Homestead 文件夹中运行 vagrant up 命令。Vagrant 将启动虚拟机并自动配置你的共享文件夹和 Nginx 站点。

若要删除虚拟机,只需要运行 vagrant destroy --force 命令。

根据项目安装

除了全局安装 Homestead 并且在所有项目共享相同的 Homestead box 之外, 你可以为每个项目配置 Homestead 实例。 通过在项目下创建 Vagrantfile,其他的项目成员只需运行 vagrant up 就能拥有相同的开发环境。

要将 Homestead 直接安装到项目中,需要使用 Composer 命令:

composer require laravel/homestead --dev

Homestead 安装之后, 使用 make 命令在项目根目录中生成 VagrantfileHomestead.yaml 文件。 make 命令会自动配置 Homestead.yaml 文件中 sitesfolders 指令。

Mac / Linux:

php vendor/bin/homestead make

Windows:

vendor\\bin\\homestead make

接下来,在命令行中运行 vagrant up 命令,然后在浏览器中访问 http://homestead.test 。 记住,在访问之前你仍然需要在 /etc/hosts 文件中添加你的 homestead.test 记录或者其他的域名。

安装 MariaDB

如果你喜欢使用 MariaDB 而不是 MySQL, 你可以在 Homestead.yaml 文件中增加一个 mariadb 的选项。这个选项会删除 MySQL 并安装 MariaDB。 MariaDB 只是作为 MySQL 的旁支替代品,因此你还是可以在应用的数据库配置中使用 mysql 数据库驱动:

box: laravel/homestead
ip: "192.168.10.10"memory: 2048cpus: 4provider: virtualbox
mariadb: true

安装 MongoDB

如果你需要安装 MongoDB 社区版, 你可以在 Homestead.yaml 文件中将配置修改为:

mongodb: true

MongoDB 默认的安装方式会把数据库的用户名设置为 homestead ,默认密码为 secret

安装 Elasticsearch

如果你要安装 Elasticsearch,你可以在  Homestead.yaml 文件中添加  elasticsearch 选项并指定支持的版本号。可以仅包含主版本,也可以是某个具体的版本号(major.minor.patch)。默认安装会创建一个名为 'homestead' 的集群。 注意永远不要赋予 Elasticsearch 超过操作系统一半的内存,因此请保证你的 Homestead 至少分配了两倍于 Elasticsearch 的内存:

box: laravel/homestead
ip: "192.168.10.10"memory: 4096cpus: 4provider: virtualbox
elasticsearch: 6

{tip} 你可以查看 Elasticsearch documentation 文档学习如何自定义你的配置。

安装 Neo4j

Neo4j 是一个图形数据库管理系统。要安装 Neo4j 社区版,需要更新 Homestead.yaml 配置项如下:

neo4j: true

默认安装的 Neo4j 会将数据库用户名设置为 homestead ,对应的密码设置为 secret 。 要查看 Neo4j 可以在浏览器中访问 http://homestead.test:7474 。 Neo4j 对外提供了三个端口: 7687 (Bolt)、 7474 (HTTP)、 7473 (HTTPS) 用于从客户端访问。

别名

你可以通过编辑 Homestead 目录下的 aliases 文件为 Homestead 虚拟机添加 Bash 别名:

alias c='clear'alias ..='cd ..'

更新完 aliases 文件后, 你应该使用 vagrant reload --provision 命令重启 Homestead 虚拟机, 以确保新的别名在机器上可用。

日常使用

全局可用的 Homestead

有时你可能想在文件系统的任意路径都能运行 vagrant up 命令启动 Homestead 虚拟机。在 Mac / Linux 系统上可以在 Bash 配置文件( ~/.bash_profile )中添加 Bash 函数 。在 Windows 上, 你可以添加「批处理」文件到 PATH 。这些脚本允许你在系统的任何位置运行 Vagrant 命令并自动将该命令指向 Homestead 的安装路径:

Mac / Linux

function homestead() { 
   ( cd ~/Homestead && vagrant $* )
   }

确保将该函数中的 ~/Homestead 路径调整为实际的 Homestead 安装路径。这样你就可以在系统的任意位置运行 homestead uphomestead ssh 等命令。

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 uphomestead ssh 等命令。

通过 SSH 连接

你可以通过在 Homestead 目录下运行 vagrant ssh 终端命令以 SSH 的方式连接到虚拟机。

但是,你可能需要频繁连接 Homestead 虚拟机,因此请考虑将上面的「函数」添加到主机以便快速地以 SSH 方式连接到 Homestead 虚拟机。

连接数据库

homestead 默认已经在虚拟机中为 MySQL 和 PostgreSQL 数据库做好了配置。为了方便起见, Laravel 中的 .env 文件将框架配置成默认使用此数据库。

要从主机的数据库客户端连接到 MySQL 或 PostgreSQL ,应该连接到 127.0.0.1 ,端口  33060 (MySQL) 或 54320 (PostgreSQL)。用户名和密码分别是 homestead / secret

{note} 只有从本地连接 Hoemstead 的数据库时才能使用这些非标准的端口。而 Laravel 在虚拟机中 运行时还是应该使用默认的 3306 和 5432 端口进行数据库连接。

数据库备份

当你的 Vagrant 盒子销毁时,Homestead 能自动备份你的数据库。为了利用这个功能,你必须使用 Vagrant 2.1.0 或者更高的版本。或者,如果你使用一个旧版本的 Vagrant,你必须安装 vagrant-triggers 插件。为了开启自动数据库备份,添加如下的行到你的 Homestead.yaml 文件:

backup: true

一旦配置了,当 vagrant destroy 命令被执行时,Homestead 将导出你的数据库到 mysql_backuppostgres_backup 目录。如果你使用 每个项目安装 方法,则可以在克隆的 Homestead 或者在你的项目根目录中找到这些目录。

添加额外的站点

一旦你的 Homestead 环境已配置并运行,你可以为你的 Laravel 应用添加额外的 Nginx 站点。你可能希望在单个 Homestead 环境运行多个 Laravel 安装。要添加额外的站点,到 Homestead.yaml 文件中添加站点:

sites:
    - map: homestead.test
      to: /home/vagrant/code/my-project/public
    - map: another.test
      to: /home/vagrant/code/another/public

如果 Vagrant 不能自动管理你的『hosts』文件,你可能还需要添加新的站点到该文件中:

192.168.10.10  homestead.test
192.168.10.10  another.test

一旦这个站点被添加,从你的 Homestead 目录运行 vagrant reload --provision 命令。

站点类型

Homestead 支持多种类型的站点,允许你轻松运行不是基于 Laravel 的项目。例如,我们可以使用 symfony2 站点类型轻松地添加一个 Symfony 应用到 Homestead:

sites:
    - map: symfony2.test
      to: /home/vagrant/code/my-symfony-project/web
      type: "symfony2"

可用的站点类型是:apacheapigilityexpressivelaravel(默认),proxysilverstripestatamicsymfony2symfony4,和 zf

站点参数

你可以通过 params 站点指令添加额外的 Nginx fastcgi_param 值到你的站点。例如,我们添加一个值为 BARFoo 参数:

sites:
    - map: homestead.test
      to: /home/vagrant/code/my-project/public
      params:
          - key: FOO
            value: BAR

环境变量

你能通过添加如下的值到 Homestead.yaml 文件来设置全局环境变量:

variables:
    - key: APP_ENV
      value: local
    - key: FOO
      value: bar

更新 Homestead.yaml 文件之后,确保通过运行 vagrant reload --provision 命令重新配置机器。这个将更新所有安装 的 PHP 版本的 PHP-FPM 配置并为 vagrant 用户更新环境。

配置定时计划

Laravel 提供了一种 计划定时作业 的方式,通过安排单个 schedule:run Artisan 命令去每分钟运行。schedule:run 命令将检查在你在 App\Console\Kernel 类中定义的计划来决定运行哪个作业。

如果你想为一个 Homestead 站点的 schedule:run 命令运行起来,在定义站点时,你可以设置 schedule 选项为 true

sites:
    - map: homestead.test
      to: /home/vagrant/code/my-project/public
      schedule: true

站点的 Cron 作业将被定义在虚拟机的 /etc/cron.d 目录中。

Configuring Mailhog

Mailhog 允许你轻松地捕获外发的电子邮件并进行检查它,而实际上没有将发送邮件给收件人。开始使用时,使用以下的邮件设置更新你的 .env 文件:

MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

一旦 Mailhog 被配置,你可以在 http://localhost:8025 上访问 Mailhog 控制面板。

配置 Minio

Minio 是一个开源的对象存储服务器,具有与 Amazon S3 兼容的 API。要安装 Minio,用以下的配置选项更新你的 Homestead.yaml 文件:

minio: true

默认情况下,Minio 在端口 9600 上是可用的。你可以访问 Minio 控制面板通过访问 http://homestead:9600。默认访问的键名是 homestead,同时默认的密钥是 secretkey。当访问 Minio 时,你应当总是使用 us-east-1

为了使用 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

为了配置存储桶,在 Homestead 配置文件中添加一个 buckets 指令:

buckets:
    - name: your-bucket
      policy: public
    - name: your-private-bucket
      policy: none

支持的 policy 值包括:nonedownloaduploadpublic

端口

默认情况下,如下的端口将转发到你的 Homestead 环境:

  • SSH:2222 -> 转发到 22
  • ngrok UI:4040 -> 转发到 4040
  • HTTP:8000 -> 转发到 80
  • HTTPS:44300 -> 转发到 443
  • MySQL:33060 -> 转发到 3306
  • PostgreSQL:54320 -> 转发到 5432
  • MongoDB:27017 -> 转发到 27017
  • Mailhog:8025 -> 转发到 8025
  • Minio:9600 -> 转发到 9600

转发额外的端口

如果你愿意,你可以转发额外的端口到 Vagrant 盒子,同时也指定他们的协议:

ports:
    - send: 50000
      to: 5000
    - send: 7777
      to: 777
      protocol: udp

共享你的环境

有时你希望共享你当前工作的内容跟同事或客户。Vagrant 有内置的方法通过 vagrant share 去支持这个;然而,如果在 Homestead.yaml 文件中有多个站点配置,这个将不会工作。

为了解决这个问题,Homestead 包含它自己的 share 命令。开始时,SSH 通过 vagrant ssh 进入你的 Homestead 机器并运行 share homestead.test。这个将从你的 Homestead.yaml 配置文件中分享 homestead.test 站点。当然,你可以将任何其它配置的站点替换为 homestead.test

share homestead.test

运行此命令之后,你将看到一个 Ngrok 屏幕出现,其中包含了活动日志和共享站点的可访问的 URLs。如果你想指定一个自定义的区域,子域,或者其它 Ngrok 运行时选项,你可以添加他们到你的 share 命令:

share homestead.test -region=eu -subdomain=laravel

{note} 记住,Vagrant 本质上是不安全的,并且在运行 share 命令时将虚拟机显露到互联网。

多版本 PHP

Homestead 6 在同一个虚拟机上引入了对多个 PHP 版本的支持。你可以在你的 Homestead.yaml 文件中指定要用于给定站点的 PHP 版本。可用的 PHP 版本是:『7.1』,『7.2』和『7.3』(默认):

sites:
    - map: homestead.test
      to: /home/vagrant/code/my-project/public
      php: "7.1"

另外,你可以通过 CLI 使用任何支持的 PHP 版本:

php7.1 artisan list
php7.2 artisan list
php7.3 artisan list

Web 服务器

默认情况下,Homestead 使用 Nginx web 服务器。然而,如果 apache 是指定的一个站点类型,它能安装 Apache。同时两个 web 服务器在同时被安装,他们不能同时运行。flip 脚本命令可用来轻松处理 web 服务器之间的切换。flip 命令自动确定正在运行的 web 服务器,将其关闭。然后启动其它服务器。要使用这个命令,SSH 进入到你的 Homestead 机器并在终端运行命令:

flip

邮件

Homestead 包括 Postfix 邮件传输代理,默认监听 1025 端口。因此,你可以指示你的应用程序在 localhost 端口 1025 上使用 smtp 邮件驱动。所有发送的邮件将由 Postfix 处理并由 Mailhog 捕获。要查看已发送的邮件,在 web 浏览器中打开 http://localhost:8025

网络接口

Homestead.yaml 中的 networks 属性为 Homestead 环境配置网络接口。你可以根据需要配置多个接口:

networks:
    - type: "private_network"
      ip: "192.168.10.20"

要开启一个 桥接 接口,配置 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)"

扩展 Homestead

你能在 Homestead 根目录下使用 after.sh 脚本扩展 Homestead。在这个文件中,你可以添加正确配置和自定义虚拟机所需的任何 shell 命令。

当自定义 Homestead 时,Ubuntu 可能会询问你是否要保留程序包的原始配置或者用一个新的配置文件覆盖它。为了避免这种情况,你应该在安装软件包时使用以下的命令,以避免覆盖之前由 Homestead 编写的任何配置:

sudo apt-get -y \
    -o Dpkg::Options::="--force-confdef" \
    -o Dpkg::Options::="--force-confold" \    
    install your-package

更新 Homestead

你能通过一些简单的步骤更新 Homestead。首先,你应当使用 vagrant box update 命令更新 Vagrant 盒子:

vagrant box update

接下来,你需要去更新 Homestead 源代码。如果你克隆过仓库,你能在最初克隆仓库的位置运行如下的命令:

git fetchgit checkout v8.0.1

这些命令从 GitHub 仓库拉取最新的 Homestead 代码,获取最新的标记,然后检出最新的标记版本。你能在 GitHub 版本页面 找到最新稳定的版本。

如果你通过你的项目的 composer.json 安装 Homestead,你应当确保你的 composer.json 包含 "laravel/homestead": "^8" 并更新你的依赖项:

composer update

最后,你将需要销毁和重新生成你的 Homestead 盒子去利用最新的 Vagrant 安装。为了实现这个,在你的 Homestead 目录运行如下的命令:

vagrant destroy
vagrant up

提供特殊设置

VirtualBox

natdnshostresolver

默认情况下,Homestead 将 natdnshostresolver 配置设置为 on。这允许 Homestead 去使用你的主机操作系统的 DNS 设置。如果你不想覆盖这个行为,添加如下的行到你的 Homestead.yaml 文件:

provider: virtualbox
natdnshostresolver: off

Windows 上的符号链接

如果符号链接在你的 Windows 机器上无法正常工作,你可能需要添加以下的块到 Vagrantfile 文件:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
    end
本文章首发在 LearnKu.com 网站上。