对 Summer 的 “Homestead 2.0 安装笔记” 的补充

前言:

首先,请明确一点:部署homestead意味着什么?
本地开发的同时,已经在仿真生产环境(linux)中进行部署。我们在各种操作系统上碰到的各种奇怪的坑,在这里也许都将不存在。但是,前提是你得拥有一台高配计算机,不然会十分卡顿。

因为在部署homestead的过程中,出现了很多未知的问题,这些内容如果我们只是对网上的内容“照搬执行”,而没有理解每个配置项的作用,那么只会导致我们越来越心烦意乱,甚至有放弃的打算,当然,我也有过。在看别人的解决方案的同时,我们还需要去思考哪里不一样。
为了完整的部署homestead,这次整整花了3天左右时间部署(人不逼一逼自己,怎么知道行还是不行。),并将每一处产生问题的细节整理成文,让大家可以快速开心部署,学习应该是一种快乐的过程,分享也同样令人感到愉悦!

正常步骤可先参考summer的:

  1. Homestead 安装需要知道的一些信息
  2. Homestead 2.0 安装笔记

一、版本选择

我们要做的第一件事情是明确自己需要什么样的生产环境,是最新的,还是指定版本的。我们在下载virtualbox.box的时候可以先去 https://atlas.hashicorp.com/laravel/boxes/homestead/ 获取版本信息(里面含有每个box的ubuntu的版本,里面所部署好的nginx等相关部件基本说明)。比如我们需要使用ubuntu14.04 LTS版,在刚才链接里面查询的结果是他对应着0.2.7版。(关于下载慢,或者不支持断点续传的问题,请参照summer的Homestead 安装需要知道的一些信息

二、安装box

所以,我们的box安装就应该如下:

vagrant box add laravel/homestead --box-version=0.2.7

有的网站上的文章在安装的时候会提及到可以这样来安装:

vagrant box add homestead --box-version=0.2.7

也就是可以对安装的box进行重命名,但是这样会造成异常:

> Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'base' could not be found. Attempting to find and install...

解决办法:
如果上面我们将laravel/homestead重命名为"lhu1404",在homestead.rb文件中还需要重新配置,改为:

> #Configure The Box
config.vm.box = settings["box"] ||= "lhu1404"
config.vm.box_version = settings["version"] ||= "< 0.4.0"
config.vm.hostname = settings["hostname"] ||= "homestead"

我们再来安装box:

vagrant box add lhu1404 --box-version=0.2.7

再执行list命令看看我们安装的box:

vagrant box list

安装laravel/homestead

composer global require "laravel/homestead=~2.0"

(请确定 ~/.composer/vendor/bin 目录在你的 PATH 里面.)
在命令行中执行homestead测试是否安装完成。

注意

vagrant box add laravel/homestead 其实直接指向的是ubuntu最新版的。

三、初始化

homestead init (或:vagrant init laravel/homestead)
Creating Homestead.yaml file... 

四、修改yaml文件

Homestead.yaml file created at: C:\Users\Administrator\.homestead/Homestead.yaml
( The host path of the shared folder is missing: ~/Code):
folders :
    - map: H:\Laravel_Projects\hproject
(修改map为自己的实际项目地址,会自动映射到下面的“to”中)
      to: /home/vagrant/Code(服务器中存放项目的根目录)

ip: "192.168.10.10" (将这个地址放到host文件中)

provider: virtualbox(provider为自己虚拟机类型)

authorize: c:/Users/Administrator/.ssh/id_rsa.pub. (由git下面的ssh-keygen生成,一般放在此目录,这样就可以用ssh进行免密码登录)

sites:
    - map: storefee.app
      to: /home/vagrant/newlaravelblog/public(项目中的public目录)

databases:
    - homestead(此数据库可配置为自己项目对应的数据库)

五、修改host文件

在C:\Windows\System32\drivers\etc中找到host文件,添加:

192.168.10.10    storefee.app (与上面 sites->map 中的内容一致)

六、homestead up (命令行)需要进入项目目录

异常(此异常发生在Vagrant的1.9.3版本中,有网友建议退回到1.8.6版,其实大可不必)
只需要在homestead.rb文件中添加127.0.0.1相关的信息即可,详细如下:

C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_open.rb:21:in initialize: The requested address is not valid in its context. -connect(2) for "0.0.0.0" port 8000 (Errno::EADDRNOTAVAIL)

