vagrant

vagrant环境搭建文档
puphpet 配置服务器

Shared Folder Type

NFS is highly recommended for OSX and Linux! Make sure to install the vagrant-bindfs plugin with $ vagrant plugin install vagrant-bindfs

Vagrant 环境配置

mac 配置

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.box_check_update = false
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "../code", "/home/vagrant/code", owner: 'vagrant', group: 'vagrant'
end

Nginx 默认以 nginx 身份运行,需要修改为 vagrant:

user vagrant;
http {
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}

修改项目的 Nginx 配置文件:

server {
    root "/home/vagrant/code/app-laravel/public";
    access_log off;
    error_log  /var/log/nginx/example.com-error.log;
}

PHP-FPM 默认以 apache 身份运行,需要修改为 vagrant

设置 PHP 的运行 user、group和记录错误日志的 path,修改 /etc/php-fpm.d/www.conf 中的 user、group 和 error_log

user = vagrant
group = vagrant
listen.owner = vagrant
listen.group = vagrant
error_log = /vagrant/code/php-fpm.www-error.log

完成后重启 PHP-FPM:

systemctl restart php-fpm.service

安装 composer 依赖包:

cd ~/code/example.com
composer install

PS:因为需要手动在项目目录下执行 compoesr 命令,所以这里 user/owner 为 vagrant。生产部署时可以将上述出现的用户 vagrant 都修改为部署专用用户 deploy

查看 PHP-FPM 和 Nginx 的运行身份:

ps aux|grep php-fpm
ps aux|grep nginx

安装相关软件

  • virtualbox
  • vagrant
  • xshell(官网下载比较麻烦,找百度或360吧)

安装完毕后重启电脑

Windows 必须要做的事情

注意,一定要开启 VT-x/AMD-V 硬件加速

开机进入BIOS选项 ,依次选Config->CPU->Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出,关机,然后启动机器。

vagrant 常用命令

vagrant
vagrant list-commands
vagrant up -h

创建一个虚拟机的三步骤:

# 列出当前本机已有的 box
vagrant box list
# 下载官方 box
vagrant box add {title} {url}
# 手动下载 box 并添加到系统: vagrant box add ubuntu/trusty64 本地文件路径
vagrant box add ubuntu/trusty64 ubuntu_dev0.1.box
# 初始化一个新 box: vagrant init {title}
vagrant init ubuntu/trusty64
# 启动
vagrant up

设置 box 下载存放地址

boxes默认是放在~/.vagrant.d/boxes下面的。

cp ~/.vagrant.d/   /path/to/vagrant_home/

修改 ~/.zshrc 添加:
VAGRANT_HOME = /path/to/vagrant_home/

手动下载 box 并添加

vagrant init ubuntu/trusty64
vagrant up

等出现下载地址后,Ctrl+C 终止掉,复制 url 下载。下载完成后,在 virtualbox.box 相同目录下,创建原始文件 metadata.json,内容如下:

Windows 下样例:

{
    "name": "ubuntu/trusty64",
    "versions": [{
        "version": "20160822.0.2",
        "providers": [{
            "name": "virtualbox",
            "url": "file:///d:/path/to/file.box"
        }]
    }]
}

MacOS homestead v6.1.0 下的样例:

{
    "name": "laravel/homestead",
    "versions": [{
        "version": "6.1.0",
        "providers": [{
            "name": "virtualbox",
            "url": "file:///Users/用户名/Downloads/file.box"
        }]
    }]
}

然后导入系统:

vagrant box add metadata.json
vagrant box list

这种方式导入的 box 会有版本号。

Vagrant 使用 Ubuntu16.04

vagrant init ubuntu/xenial64
vagrant up

等出现下载地址后,Ctrl+C 终止掉,复制 url 用 EagleGet 下载。
下载完成后,在 virtualbox.box 相同目录下,创建原始文件 metadata.json,内容如下:

{
    "name": "ubuntu/xenial64",
    "versions": [{
        "version": "20160822.0.2",
        "providers": [{
            "name": "virtualbox",
            "url": "file:///d:/path/to/file.box"
        }]
    }]
}

