Rodando multiplas versões do Ruby com Phusion Passenger

Artigo traduzido do blog da Phusion: Phusion Passenger & running multiple Ruby versions

Uma das perguntas que mais temos recebido ultimamente é se é possível executar várias versões do Ruby com Phusion Passenger. Por exemplo, temos os aplicativos A e B rodando em Ruby 1.8.7, enquanto o aplicativo C está rodando em Ruby 1.9.2. Nas versões anteriores do Phusion Passenger havia maneiras de contornar isso, por exemplo, mixando com o Mongrels. A partir do Phusion Passenger 3 você pode rodar todos as versões usando o Passenger.

A configuração que atualmente recomendamos é combinar Passenger para o Apache ou Nginx, com Passenger Standalone. Primeiro é preciso identificar qual versão do Ruby que você mais usa, em seguida setar na instalação do Passenger para o Apache ou Nginx para usar essa versão. Todas as aplicações que utilizarão versões diferentes do Ruby diferentes podem ser servidos separadamente através Passenger Standalone e ligar para o servidor web principal através de uma configuração de proxy reverso.

Suponha que você tem esses quatro sites:

  • foo.com, rodando Ruby 1.8.7.
  • bar.com, rodando Ruby 1.8.7.
  • fries.com, rodando Ruby 1.9.1.
  • hamburgers.com, rodando 1.9.2.

E suponha que você usa o RVM para gerenciar suas versões do Ruby.

Configurando foo.com e bar.com (Ruby 1.8.7)

Nesse caso a versão do Ruby mais usada é a 1.8.7, então o Apache ou Nginx está configurado para ser o servidor desses sites.

rvm use 1.8.7
gem install passenger --pre
 
# Então um dos seguintes:
passenger-install-apache2-module
passenger-install-nginx-module
# Configuração parcial do Apache
PassengerRuby /home/usuario/.rvm/wrappers/ruby-1.8.7/ruby
 
    ServerName www.foo.com
    DocumentRoot /webapps/foo.com/public
 
    ServerName www.bar.com
    DocumentRoot /webapps/bar.com/public
# Configuração parcial do Nginx
passenger_ruby /home/usuario/.rvm/wrappers/ruby-1.8.7/ruby
 
server {
    listen 80;
    server_name www.foo.com;
    root /webapps/foo.com/public;
    passenger_enabled on;
}
 
server {
    listen 80;
    server_name www.bar.com;
    root /webapps/bar.com/public;
    passenger_enabled on;
}

Assim foo.com e bar.com estarão rodando no Passenger Apache/Nginxe com a versão 1.8.7 do Ruby.

Configurando fries.com (Ruby 1.9.1)

O próximo passo é configurar o app fries.com no Passenger Standalone usando o Ruby 1.9.1. Uma vez que a porta 80 já está sendo usado pelo Apache/Nginx o vamos configurar o Passenger Standalone usar uma porta diferente.

rvm use 1.9.1
gem install passenger --pre
cd /webapps/fries.com
passenger start -a 127.0.0.1 -p 3000 -d

Fries.com agora está rodando em segundo plano no localhost usando a porta 3000. Em seguida, conecte-o ao Apache ou Nginx através de um proxy reverso.

# Configuração parcial do Apache
 
    ServerName www.fries.com
    DocumentRoot /webapps/fries.com/public
    PassengerEnabled off
    ProxyPass / http://127.0.0.1:3000
    ProxyPassReverse / http://127.0.0.1:3000
