Múltiplas Versões do Ruby com Passenger 4
Quando instalamos o Passenger em um servidor, primeiro instalamos a gema dele:
gem install passengerDepois instalamos o servidor web (com o Passenger embutido):
Apache:
passenger-install-apache2-moduleNginx:
rvmsudo passenger-install-nginx-moduleApó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/rubypassenger_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:inVocê 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 installpara 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:setuppara preparar o ambiente,cap env deploy:checkpara verificar se está tudo ok ecap env deploypara 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.

