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

时间:2015-09-19 13:59:34

标签: ruby-on-rails postgresql nginx vagrant unicorn

我发布这个作为我所遇到的资源的汇编,因为那里的指南不适合Vagrant提供的虚拟化以及由此产生的错误。

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

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

1 个答案:

答案 0 :(得分:2)

第1步:安装Vagrant和VirtualBox

您可以使用Homebrew或各自网站的安装人员herehere

通过Homebrew:

brew cask install vagrant
brew cask install virtualbox

第2步:设置Vagrant

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

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

vagrant box add ubuntu/trusty64

2.3 - 第二次我们初始化我们的Vagrantfile

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

  • Vagrantfile将作为&#39;位置标记&#39;对于我们虚拟机中的/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,直到达到可选步骤here
  • 注意: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,here关注部署设置的DigitalOcean指南。

  • 注意:请务必参考以下要更换的内容。
  • 在第一步之前确保您在共享目录中,这样您就可以从主机访问文件,例如使用Sublime Text。要访问您的共享目录,请输入cd /vagrant
  • 配置Unicorn:复制提供的配置,然而&#34; Unicorn无法将.sock文件存储在Virtual Box共享文件夹中,因此您必须拥有do是修改socket [...]&#34; solution at source。感谢Dave Long。
  • 创建Unicorn Init脚本:复制提供的配置,但是:

    1. USER始终为vagrant
    2. 我们必须从/home路径移除APP_ROOT,同时只留下/$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;
    2. 的路径
    3. root配置行,请确保将deploy替换为vagrant,生成:root /home/vagrant/APPNAME/public;
    4. 最后,Nginx可能无法正确找到Rails应用程序,因此我们要将proxy_pass设置为http://localhost:3000;

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

只需在configure Vagrantfile块下的任意位置添加以下内容即可:

# 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 / sockets文件夹。如果我们不让这个文件夹Unicorn不能开始!

步骤5:端口转发

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

结果,我们将主机8080上的端口8080转发到虚拟机(客户端)的端口80.同样,我们将主机80的端口80上的所有流量转发到端口8080,同样在我们的主机。这样我们就可以:

  1. 在我们的主机上访问localhost ...
  2. 哪个会转发到我们主机上的localhost:8080 ...
  3. 将在我们的访客(虚拟)计算机上转发至localhost:80
  4. 最后,我们可以localhost访问我们的应用程序!

    5.1 - 端口转发主机到访客

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

    1. 打开Vagrantfile,找到包含config.vm.network的行。
    2. 取消注释该行并对其进行编辑,同时添加另一行,使其类似于:
    3. config.vm.network "forwarded_port", guest: 80, host: 8080
      config.vm.network "forwarded_port", guest: 443, host: 8443
      

      您现在已将端口转发默认的http和https端口从主机转发给访客。

      5.2 - 端口映射主机端口

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

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