下面为解决办法,打开文件:

C:\Users\Administrator\AppData\Roaming\Composer\vendor\laravel\homestead\scripts\homestead.rb

将:

#Use Default Port Forwarding Unless Overridden
default_ports.each do |guest, host|
  unless settings["ports"].any? { |mapping| mapping["guest"] == guest }
    config.vm.network "forwarded_port", guest: guest, host: host, auto_correct: true
  end
end

#Add Custom Ports From Configuration
if settings.has_key?("ports"
  settings["ports"].each do |port|
    config.vm.network "forwarded_port", guest: port["guest"], host: port["host"], protocol: port["protocol"], auto_correct: true
  end
end

替换成:

#Use Default Port Forwarding Unless Overridden
unless settings.has_key?("default_ports") && settings["default_ports"] == false
    default_ports.each do |guest, host|
        unless settings["ports"].any? { |mapping| mapping["guest"] == guest }
            config.vm.network "forwarded_port", guest: guest, host: host, host_ip: "127.0.0.1", auto_correct: true
        end
    end
end

#Add Custom Ports From Configuration
if settings.has_key?("ports")
    settings["ports"].each do |port|
        config.vm.network "forwarded_port", guest: port["guest"], host: port["host"], protocol: port["protocol"], host_ip: "127.0.0.1", auto_correct: true
    end
end

注意:如果出现502异常,说明上面项目目录配置有问题。

七、使用Navicat for Mysql进行登录

homestead默认登录账号与密码:
用户名:homestead
密码:secret
命令行登陆:$ mysql -uhomestead -psecret
发现在homestead.yaml中配置的数据库也在数据库列表中。

laravel项目.env中数据库配置需要与homestead中一致:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravelblog
DB_USERNAME=homestead
DB_PASSWORD=secret

在homestead中进行数据表迁移时出现异常:

[PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default val
  ue for 'published_at'

凡是在数据迁移表中,含有“$table->timestamps();”的地方,需要把它放在”$table->“的最后一行,否则就报上面这个错误。
将:

$table->timestamps();
$table->timestamp('published_at')->index();

调整为:

$table->timestamp('published_at')->index();
$table->timestamps();

八、多站点部署

此时,一定要注意如果你现在是否已经开启了VPN或相关代理软件(最好将其关掉),在进行多站点部署,访问项目时,会出现如下问题(单个项目部署时,就算开启VPN软件也并不会出现这个问题):

500 internal server error

这会导致多项目(多站点)不能正常映射各个项目(所有项目都指向同一个):

folders:
    - map: H:\wamp\www\newlaravelblog
      to: /home/vagrant/newlaravelblog
    - map: H:\wamp\www\study-project
      to: /home/vagrant/study-project

sites:
    - map: storefee.app
      to: /home/vagrant/newlaravelblog/public
    - map: study.app
      to: /home/vagrant/study-project/public

databases:
    - laravelblog
    - study

注意:每个项目都需要在这3个配置项中进行配置,而且需要在各自项目的.env文件中单独配置各自需要的数据库名。
要使新添加站点有效对应,必须配置完后,执行:

homestead up --provision

TODO:

2017.4.21 添加【待完善】
解决使用VPN的同时,可以进行多项目的部署。因为我们经常在开发项目时需要查阅国内外资料。

Done :
2017.4.24

解决方案一:
安装的VPN软件中含有白名单设置功能,可以直接将localhost或者127.0.0.1添加进去,从而进行“直接访问”,而不通过代理模式,这样的化,可以在任意浏览器中正常访问自己的所有项目了。但是像蓝灯这样的软件没有办法添加,所以我们有了第二套方案。


解决方案二:安装好VPN软件后,我们使用chrome浏览器,在里面安装SwitchyOmega插件,然后在“代理服务器”里面设置如下内容,要特别注意这里的代理端口需要设置为你的VPN的端口号。(可到启动任务管理器中寻找):

网址协议 代理协议 代理服务器 代理端口
(默认) socks 127.0.0.1 1080

然后在不代理的地址列表中配置好你不需要VPN代理的路由:
如:

127.0.0.1
::1
localhost
myproject.app

总结

本文并不是替代开篇所提及2篇文章内容,只是作为补充。
也许是summer说过,不想掺杂过多个人思考的原因。本文行文更多的是对你所需要执行的每一个操作,每一处修改都进行解释说明,为什么需要这样做。

努力是不会骗人的!