F:\boxes\file.box 要更改为 F:/boxes/file.box

然后倒入到系统:

vagrant box add xenial64.json
vagrant box list

这种方式导入的 box 会有版本号。

用户名和密码保存在 C:\Users\用户名\.vagrant.d\boxes\ubuntu-VAGRANTSLASH-xenial64\20171221.0.0\virtualbox\Vagrantfile 中。

public key 在 box 所在目录下可以找到。

修改配置文件 Vagrantfile 记得关闭检查更新和网络:

config.vm.box_check_update = false

config.vm.network "public_network", ip: "分配的IP"

vagrant@ubuntu-xenial

为了避免安装软件时,会崩溃,需要开启 swap: http://haobing.wang/swap/

Centos7

vagrant box add centos/7

选择 provider virtualbox 一般下载会非常慢,甚至中途断开连接,所以直接ctrl + c,中断下载,复制链接,直接用迅雷加速下载 下载完毕后

vagrant box add centos/7  box_url # box_url 为box本地保存地址

切换到工作目录,然后创建虚拟机:

vagrant init centos/7

启动虚拟机:

vagrant up

win10

这里会有问题:Vagrant with VirtualBox on Windows10: “Rsync” could not be found on your PATH

vagrant在host和box之间共享文件夹有多种方案,centos官方推荐nfs,不过我不喜欢在windows上在安装一个nfs server(因为开发目录要在host上),还是用virtualbox的 VirtualBox Guest Additions 修改目录C:\Users\yourname.vagrant.d\boxes\centos7\0\virtualbox下的Vagrantfile:

config.vm.synced_folder ".", "/vagrant", type: "rsync"

type 的值改为 virtualbox
Windows 下执行命令来安装插件:

vagrant plugin install vagrant-vbguest

ubuntu 如果启动不正常,可以卸载该插件:

vagrant plugin uninstall vagrant-vbguest

重新启动:

vagrant reload

登录虚拟机

虚拟机默认是通过 private key 登录的。

macos 下可以通过命令 vagrant ssh 直接登录。Windows 上使用 xshell 来登录。我们执行 vagrant ssh-config 可以看到该虚拟机对应的 private_key 路径,在 xshell 中将登录方法设置为 public key,然后选中 private_key 文件,用户名为 vagrant,即可正常登录了。

为项目创建一个 vbox

[D:\vagrant]$ mkdir myproject

[D:\vagrant\myproject]$ cd myproject

[D:\vagrant\myproject]$ vagrant init ubuntu/trusty64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.


# 启动我们的虚拟机,由于系统当前没有下载过任何镜像,所以 vagrant 就会到 https://atlas.hashicorp.com 去下载 ubuntu/trusty64 对应的镜像。
[D:\vagrant\myproject]$ vagrant up

设置网络方式

私有网络(Private network)

config.vm.network "private_network", ip: "192.168.33.10"

公有网络(Public network)

config.vm.network "public_network", ip: "192.168.1.133"

端口映射(Forwarded port)

config.vm.forwarded_port 80, 8080

fix: npm ERR! syscall symlink with Virtualbox shared folders.

修复:npm ERR! syscall symlink

1.Windows用户,以管理员启动 cmd,运行 vagrant up 即可。
2.npm config set bin-links false

fix: Uncaught SyntaxError: Invalid or unexpected token

有一堆 \u0 追加在文件尾部

Maybe you are using config.vm.synced_folder try to use NFS:

# 将 Vagrantfile 所在的目录,映射到,虚拟机的 /vagrant
config.vm.synced_folder ".", "/vagrant", :nfs => true 

如果用的是 VirtualBox provider,需要修改 /etc/nginx/nginx.conf

sendfile on; 改为 sendfile off;

参考资料

打包

vagrant package --output xxx.box

异常关机恢复

C:\Users\bill\VirtualBox VMs{name} 下,将 {name}.vbox.tmp 改名为 {name}.vbox