使用Vagrant和Homestead进行多个网站和每个项目的安装

35

我已经使用XAMPP相当长一段时间了,发现Laravel非常喜欢,也想使用Homestead。我的问题是,我似乎无法运行多个站点。

我尝试了各种方法,但目前的主要问题是,一个项目可以正常工作,而所有其他项目在尝试访问其网页时都会超时。

这些是我使用Homestead的步骤

  1. 安装VirtualBox
  2. 安装Vagrant
  3. 使用vagrant box add laravel/homestead添加Homestead
  4. 克隆存储库git clone https://github.com/laravel/homestead.git Homestead
  5. 使用bash init.sh脚本在Homestead目录中创建Homestead.yaml文件
  6. 创建一个新项目laravel new projectA
  7. 要求Homesteadcomposer require laravel/homestead
  8. 生成Vagrantfilephp vendor/bin/homestead make
  9. 修改Homestead.yaml以具有以10结尾的IP
  10. 创建另一个项目laravel new projectB
  11. 要求Homesteadcomposer require laravel/homestead
  12. 生成Vagrantfilephp vendor/bin/homestead make
  13. 修改Homestead.yaml以具有以11结尾的IP
  14. 将这两个站点添加到hosts文件sudo nano /etc/hosts => xxx.xx.xx.10 projecta.app & xxx.xx.xx.11 projectb.app
  15. 从其中一个目录启动vagrantvagrant up

现在,我的问题是,只有一个项目可以访问。始终是我调用vagrant up的那个项目。所以如果我从Project A调用vagrant up,那么我可以访问http://projecta.app,而http://projectb.app则超时。同样也是另一种方式,遗憾的是。

这是我的vagrant global-status

id       name    provider   state   directory                           
------------------------------------------------------------------------
fc6fadb  default virtualbox running /Users/mknb/work/projectA

我原以为只需要从 projectB 目录再次运行vagrant up,但这当然行不通。

我不想使用全局的Homestead,因为Laravel说可以实现每个项目的安装,那么怎么做呢?需要更多信息吗?

我除了IP和域名 homestead.app => projecta.app以外,没有修改过Homestead.yaml

看起来在Homestead中进行全局安装是相当容易的,因为我只需在Homestead.yaml中添加更多站点,但正如我所说,我希望有一个每个项目的安装。有人能帮忙吗?

从Homestead目录开始启动vagrant当然行不通。


我对Homestead不是很熟悉,但我已经使用Vagrant运行了多个站点的ubuntu镜像。也许你应该在Homestead.yaml文件中添加vhost配置。 (示例在这里)。您如何尝试连接到Homestead,通过localhost:someforwardedport(也许他们转发到相同的端口?)还是直接通过本地hosts文件中的条目连接到它们的IP地址? (因此不在您的vagrant实例上) - Francesco de Guytenaere
我已经在站点中添加了条目,但是Nginx没有启用,所以我必须手动启用它。你能否提供一种方法,在仅添加yaml文件中的条目的情况下自动启用它? - hhsadiq
5个回答

46

通过使用Homestead,您为每个项目创建了一个虚拟机。因此,VirtualBox无法将主机机器对所有虚拟机的HTTP请求转发。您每次只能运行一台虚拟机(也就是一个项目)。

若要在Homestead中运行多个项目,请按照以下步骤操作:

  • 克隆Homestead:git clone https://github.com/laravel/homestead.git Homestead
  • Homestead文件夹内运行 bash init.sh

编辑~/.homestead/Homestead.yaml文件的folders属性,将两个项目的代码与虚拟机共享:

folders:
    - map: ~/pj1
      to: /path/to/project1
    - map: ~/pj2
      to: /path/to/project2

编辑~/.homestead/Homestead.yaml文件的sites属性,以使Nginx启用两个站点的域名:

sites:
    - map: project1.local
      to: /home/vagrant/pj1/public
    - map: project2.local
      to: /home/vagrant/pj2/public

编辑你的hosts文件,将这些域名转发到本地主机。

127.0.0.1 project1.local
127.0.0.1 project2.local
  • 在克隆了包含init.sh文件的Homestead代码所在的文件夹中运行vagrant up命令。

现在,您可以使用一个Homestead虚拟机运行任意数量的项目了。


嗨,jeyp,这就是我现在所做的。使用一个全局的Homestead安装来处理多个项目。无论如何,我还是点赞并接受了你的答案,感谢你的努力 :p - Musterknabe
我已经在站点中添加了条目,但是Nginx没有启用它,所以我必须手动启用它。 - hhsadiq
我该如何为每个网站设置不同的端口? - Junaid Qadir Shekhanzai
1
很抱歉,Homestead的当前版本不允许从配置文件中进行该配置。您需要通过SSH连接到虚拟机并更新Nginx配置。 - Hieu Le
1
手动更新hosts文件不再需要。Homestead现在兼容vagrant-hostsupdater插件。只需从Homestead目录运行vagrant plugin install vagrant-hostsupdater即可。 - Lucas Bonner
需要执行 "$ vagrant up --provision" 命令。 - Yevgeniy Afanasyev

