繁体   English   中英

HOW TO:使用VirtualBox安装Vagrant,在OS X 10.10+上运行Ruby on Rails 4,Postgres,Unicorn,Nginx和port forward

[英]HOW TO: Setup Vagrant with VirtualBox running Ruby on Rails 4, Postgres, Unicorn, Nginx, and port forward on OS X 10.10+

我发布这个作为我遇到的资源的汇编,因为那里的指南不满足Vagrant提供的虚拟化以及由此导致的错误。

因此,我将参考很多材料,因为其他人已经解释并格式化它比我更好,同时只更换所述材料中的步骤,使其在Vagrant下工作。

在实际部署环境中,链接的资源已足够(此帖仅适用于Vagrant):

第1步:安装Vagrant和VirtualBox

您可以在这里这里使用Homebrew或各自网站的安装程序。

通过Homebrew:

brew cask install vagrant
brew cask install virtualbox

第2步:设置Vagrant

2.2 - 首先我们添加一个Vagrant Box

Vagrant框是由Vagrant克隆到虚拟机中的图像,我们将使用Ubuntu存储库中的 Ubuntu 14.04来创建我们的虚拟机。

vagrant box add ubuntu/trusty64

2.3 - 其次我们初始化我们的Vagrantfile

Vagrants虚拟化的默认提供商是VirtualBox,因此我们不必在该方面配置任何内容。 我们所需要做的就是在我们的项目根文件夹中或旁边创建一个Vagrantfile

  • Vagrantfile将作为虚拟机内/vagrant文件夹的“位置标记”,因为我们的虚拟机中可以访问包含在与Vagrantfile相同的文件夹中的任何内容。

确保你cd到你希望共享目录的起始位置,然后我们需要做的就是使用我们的Ubuntu 14.04映像运行vagrant init

vagrant init ubuntu/trusty64

当当! 我们现在准备在我们的虚拟机中启动和玩游戏了。


第3步:引导和SSH进入我们的虚拟机

要启动然后ssh到我们的虚拟机,我们必须在与Vagrantfile相同的目录中运行:

vagrant up
vagrant ssh

现在我们已经准备好安装Ruby,Postgres,Rails,Unicorn和Nginx。


第4步:安装软件包并配置我们的虚拟机

4.1 - 按照DigitalOcean的指南安装Ruby和Ruby on Rails,直到你到达可选步骤, 这里

  • 注意:Install rbenv下,请确保将文件保留为.bash_profile

4.2 - 在Ubuntu 14.04上安装Postgresql。

更新apt-get,然后安装Postgres及其依赖项:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib libpq-dev

4.3 - 在此处使用Rails,Unicorn和Nginx关注部署设置的DigitalOcean指南。

  • 注意:请务必参考以下要更换的内容。
  • 在第一步之前确保您在共享目录中,这样您就可以从主机访问文件,例如使用Sublime Text。 要访问您的共享目录,请输入cd /vagrant
  • 配置Unicorn:复制提供的配置,但是“Unicorn无法将.sock文件存储在Virtual Box共享文件夹中,因此您需要做的是在源代码中修改socket [...]” 解决方案 感谢Dave Long。
  • 创建Unicorn Init脚本:复制提供的配置,但是:

    1. USER永远是vagrant
    2. 我们必须从APP_ROOT路径中删除/home ,只留下/$USER/$APP_NAME
    3. 最后,鉴于1024以下的端口在OS X上具有特权,我们将不得不强制我们的Rails应用程序在更高的位置上运行,所以:

      • 改变这一行: CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
      • 进入: CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D -l 0.0.0.0:3000"
  • 安装和配置Nginx:复制提供的配置,但是:
    1. 我们改变了unicorn.sock的路径,因此修改了server unix:/home/tmp/sockets/unicorn.sock fail_timeout=0;的路径server unix:/home/tmp/sockets/unicorn.sock fail_timeout=0;
    2. root配置行中,确保使用vagrant替换deploy for,生成: root /home/vagrant/APPNAME/public;
    3. 最后,Nginx可能无法正确找到Rails应用程序,所以我们要将proxy_pass设置为http://localhost:3000;

