我发布这个作为我所遇到的资源的汇编,因为那里的指南不适合Vagrant提供的虚拟化以及由此产生的错误。
因此,我将参考很多材料,因为其他人已经解释并格式化了它比我更好,同时只更换了所述材料中的步骤,使其在Vagrant下工作。
在实际部署环境中,链接的资源已足够(此帖仅适用于Vagrant):
答案 0 :(得分:2)
您可以使用Homebrew或各自网站的安装人员here和here。
通过Homebrew:
brew cask install vagrant
brew cask install virtualbox
Vagrant框是由Vagrant克隆到虚拟机中的图像,我们将使用Ubuntu repository中的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
。/home
路径移除APP_ROOT
,同时只留下/$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;
。root
配置行,请确保将deploy
替换为vagrant
,生成:root /home/vagrant/APPNAME/public;
。 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不能开始!
此时,如果您在Vagrantfile中设置了端口转发设置,则应该能够在http://localhost:8080/tasks
上访问您的应用程序。实际上,您永远不会使用端口访问您的应用程序,因此我们需要移植并修复此问题。如前所述,Vagrant无法转发到1024以下的端口,因为它们在OS X上享有特权。在sudo
下运行Vagrant也无济于事,因为此特权未传递给VBoxManage进程Vagrant生成。
结果,我们将主机8080上的端口8080转发到虚拟机(客户端)的端口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端口从主机转发给访客。
现在我们需要将主机端口80和443映射到主机的端口8080和8443,以便流浪者可以接收它!我们将使用名为vagrant-triggers
的漂亮插件,因为我们并不希望这种情况一直发生。我们只在运行Vagrant实例时才需要它。使用vagrant-triggers
将允许我们根据命令Vagrant执行命令在主机上执行命令。
vagrant-triggers
相同的目录中执行以下命令来安装Vagrantfile
:vagrant plugin install vagrant-triggers
。Vagrantfile
块内的configure
,随时随地。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