利用 vagrant 实现 laravel 多个开发环境 (Ubuntu 18.4、Ubuntu 16.4) (with Bug)

  • 开发 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 目录,其中文件与本地文件一致。

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;
  • 安装 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
    • 在 ubuntu18,直接安装:sudo apt-get install php-fpm php-mysql
    • 在两个系统查看 PHP 的安装版本:php -v ,都是 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 文档 安装,需要给 storagebootstrap/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 默认页面。

3. 结语

  • 使用 vagrant 最好的一点是,你发现哪个环节出错了,可以暴力 destroy 这个 box,然后重头再来。
  • 上述关于修改目录权限的问题,特此向各位请教,还望不吝指教。
  • (待续)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值