由于我们将unicorn.sock文件位置更改为/ tmp /文件夹内的文件夹(每次我们halt我们的机器时都会删除),我们将不得不通过vagrant设置一些shell配置以确保命令mkdir /tmp/sockets每次我们为此项目发出vagrant up都会运行mkdir /tmp/sockets

只需在您Vagrantfile任何地方的Vagrantfileconfigure块下添加以下内容:

# Create the /tmp/sockets folder we need every time on startup
  config.vm.provision "shell",
    inline: "mkdir /tmp/sockets"

现在不是vagrant up ,我们必须运行vagrant up --provision ,我们要开始我们的虚拟机,并在/ tmp /套接字文件夹会为我们创建的每个时间。 如果我们不做这个文件夹Unicorn将无法启动!


第5步:端口转发

此时,您应该能够在http://localhost:8080/tasks上访问您的应用程序,前提是您已在Vagrantfile中设置了端口转发设置。 实际上,你永远不会通过端口访问你的应用程序,所以我们需要移植并解决这个问题。 如前所述,Vagrant无法转发到1024以下的端口,因为它们在OS X上享有特权。在sudo下运行Vagrant也无济于事,因为此特权未传递给VBoxManage进​​程Vagrant产生。

因此,我们将主机8080上的端口8080转发到虚拟机(guest)的端口80.同样,我们将主机80的端口80上的所有流量转发到8080端口,也在我们的主机上。 这样我们可以:

  1. 访问我们主机上的localhost ...
  2. 哪个将转发到我们的主机上的localhost:8080 ...
  3. 这将在我们的访客(虚拟)机器上转发到localhost:80

最后,我们可以作为localhost访问我们的应用程序!

5.1 - 端口转发主机到来宾

主机是您的物理机,客户是您的虚拟机。 我们将把主机上的8080端口转发到客户端80。

  1. 打开你的Vagrantfile ,找到包含config.vm.network的行。
  2. 取消注释该行并对其进行编辑,同时添加另一行,使其类似于:

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443

您现在已将端口转发默认的http和https端口从主机转发到guest虚拟机。

5.2 - 端口映射主机端口

现在我们需要将主机的端口80和443映射到主机的端口8080和8443,以便流浪者可以接收它! 我们将使用一个名为vagrant-triggers的漂亮插件,因为我们不希望这种情况一直发生。 我们只在运行Vagrant实例时才需要它。 使用vagrant-triggers将允许我们根据Vagrant被告知执行的命令在主机上执行命令。

  1. 安装vagrant-triggers通过在相同的目录中执行以下命令Vagrantfilevagrant plugin install vagrant-triggers
  2. 将以下配置粘贴到configure块内的Vagrantfile ,随时随地。

config.trigger.after [:provision, :up, :reload] do
  system('echo "
    rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080  
    rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443  
    " | sudo pfctl -ef - > /dev/null 2>&1; echo "==> Fowarding Ports: 80 -> 8080, 443 -> 8443"')  
end

config.trigger.after [:halt, :destroy] do
  system("sudo pfctl -ef /etc/pf.conf > /dev/null 2>&1; echo '==> Removing Port Forwarding'")
end

因此,运行vagrant up将设置端口映射,并且运行vagrant halt将删除它。

您现在可以从http://localhost/tasks访问您的应用程序。

我希望本指南能够帮助每个人。 我不得不经历一些麻烦,找出有关为什么这不能在Vagrant专门工作的信息。

非常感谢DigitalOcean和这个社区,其成员为本指南提供了内容,包括指向Yosemite和Unicorn套接字配置下的pfctl映射的链接。

如果您发现指南有任何问题,请给我发消息,以便我可以根据需要进行调查和修改!

快乐的编码,

tsujp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM