Múltiplas Versões do Ruby com Passenger 4
Quando instalamos o Passenger em um servidor, primeiro instalamos a gema dele:
Depois instalamos o servidor web (com o Passenger embutido):
Apache:
Nginx:
Após a instalação, o Passenger irá informar as configurações que definem a versão do Ruby a ser utilizada em todas aplicações por padrão.
Agora imagina que temos duas versões do Ruby instaladas em nosso servidor (rvm list
):
Por padrão, o servidor web irá executar as aplicações definidas nos vhosts com a versão do Ruby definida na variável PassengerRuby
do Apache e passenger_ruby
do Nginx (em meu exemplo ruby-2.0.0-p247).
Como fazer para rodar múltiplas versões do Ruby então?
Graças a versão 4 do Passenger, agora podemos escolher versão do Ruby a ser executada por aplicação, basta setar a diretiva PassengerRuby
para Apache e passenger_ruby
para Nginx com o caminho do binário da versão desejada.
O Passenger possui um helper para que usuários do RVM possam ver o caminho do binário da versão atual do Ruby, basta rodar passenger-config --ruby-command
e passenger-config --root
pra saber o caminho do Passenger.
rvm use versao-do-ruby
para trocar de versão do Ruby.
Caso você obtenha o erro abaixo, será necessário instalar o programa passenger-config
, faça isso usando sudo apt-get install libapache2-mod-passenger
.
Ao executar o comando e obter um erro como esse:
Você deverá instalar a gema do Passenger na versão atual do Ruby, faça isso através de gem install passenger
(se você está usando Capistrano e não está fazendo deploys como super usuário, provavelmente precisará instalar a gema como sudoer primeiro e depois no usuário do deploy).
Ao final, teremos algo como isso em nosso arquivo de vhosts do Apache para uma aplicação Rails:
Apenas a aplicação com a diretiva PassengerRuby
usará outra versão do Ruby, nesse caso, a 1.9.3 p392.
Possíveis erros e soluções durante o processo
-
Erros com gemas não encontradas (obtendo erro 500 ao acessar aplicação): acesse a pasta do projeto com o usuário do Capistrano que faz deploy e rode um
bundle install
para instalar as gemas (sim, o Capistrano armazena as gemas na pasta "shared", mas isso resolveu). -
Capistrano rolling back ao tentar fazer um deploy: no servidor, exclua a pasta do projeto, depois rode um
cap env deploy:setup
para preparar o ambiente,cap env deploy:check
para verificar se está tudo ok ecap env deploy
para fazer novo deploy. - Mensagem "module passenger_module is already loaded, skipping" ao reiniciar o Apache: isso pode acontecer pois o Apache já está carregando os módulos do Passenger e você está tentando carregar novamente. Basta colocar as diretivas de path do Passenger e Ruby nos arquivos "passenger.load" e "passenger.conf" respectivamente dentro da pasta "mods-enabled", veja mais aqui.