Isso foi escrito com marcação com sabor Github .. Isso bagunça um pouco aqui. Veja uma versão melhor: https://gist.github.com/joshteng/9901155
Baixe e instale o Vagrant http://www.vagrantup.com/ e VirtualBox https://www.virtualbox.org/ ou VMware antes de começar
Configurar o Vagrant
* este guia pressupõe o uso do Mac OS X Mountain Lion na máquina local e Ubuntu 12.04 LTS x64 na caixa do Vagrant. É compatível com muitas outras distros, mas não foi testado.
Etapa 1: fazer e executar a caixa
vagrant init
vagrant box add <path to box directory or name according to https://vagrantcloud.com/>
vagrant up
vagrant ssh
Etapa 2: encaminhar portas
Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 3000, host: 3000
Configurar ambiente
Você pode optar por usar ferramentas de gerenciamento / provisionamento de configuração como Chef / Puppet para as etapas a seguir para configurar seu ambiente. Mas se você quiser entender como isso é feito, eu o encorajo a fazer manualmente.
Etapa 3: instale as bibliotecas de sistema necessárias e o Postgresql
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libcurl4-openssl-dev python-software-properties libpq-dev postgresql postgresql-contrib
Etapa 4: instale o ruby
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
rbenv install 2.1.0
rbenv global 2.1.0
rbenv rehash
Etapa 5: instalar o Bundler
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
gem install bundler
rbenv rehash
Etapa 6: instalar o pipeline de recursos do Node.js for Rails
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
Etapa 7: Instale o Nginx no servidor
sudo apt-get install nginx
Etapa 8: configurar a função de ‘vagrant’ do postgres
sudo su - postgres
createuser --pwprompt #create a role called vagrant.. just leave a blank password if you're using Vagrant locally for development and make it a superuser when prompted!
psql
ALTER USER Postgres WITH PASSWORD 'vagrant'; --run this in psql..I actually don't know why I had to do this.
q --exit psql
exit
Configurar aplicativo
Etapa 9: instalação do pacote
cd /vagrant #this is where your rails app should be by default if you changed it, just go to the right path on your VM
bundle install
rbenv rehash
Etapa 10: criar e migrar banco de dados
bundle exec rake db:create
bundle exec rake db:migrate
- se houver problemas de codificação: https://gist.github.com/joshteng/9895494
- se você está enfrentando erros crípticos (por exemplo, classe ELF errada: ELFCLASS32) com bcrypt, pg etc + gems, apenas remova-o e execute novamente
/vendor/bundle
bundle install
- se o acima ainda não resolver seu problema, remova todas as joias de seu aplicativo rails fazendo e execute novamente. (infelizmente, isso leva muito tempo, dependendo da sua conexão com a Internet e do rubygems.org)
rm -rf /vagrant/vendor/bundle
bundle install
- se estiver recebendo um erro , você não executou a etapa 8 corretamente
FATAL: role "vagrant" does not exist
Etapa 11: Teste
bundle exec rails s
sudo service nginx start
http: // localhost: 3000 deve funcionar agora
http: // localhost: 8080 deve mostrar a página de boas-vindas do nginx
Etapa 12: configurar o unicórnio
Gemfile
gem 'unicorn'
Concha
bundle install
touch <app_root>/config/unicorn.rb
unicorn.rb
root = "/vagrant"
app_name = "YOUR_APP_NAME"
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"
listen "/tmp/unicorn.#{app_name}.sock"
worker_processes 4
timeout 40
preload_app true
# Force unicorn to look at the Gemfile in the current_path
# otherwise once we've first started a master process, it
# will always point to the first one it started.
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile"
end
before_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
# Quit the old unicorn process
old_pid = "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
puts "We've got an old pid and server pid is not the old pid"
begin
Process.kill("QUIT", File.read(old_pid).to_i)
puts "killing master process (good thing tm)"
rescue Errno::ENOENT, Errno::ESRCH
puts "unicorn master already killed"
end
end
end
after_fork do |server, worker|
port = 5000 + worker.nr
child_pid = server.config[:pid].sub('.pid', ".#{port}.pid")
system("echo #{Process.pid} > #{child_pid}")
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
- Unicórnio inicial:
bundle exec unicorn -c /vagrant/config/unicorn.rb -p 3000
Configure o Nginx
Etapa 13: configurar nginx.conf no diretório de configuração do rails
touch <app_root>/config/nginx.conf
nginx.conf
upstream unicorn {
server unix:/tmp/unicorn.YOUR_APP_NAME.sock fail_timeout=0;
}
server {
listen 80 default deferred;
# server_name example.com;
root /vagrant/public;
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
Etapa 14: Symlink nginx.conf
sudo ln -s /vagrant/config/nginx.conf /etc/nginx/sites-enabled/<your_app_name>
Etapa 15: Excluir o site padrão Nginx
sudo rm /etc/nginx/sites-enabled/default
Etapa 16: reinicie o Nginx
sudo service nginx restart
- Comece unicórnio:
bundle exec unicorn -c /vagrant/config/unicorn.rb
- O site deve funcionar em http: // localhost: 8080 agora (certifique-se de que o unicórnio ainda esteja em execução)
Faça do Unicorn um serviço para sua conveniência
Etapa 17: Configurar unicorn_init.sh
touch <app_root>/config/unicorn_init.sh
bundle install --binstubs #creates an executable in the bin directory for our unicorn_init shell script
unicorn_init.sh
#!/bin/sh
set -e
# Example init script, this can be used with nginx, too,
# since nginx and unicorn accept the same signals
# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/vagrant
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD="$APP_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
action="$1"
set -u
old_pid="$PID.oldbin"
cd $APP_ROOT || exit 1
sig () {
test -s "$PID" && kill -$1 `cat $PID`
}
oldsig () {
test -s $old_pid && kill -$1 `cat $old_pid`
}
case $action in
start)
sig 0 && echo >&2 "Already running" && exit 0
echo "ATTEMPTING TO START UNICORN"
ruby -v
$CMD
# sudo su -c "ruby -v" - postgres
# sudo su -c "$CMD" - vagrant
;;
stop)
sig QUIT && exit 0
echo >&2 "Not running"
;;
force-stop)
sig TERM && exit 0
echo >&2 "Not running"
;;
restart|reload)
sig HUP && echo reloaded OK && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
$CMD
;;
upgrade)
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
then
n=$TIMEOUT
while test -s $old_pid && test $n -ge 0
do
printf '.' && sleep 1 && n=$(( $n - 1 ))
done
echo
if test $n -lt 0 && test -s $old_pid
then
echo >&2 "$old_pid still exists after $TIMEOUT seconds"
exit 1
fi
exit 0
fi
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
$CMD
;;
reopen-logs)
sig USR1
;;
*)
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
exit 1
;;
esac
Tornar executável unicorn_init.sh
chmod +x config/unicorn_init.sh
Etapa 18: Symlink unicorn_init.sh
sudo ln -s <app_root>/config/unicorn_init.sh /etc/init.d/unicorn_your_app_name
Etapa 19: Inicie o Unicorn
#shut down all instances of Unicorn (optional)
ps aux | grep unicorn #find unicorn processes
kill -9 <pid> #shut it down
#start up unicorn as a linux process
sudo service unicorn_your_app_name start #it's important to know which version of ruby will be used when running as different users. if you're facing errors, see below.
Se você está recebendo este erro:
/opt/vagrant_ruby/lib/ruby/site_ruby/1.8/rubygems.rb:900:in "report_activate_error": Could not find RubyGem unicorn (>= 0) (Gem::LoadError)
Seu script de inicialização não está usando a versão correta do Ruby. Aqui estão algumas coisas que você pode tentar:
- Modifique o script de shell para executar seu comando como vagrant em vez de apenas
su -c "$CMD" - vagrant
$CMD
- Tente
sudo service unicorn_app_name start
eservice unicorn_app_name start
Para depurar com eficácia:
UM: Verifique a versão do Ruby que está sendo usada ao tentar inicializar o Unicorn através do seu script de shell de inicialização
“ `sh
este é apenas um trecho de código no arquivo unicorn_init
case $ action in
start)
sig 0 && echo> & 2 “Já executando” && exit 0
echo “TENTANDO INICIAR UNICORN”
ruby -v #verifique a versão do ruby que você está usando
$ CMD
# sudo su -c “ruby -v “- vagrant #check a versão do ruby que você está usando
# sudo su -c” $ CMD “- vagrant`
“
DOIS: Saída de log do Tail Unicorn para descobrir quais outros erros você pode tersh tail -f /vagrant/log/unicorn.log
Finalmente
se estiver executando o unicórnio como root
, você precisará adicionar root como uma função para o postgres (vá até a etapa 8, mas adicione root em vez de vagrant)
Voila! Deve funcionar agora!
MISC
Problemas de lentidão do VirtualBox no mac
- Acelerando o Vagrant: http://kubaf.wordpress.com/2013/01/12/vagrant-speed-up-on-mac-os-x/
- Adicione o seguinte no
ruby config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"] end
aviso de isenção de responsabilidade do Vagrantfile : Não consigo fazer com que nenhuma dessas soluções acelere minha VM. Se você conseguiu acelerar sua VM em um Mac com o VirtualBox, deixe algum comentário e nos ajude! Obrigado!
Nesse ínterim, você pode querer olhar para VMware em vez de VirtualBox