Múltiplas Versões do Ruby com Passenger 4
Quando instalamos o Passenger em um servidor, primeiro instalamos a gema dele:
gem install passenger
Depois instalamos o servidor web (com o Passenger embutido):
Apache:
passenger-install-apache2-module
Nginx:
rvmsudo passenger-install-nginx-module
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.
LoadModule passenger_module /home/username/.rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.14/buildout/apache2/mod_passenger.so
PassengerRoot /home/username/.rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.14
PassengerRuby /home/username/.rvm/wrappers/ruby-2.0.0-p247/ruby
passenger_root /home/username/.rvm/gems/ruby-2.0.0-p247/gems/passenger-4.0.5;
passenger_ruby /home/username/.rvm/wrappers/ruby-2.0.0-p247/ruby;
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:
/home/ubuntu/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- phusion_passenger/constants (LoadError)
from /home/ubuntu/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /usr/sbin/passenger-config:27:in
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:
<VirtualHost *:80>
ServerName meusite.com
DocumentRoot /home/username/www/meusite/current/public/
<Directory /home/username/www/meusite/current/public/>
Options -MultiViews
AllowOverride all
PassengerRuby /home/username/.rvm/wrappers/ruby-1.9.3-p392/ruby
</Directory>
</VirtualHost>
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.