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.

Para Apache teremos algo como:
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
Para o Nginx teremos algo como:
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.

Lembre-se que você deve fazer isso estando na versão do Ruby que deseja executar apenas em algumas aplicações. Use 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 e cap 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.
Written on September 23, 2013

Share: