- 开发 laravel,虽然用 Homestead 十分方便,但 Homestead 在某种程度是个黑盒子,也无法用在生产环境,在最后的部署,依然会吃尽苦头,所以不妨利用 vagrant,快速、方便打造一个与生产环境相近的开发环境。
- 本文暂未在 Windows 系统中测试,其中
将本地与虚拟机文件同步类型改为 nfs
,根据 vagrant 文档,暂不支持 Windows 系统,所以本文很有可能不适用于 Windows 系统。
1. 利用 vagrant,安装多个系统
-
前往 vagrant 官网下载页面,下载、安装 vagrant。另外,自行安装 VirtualBox
-
vagrant 安装 Ubuntu 18.4、Ubuntu 16.4
- 在 vagrant cloud,可以下载、安装 box,一步到位,但下载过程太过漫长,建议按下述方式分开进行。
- 下载 box
- 前往
http://cloud-images.ubuntu.com/
,用下载软件下载相应的 vagrant box
- 前往
- 将下载好的 box 复制到相应的目录,添加 box
vagrant box add ubuntu16 xenial-server-cloudimg-amd64-vagrant.box
vagrant box add ubuntu18 bionic-server-cloudimg-amd64-vagrant.box
- 初始化 box。这里的 box 名称,与上一步的名称一致
vagrant init ubuntu16
vagrant init ubuntu18
- 这时目录下多了一个 Vagrantfile 文件,取消这个文件中这一行的注释:
config.vm.network "forwarded_port", guest: 80, host: 8080
- 由于挂载多个系统,注意后者的 host 端口不要冲突,我将 ubuntu18 设为 8018,ubuntu16 设为 8016
- 启动 box:
vagrant up
- 此时,在 VirtualBox 可以看到两个系统已经打开
-
参考 文档,同步本地及虚拟机文件
- 修改 Vagrantfile,把
# config.vm.synced_folder "../data", "/vagrant_data"
修改为:config.vm.synced_folder "/Users/dayscene/code", "/home/vagrant/code"
,注意调整/Users/dayscene/code
为个人本地目录。 - 重启虚拟机:
vagrant reload --provision
- 进入 box:
vagrant ssh
,发现在/home/vagrant
目录下多了一个code
目录,其中文件与本地文件一致。
- 修改 Vagrantfile,把
2. 安装 Nginx,MySQL,PHP
主要参考 digitalocean 的这篇文章 搭建 LNMP
-
进入 box:
vagrant ssh
。进入后,先更新系统安装源:sudo apt-get update
-
安装 Nginx:
sudo apt-get install nginx
- 在浏览器中分别访问
http://localhost:8018/
、http://localhost:8016/
,看到 Nginx 默认页面,表示 Nginx 安装成功。
- 在浏览器中分别访问
-
安装 MySQL 5.7:
sudo apt-get install mysql-server
- 在 ubuntu16,安装过程中会跳出设置 root 用户密码的弹窗。
- 在 ubuntu18,需要额外配置:
sudo mysql_secure_installation
- root 用户默认采用 auth_socket 登录,因此无法直接通过
mysql -uroot -p
登录,需要稍作修改:- 先进入 mysql:
sudo mysql
- 修改 root 用户:
alter user 'root'@'localhost' identified with mysql_native_password by 'password';
最后一个单词 password,需要改为你的密码 - 更新修改:
flush privileges;
- 查看 root 用户的 plugin 是否为 mysql_native_password:
select user,authentication_string,plugin,host from mysql.user;
- 先进入 mysql:
-
安装 PHP 7.2
- 在 ubuntu16,PHP 默认源的版本是 7.0,目前 Laravel 5.7 要求 PHP 的最低版本是 7.1,显然不能满足开发需求。参考 这篇文章,安装 PHP 7.2
- 增加 ppa 源:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
- 安装 PHP:
sudo apt-get install php7.2-fpm php7.2-mysql
- 增加 ppa 源:
- 在 ubuntu18,直接安装:
sudo apt-get install php-fpm php-mysql
- 在两个系统查看 PHP 的安装版本:
php -v
,都是 PHP 7.2
- 在 ubuntu16,PHP 默认源的版本是 7.0,目前 Laravel 5.7 要求 PHP 的最低版本是 7.1,显然不能满足开发需求。参考 这篇文章,安装 PHP 7.2
-
安装 composer
- 先安装依赖:
sudo apt-get install curl php-cli php-mbstring git unzip
- 下载 installer:
curl -sS https://getcomposer.org/installer -o composer-setup.php
- 验证 installer:
- 前往 composer.github.io/pubkeys.htm…,复制 SHA-384 签名
- 利用 PHP 自带的
hash_file
函数进行验证:php -r "if(hash_file('SHA384','composer-setup.php')==='上一步复制的 SHA-384 签名') {echo 'verified';} echo PHP_EOL;"
,如果输出verified
,表示通过验证。
- 执行安装:
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
- 删除 installer:
rm composer-setup.php
- 可选:如果后续 composer 安装太慢,可以使用 laravel-china 的 国内镜像
composer config -g repo.packagist composer https://packagist.laravel-china.org
- 先安装依赖:
-
至此,已基本完成开发环境的搭建,新建一个项目看看:
composer create-project laravel/laravel blog --prefer-dist "5.7.*"
- 发现报错:
Your requirements could not be resolved to an installable set of packages.
- 原因是部分 PHP 扩展没有安装,安装扩展:
sudo apt-get install php7.2-xml
- 删除上一步安装失败的 blog 项目:
rm -rf blog/
,再次安装,没有报错。 - 虽然当前安装没有问题,后续 composer 安装第三库时仍可能出现此类问题,届时再按类似方法解决:
- 在搜索引擎此类报错是由于哪个扩展没有安装引起
- 查找安装源是否有这个扩展:
sudo apt list | grep php7.2
,若有,即可直接安装。
- 发现报错:
-
配置 Nginx。Nginx 的配置文件在
/etc/nginx
目录,打开该目录,发现其网站配置结构为:在sites-available
目录添加各个网页配置,若想该配置生效,再在sites-enabled
目录创建一个软链接- 创建一个配置文件:
sudo vi /etc/nginx/sites-available/blog.test
,参考 laravel 文档 部署,写入:server { listen 80; server_name blog.com; root /home/vagrant/code/blog/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.(?!well-known).* { deny all; } } 复制代码
- 创建一个软链接:
sudo ln -s /etc/nginx/sites-available/blog.test /etc/nginx/sites-enabled/
- 删除默认配置文件:
sudo unlink /etc/nginx/sites-enabled/default
- 测试配置文件语法是否正确:
sudo nginx -t
- 重启 Nginx:
sudo service nginx reload
- 创建一个配置文件:
-
浏览器中访问,发现 laravel 报错:
"/home/vagrant/code/blog/storage/logs/laravel-2019-01-14.log" could not be opened: failed to open stream: Permission denied
- 看回 laravel 文档 安装,需要给
storage
、bootstrap/cache
目录写入权限,于是调整这两个目录的权限:sudo chmod -R 777 storage/ bootstrap/cache
。然而,这个操作并不生效。 - 搜索一番,问题应该出在本地及虚拟机共享文件夹,但惭愧的是,我没有找到解决方法。后来,我将共享文件的类型改为
nfs
,暂时解决了这个问题:- 再次修改 Vagrantfile ,把之前修改的
config.vm.synced_folder "/Users/dayscene/code", "/home/vagrant/code"
,增加一个 type :config.vm.synced_folder "/Users/dayscene/code", "/home/vagrant/code", type: "nfs"
。取消这行的注释,增加私有网络设置:config.vm.network "private_network", ip: "192.168.33.10"
- 再重启虚拟机:
vagrant reload --provision
- 此时,已经可以修改相应目录的权限。在浏览器也可以看到 laravel 默认页面。
- 再次修改 Vagrantfile ,把之前修改的
- 看回 laravel 文档 安装,需要给
3. 结语
- 使用 vagrant 最好的一点是,你发现哪个环节出错了,可以暴力 destroy 这个 box,然后重头再来。
- 上述关于修改目录权限的问题,特此向各位请教,还望不吝指教。
- (待续)