[英]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):
您可以在这里和这里使用Homebrew或各自网站的安装程序。
通过Homebrew:
brew cask install vagrant
brew cask install virtualbox
Vagrant框是由Vagrant克隆到虚拟机中的图像,我们将使用Ubuntu存储库中的 Ubuntu 14.04来创建我们的虚拟机。
vagrant box add ubuntu/trusty64
Vagrants虚拟化的默认提供商是VirtualBox,因此我们不必在该方面配置任何内容。 我们所需要做的就是在我们的项目根文件夹中或旁边创建一个Vagrantfile
。
Vagrantfile
将作为虚拟机内/vagrant
文件夹的“位置标记”,因为我们的虚拟机中可以访问包含在与Vagrantfile
相同的文件夹中的任何内容。 确保你cd
到你希望共享目录的起始位置,然后我们需要做的就是使用我们的Ubuntu 14.04映像运行vagrant init
。
vagrant init ubuntu/trusty64
当当! 我们现在准备在我们的虚拟机中启动和玩游戏了。
要启动然后ssh到我们的虚拟机,我们必须在与Vagrantfile
相同的目录中运行:
vagrant up
vagrant ssh
现在我们已经准备好安装Ruby,Postgres,Rails,Unicorn和Nginx。
Install rbenv
下,请确保将文件保留为.bash_profile
。 更新apt-get,然后安装Postgres及其依赖项:
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib libpq-dev
cd /vagrant
。 创建Unicorn Init脚本:复制提供的配置,但是:
USER
永远是vagrant
。 APP_ROOT
路径中删除/home
,只留下/$USER/$APP_NAME
。 最后,鉴于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"
unicorn.sock
的路径,因此修改了server unix:/home/tmp/sockets/unicorn.sock fail_timeout=0;
的路径server unix:/home/tmp/sockets/unicorn.sock fail_timeout=0;
。 root
配置行中,确保使用vagrant
替换deploy
for,生成: root /home/vagrant/APPNAME/public;
。 proxy_pass
设置为http://localhost:3000;
。 由于我们将unicorn.sock
文件位置更改为/ tmp /文件夹内的文件夹(每次我们halt
我们的机器时都会删除),我们将不得不通过vagrant设置一些shell配置以确保命令mkdir /tmp/sockets
每次我们为此项目发出vagrant up
都会运行mkdir /tmp/sockets
。
只需在您Vagrantfile
任何地方的Vagrantfile
的configure
块下添加以下内容:
# 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将无法启动!
此时,您应该能够在http://localhost:8080/tasks
上访问您的应用程序,前提是您已在Vagrantfile中设置了端口转发设置。 实际上,你永远不会通过端口访问你的应用程序,所以我们需要移植并解决这个问题。 如前所述,Vagrant无法转发到1024以下的端口,因为它们在OS X上享有特权。在sudo
下运行Vagrant也无济于事,因为此特权未传递给VBoxManage进程Vagrant产生。
因此,我们将主机8080上的端口8080转发到虚拟机(guest)的端口80.同样,我们将主机80的端口80上的所有流量转发到8080端口,也在我们的主机上。 这样我们可以:
localhost
... localhost:8080
... localhost:80
。 最后,我们可以作为localhost
访问我们的应用程序!
主机是您的物理机,客户是您的虚拟机。 我们将把主机上的8080端口转发到客户端80。
Vagrantfile
,找到包含config.vm.network
的行。 config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443
您现在已将端口转发默认的http和https端口从主机转发到guest虚拟机。
现在我们需要将主机的端口80和443映射到主机的端口8080和8443,以便流浪者可以接收它! 我们将使用一个名为vagrant-triggers
的漂亮插件,因为我们不希望这种情况一直发生。 我们只在运行Vagrant实例时才需要它。 使用vagrant-triggers
将允许我们根据Vagrant被告知执行的命令在主机上执行命令。
vagrant-triggers
通过在相同的目录中执行以下命令Vagrantfile
: vagrant plugin install vagrant-triggers
。 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.