September 20, 2011
Phusion Passenger com várias versões de ruby

Fala galera! Depois de um tempo sumido, estou voltando a escrever! Vamos lá então que já estou atrasado!

Recentemente precisei configurar meu servidor de modo que rodasse o passenger com várias versões do ruby. Achei um post muito bacana sobre o assunto, foi nele que me baseei para conseguir colocar tudo para funcionar e nele que me basearei para escrever esse post aqui também.

Irei utilizar nginx neste post, mas caso você queira usar o apache, visite o post original abaixo.

http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/

Estratégia, em grego strateegia, em latim strategi, em francês stratégie..

Nossa estratégia será a seguinte:

Com sudo

Instalar o rvm:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Configurar o /etc/profile, adicionando ao final:

if [ -s "$HOME/.rvm/scripts/rvm" ] ; then
  . "$HOME/.rvm/scripts/rvm"
elif [ -s "/usr/local/rvm/scripts/rvm" ] ; then
  . "/usr/local/rvm/scripts/rvm"
fi

Esse grupo será criado para que o mesmo tenha permissão na pasta do rvm:

addgroup rvm

Aqui adicionaremos os usuários(projetos) que utilizaram o rvm:

usermod -aG rvm projeto1

Com as permissões abaixo, qualquer usuário que estiver no grupo rvm poderá utilizar normalmente o rvm.

chown -R root:rvm /usr/local/rvm
chmod -R g+w /usr/local/rvm

Vamos escolher versão do ruby que será mais utilizada, como exemplo usarei a 1.8.7. Então, vamos a instalação:

rvm install 1.8.7

Precisamos instalar e configurar o passenger com nginx agora:

gem install passenger --pre
passenger-install-nginx-module

Vamos editar o arquivo /opt/nginx/conf/nginx.conf para configurar nossas aplicações:

Note que podemos ter vários aplicativos rodando sobre o ruby 1.8.7. Não esqueça de adicionar cada projeto ao grupo rvm.

server {
 listen 80;
 server_name projeto1.com.br www.projeto1.com.br;
 root /home/projeto1/current;
 passenger_enabled on;
}
server {
 listen 80;
 server_name projeto2.com.br www.projeto2.com.br;
 root /home/projeto2/current;
 passenger_enabled on;
}

Agora vamos instalar o ruby 1.9.2:

rvm install 1.9.2

Mais uma vez iremos editar o arquivo /opt/nginx/conf/nginx.conf para adicionar nossas aplicações rodando em ruby 1.9.2:

Repare que aqui usaremos um proxy reverso, direcionando nossa aplicação da porta 80 para uma instancia do passenger aberta em modo standalone na porta 3000 e a outra para a 3001.

server {
 listen 80;
 server_name projeto3.com.br www.projeto3.com.br;
 root /home/projeto3/current;
 location / {
  proxy_pass http://127.0.0.1:3000;
  proxy_set_header Host $host;
 }
}
server {
 listen 80;
 server_name projeto4.com.br www.projeto4.com.br;
 root /home/projeto4/current;
 location / {
  proxy_pass http://127.0.0.1:3001;
  proxy_set_header Host $host;
 }
}

Sem sudo

Precisamos agora iniciar o passenger em modo standalone em nossos projetos. Você pode criar uma gemset para cada projeto:

Repare no parâmetro -d no momento do start no passenger, ele servirá para deixar o passenger rodando em background. Caso precise parar o processo, basta executar passenger stop -p 3000.

cd /home/projeto3/current
rvm use 1.9.2@projeto3 --create
gem install passenger --pre
passenger start -a 127.0.0.1 -p 3000 -d

Lembre-se startar o passenger em portas diferentes em cada projeto que usar o proxy reverso.

Finalizando

Se você leu o post citado no início, verá que o autor menciona em utilizarmos Unix domain sockets ao invés de TCP socket para ganho de performance. Fiz um teste usando o Unix domain sockets e tive um problema de encode na minha aplicação. Como não quis perder tempo, voltei a usar o TCP socket mesmo e tudo voltou ao normal!

Bem, por hoje é só pessoal, espero que tenham gostado do post!

Abraços!


  1. diegoalvareznogueira posted this
Blog comments powered by Disqus