13

尽管已经得到了帮助,但接受的答案中缺少一些重要步骤。我添加了这些必要的步骤。感谢@Hieu Le提供的答案。

假设您已按照Laravel文档的说明正确安装了您的第一个站点。 现在您有另一个想要转移到vagrant上的laravel站点。请按照以下步骤操作。

  1. cd进入您想要添加的新Laravel项目的目录。 我假设您已经将所有Laravel文件放在其中,并且它是使用MAMP或任何非vagrant解决方案工作的。
  2. 运行vagrant init laravel/homestead。此命令将在此新项目中添加必要的VagrantFile
  3. 打开您的第一个原始项目文件的目录,并在编辑器中打开其Homestead.yaml文件。
  4. 现在按照@Hieu Le在接受的答案中定义的步骤修改.yaml文件:

    folders:
         - map: ~/pj1
           to: /path/to/project1
         - map: ~/pj2
           to: /path/to/project2
    
    sites:
        - map: project1.local
          to: /home/vagrant/pj1/public
        - map: project2.local
          to: /home/vagrant/pj2/public
    

    编辑您的hosts文件,将这些域名转发到本地主机

    127.0.0.1 project1.local
    127.0.0.1 project2.local
    
  5. 在终端中使用cd进入您的第一个原始项目目录。
  6. 运行命令vagrant reload --provision。这将重新加载vagrant机器,以便我们在.yaml文件中所做的更改生效。您原始项目的数据库将保持不变。
  7. 运行vagrant ssh
  8. 运行ls并确保您可以看到新项目的文件夹。如果有,说明您已经正确配置了新网站。
  9. 添加http://后,访问新网站的URL,并完成操作。

数字2是不必要和无关紧要的步骤。在全局Homestead设置中,您只需要homestead目录中的一个Vagrant文件。 - LetTheWritersWrite

1

就像这里所说的那样,你可以将Homestead直接安装到你的项目中,在每个项目的根目录下使用composer require laravel/homestead --dev进行要求。现在,通过make命令,你可以在项目的根目录中生成VagrantfileHomestead.yaml文件。

  • Mac/Linux:

    php vendor/bin/homestead make
    
  • Windows:

    vendor\bin\homestead make
    
在每个项目的根目录中,您将有一个需要编辑的Homestead.yaml文件:
  • Project-A

    ip: "192.168.10.10"
    ...
    folders:
        - map: "~/Code/projecta"
          to: "/home/vagrant/projecta"
    sites:
        - map: project.a
          to: "/home/vagrant/projecta/public"
    
  • Project-B

    ip: "192.168.10.10"
    ...
    folders:
        - map: "~/Code/projectb"
          to: "/home/vagrant/projectb"
    sites:
        - map: project.b
          to: "/home/vagrant/projectb/public"
    
将此添加到 /etc/hosts
    192.168.10.10 project.a
    192.168.10.10 project.b

然后你需要进入每个项目的根目录并执行vagrant up命令。 现在,如果你从每个项目中执行vagrant ssh命令,你将在虚拟机环境中拥有该项目。


1
好的,但这是否允许同时运行两个虚拟机? - Maxime Freschard

0

有一个快捷命令来代理您想要添加的站点...

而无需搞乱您的Homestead.yaml文件并重新提供您的vagrant box...

这适用于全局和每个项目的安装

只需确保如果您正在添加另一个项目...

您将其添加到共享文件夹中 在您的Homestead.yaml中声明

假设您的共享文件夹是 C:/Users/MYACCOUNT/Codes

在该文件夹中添加另一个项目 laravel new homestead.app

然后

假设您已经通过ssh连接到Homestead 输入 a.) 如果您使用nginx

serve homestead.app /home/Vagrant/Code/homestead/public

b.) 如果您使用hhvm serve-hhvm homestead.app /home/Vagrant/Code/homestead/public 只需更改域名和项目公共文件夹的路径即可

然后以管理员身份编辑etc/hosts文件

不管您在Homestead.yaml中定义了什么IP地址

通常默认为192.168.10.10

使用它代替127.0.0.1

为什么?因为如果你使用127.0.0.1,你的url会像这样 homestead.app:8000

如果你在Homestead.yaml中使用IP地址

192.168.10.10 homestead.app

你就可以访问你的网站而不需要端口8000, 只需使用homestead.app

这个解决方案比Provision好得多...而且更快...

这就是我所做的。


0

步骤1:首先,在homestead.yaml文件中映射您的其他项目和数据库输入图像描述

步骤2:创建您在现有工作台连接中提到的数据库输入图像描述

步骤3:在您的项目.env文件中提到该数据库输入图像描述

步骤4:在drivers/etc/hosts文件中添加另一个路径,然后运行homestead reload --provision。您的问题已解决。 :)输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接