# Configuração parcial do Nginx
server {
    listen 80;
    server_name www.fries.com;
    root /webapps/fries.com/public;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

Configurando hamburgers.com (Ruby 1.9.2)

O mesmo que fizemos com fries.com faremos com o hamburgers.com, como a porta 3000 já está ocupada usaremos a porta 3001

rvm use 1.9.2
gem install passenger --pre
cd /webapps/hamburgers.com
passenger start -a 127.0.0.1 -p 3001 -d
# Configuração parcial do Apache
 
    ServerName www.hamburgers.com
    DocumentRoot /webapps/hamburgers.com/public
    PassengerEnabled off
    ProxyPass / http://127.0.0.1:3001
    ProxyPassReverse / http://127.0.0.1:3001
# Configuração parcial do Nginx
server {
    listen 80;
    server_name www.hamburgers.com;
    root /webapps/hamburgers.com/public;
    location / {
        proxy_pass http://127.0.0.1:3001;
    }
}

Dica de desempenho

Phusion Passenger Standalone também suporta acesso de Unix domain sockets ao invés de um sockets TCP. Sockets Unix são significativamente mais rápido do que sockets TCP.

socket

Só Nginx suporta proxy reverso para unix domain sockets, o Apache ainda não suporta isto.

A fim de tornar Phusion Passenger Standalone acessivel ao unix domain sockets, basta executá-lo com Nginx 0.8.21 ou superior. Na verdade nós contribuímos suporte para unix domain sockets para Nginx especificamente para esta função!

Exemplo de como inicializar o Passenger Standalone:

passenger start --socket /tmp/fries.com.socket -d --nginx-version 0.8.50

O parâmetro :

--socket

diz para o Passenger para vincular o unix domain sockets passado.O parâmetro

--nginx-version

diz para o Passenger Standalone usar Nginx 0,8; 0,7 é o padrão.

Em seguida, você deve configurar um bloco upstream no Nginx com o unix domain sockets como única entrada. Então configure Nginx com o proxy reverso para criação de um bloco upstream

upsteam fries_upstream {
    server unix:/tmp/fries.com.socket;
}
 
server {
    listen 80;
    server_name www.fries.com;
    root /webapps/fries.com/public;
    location / {
        proxy_pass http://fries_upstream;
    }
}

Conclusão

Aqueles de vocês que estão familiarizados com Mongrel e Thin verão a semelhança. Phusion Passenger Standalone foi projetado para ser capaz de ser utilizada em um ambiente de proxy reverso como o demonstrado neste artigo. Contudo ao contrário do Mongrel e Thin você só precisa de uma única instância Phusion Passenger Standalone por aplicação web e portanto somente um único endereço de proxy. Passenger Standalone vai cuidar de iniciar e parar processos da aplicação para você e fará com que os processos sejam reiniciados quando travar.

Tags: , , ,

sexta-feira, setembro 24th, 2010 Ruby 1 Comentário

Encontro Guru-CE se aproximando

Finalmente depois de algum tempo da criação do grupo o Guru-CE vai fazer um encontro.

Devo dizer que já estava nos planos a algum tempo fazer isso, mas parece que faltava um incentivo. :p

Incentivo esse que veio como uma cobrança feita pelo Herminio Torres que nos mostrou que as outras comunidades estão se organizando e fazendo seus encontros.

Então agora estamos nos organizando para fazer esse encontro o mais breve possível. Assim que definirmos datas já posto aqui no blog e no email do grupo.

Abraços a todos

Tags: ,

segunda-feira, setembro 20th, 2010 Encontro Guru-CE Nenhum Comentário

Blog do Guru-CE

É com imenso prazer que anuncio a estreia do blog do Guru-CE.

Guru-CE é um grupo focado no apredizado, ensinamento e divulgação do uso da linguagem de programação Ruby através de discussões, apresentações e eventos.

O Guru-CE foi fundado em 9 de novembro de 2009. Iniciou com uma lista de discussão e agora conta com seu proprio site.

Espero que aqui se torne mais um local de busca de conhecimento para você.

Tags: , , , ,

quarta-feira, dezembro 2nd, 2009 Guru-CE Nenhum Comentário
 

Eventos

JavaCE Community Conference

Patrocínio


Apoio

Enquete

Qual a linguagem em que você trabalha?

Resultado Parcial

Loading ... Loading ...