[Update: Hoje em dia, o método preferido para deploy Rails + Apache é usando o Phusion Passenger, também conhecido como mod_rails. Para aprender como fazer um deploy com o mod_rails, leia este excelente artigo do Nando Vieira. :)]

Como eu havia dito, não achei artigos em português explicando como fazer o deploy de aplicações Rails usando mod_proxy_balancer e mongrel_cluster, por isso resolvi escrever um.

Os comandos a seguir foram testados em um Ubuntu 7.04 Server Edition, mas devem servir para qualquer distro Debian-based.

Será necessário ter instalado os seguintes programas:

  • Apache 2.2.x
  • mod_proxy_balancer
  • mongrel
  • mongrel_cluster
  • Ruby
  • Rails

Preparando o terreno

Instalando o compilador GCC e as ferramentas de desenvolvimento

sudo apt-get install build-essential

E agora o Ruby

sudo apt-get install ruby ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8

Apache e seus módulos

Instalando Apache

sudo apt-get install apache2

Configurando os módulos necessários

sudo a2enmod proxy_balancer
sudo a2enmod proxy
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo a2enmod proxy_ftp
sudo a2enmod proxy_http
sudo a2enmod rewrite

Reiniciando o Apache para que os módulos sejam habilitados

 

 

 

sudo /etc/init.d/apache2 force-reload

 

 

 

 

 

MySQL

Primeiramente, instale o MySQL

sudo apt-get install mysql-server

E agora, instale os bindings do MySQL para o Ruby

sudo apt-get install libmysql-ruby1.8

RubyGems e Rails

Vamos baixar a última versão do RubyGems e instalar

wget http://rubyforge.org/frs/download.php/20585/rubygems-0.9.3.tgz
tar xvzf rubygems-0.9.3.tgz
cd rubygems-0.9.3
sudo ruby setup.rb

 

Agora, o Rails

sudo gem install rails -y

Mongrel e mongrel_cluster

Ao ser perguntado por qual versão instalar, escolha a versão mais nova, que não seja a mswin32

sudo gem install mongrel mongrel_cluster -y

Criando uma nova aplicação Rails e configurando o cluster

Vamos criar uma aplicação Rails para teste:

rails teste
cd teste

E agora, vamos configurar o cluster mongrel

mongrel_rails cluster::configure -e production -p 8000 -a 127.0.0.1 -N 3 -c /sua/app/rails/teste/

Esta linha escreverá um arquivo chamado mongrel_cluster.yml dentro da pasta config, configurando nosso cluster para rodar em modo de produção (-e production), começando na porta 8000 (-p 8000), no endereço 127.0.0.1 (-a 127.0.0.1) com 3 instâncias do mongrel (-N 3). Dessa maneira, nossas instâncias só estarão disponíveis para ser acessadas através da máquina local, não é necessário expor o mongrel para toda a internet, já que é apenas o Apache rodando na máquina local que deverá ter acesso à eles.

Agora, vamos colocar nosso mongrel como um serviço que iniciará junto com nosso sistema. Primeiro, vamos copiar o arquivo de inicialização que a gem do mongrel_cluster disponibiliza pra gente

sudo ln -s /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-0.2.1/resources/mongrel_cluster /etc/init.d/
sudo chmod +x /etc/init.d/mongrel_cluster

Agora, vamos adicionar nosso script como um serviço do sistema

sudo /usr/sbin/update-rc.d mongrel_cluster defaults

O script de inicialização, procura por todos .yml dentre de: /etc/mongrel_cluster/, então, vamos criar este diretório e linkar nosso arquivo de configuração para lá

sudo mkdir -p /etc/mongrel_cluster
sudo ln -s /sua/app/rails/teste/config/mongrel_cluster.yml /etc/mongrel_cluster/teste.yml

Configurando o Apache

Vamos criar um novo VirtualHost no apache

touch /etc/apache2/sites-available/rails
sudo a2ensite rails

Use esta configuração para o arquivo que o apache acabou de criar em: /etc/apache2/sites-enabled/rails:

<VirtualHost *>
  ServerName exemplorails.com.br
  ErrorLog /sua/app/rails/teste/log/errors.log
  CustomLog /sua/app/rails/teste/log/apache.log combined
 
  <Directory "/sua/app/rails/teste/public/">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
 
  RewriteEngine On
 
  # Check for maintenance file and redirect all requests
  #  ( this is for use with Capistrano's disable_web task )
  RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
  RewriteCond %{SCRIPT_FILENAME} !maintenance.html
  RewriteRule ^.*$ /system/maintenance.html [L]
 
  # Rewrite index to check for static
  RewriteRule ^/$ /index.html [QSA]
 
  # Rewrite to check for Rails cached page
  RewriteRule ^([^.]+)$ $1.html [QSA]
 
  # Redirect all non-static requests to cluster
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]
 
  # Deflate
  AddOutputFilterByType DEFLATE text/html text/plain text/css
  # ... text/xml application/xml application/xhtml+xml text/javascript
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4.0[678] no-gzip
  BrowserMatch bMSIE !no-gzip !gzip-only-text/html
 
  <Proxy *>
    Order allow,deny
    Allow from all
  </Proxy>
 
  <Proxy balancer://mongrel_cluster>
    BalancerMember http://127.0.0.1:8000
    BalancerMember http://127.0.0.1:8001
    BalancerMember http://127.0.0.1:8002
  </Proxy>
 
</VirtualHost>

Finalização

Agora vamos reiniciar o apache

sudo /etc/init.d/apache2 force-reload

E iniciar nosso cluster mongrel

sudo /etc/init.d/mongrel_cluster start

Já podemos acessar nosso domínio, que nossa aplicação Rails deverá funcionar. Caso não funcione, dê uma olhada nos logs do Apache e de sua aplicação Rails.

Fonte:
Apache 2.2, mod_proxy_balancer, & Mongrel on Ubuntu 6.06
Time For A Grown-Up Server: Rails, Mongrel, Apache, Capistrano and You

Tags: , , , , , , / Trackback URI: trackback

12 comentários em “Deploy Rails com: Apache + mod_proxy_balancer + mongrel”

  1. 13/05/07 às 7:21 pm #Eduardo Fiorezi

    Fala Arthur,

    Você criou uma ótima referência, eu ja estava sentindo a necessidade de procurar essa solução. Mto bom….

  2. 13/05/07 às 7:21 pm #Renato Elias

    Poxa, valeu mesmo, vou aplicar isso em um servidor aqui, se achar algo interessante, posto uma trackback para você.

    Obrigado mesmo.

  3. 13/05/07 às 7:21 pm #Marcus Moreira

    Muito legal Arthur, parabéns!

    Só uma dúvida: se eu quiser balancear a carga entre 3 servidores, o que muda na arquitetura dessa solução?

  4. 13/05/07 às 7:21 pm #ArthurGeek

    Marcus,

    O que muda, é o endereço do cluster na hora de configurar o Apache. mais especificamente as linhas BalanceMember.

    Você também teria ter outros cuidados, como, armazenamento de sessões (em qual server ficará?), entre outras coisinhas.

  5. 13/05/07 às 7:21 pm #Paulo

    Ótima referência, estava procurando uma solução assim, vou testar aqui.
    Parabéns

  6. 13/05/07 às 7:21 pm #Evandro Pastor

    Excelente tutorial! Está de parabéns!

  7. 13/05/07 às 7:21 pm #Carlos Eduardo

    Arthur parabéns cara, muito show, vou montar aqui em um k6 que tenho para brincar nas horas vagas, puts, mais uma vez prabéns!

  8. 13/05/07 às 7:21 pm #Flavio .: tonapraia :.

    Veio, tah loko o tutorial, agora sim, tu falou e cumpriu rsrsrs!!! Mas vc acredita que não rodou ainda rsrsrs, então la vai a pergunta:

    Como faço para rodar varias aplicações rails no servidor web apache2, ou seja, cada aplicação web seria como um site distinto hospedado. Ex.:

    http://www.site1.com.br (site principal em html simples)
    aplicacao1.site1.com.br (site em Rails)
    aplicacao2.site1.com.br (site em Rails)
    usuario.site1.com.br e html (site em html simples)

  9. 13/05/07 às 7:21 pm #Luizxx

    Parabéns kra!

    Ótimo Tutorial!!!

  10. 13/05/07 às 7:21 pm #Markos

    deixa-me este dae

    Forbidden

    You don’t have permission to access / on this server.
    Apache/2.2.3 (Ubuntu) DAV/2 SVN/1.4.3 mod_fastcgi/2.4.2 PHP/5.2.1 Server at recetario Port 80

  11. 13/05/07 às 7:21 pm #Garcia Souza

    Olá Arthur.
    Paaraabeens.
    Muuuuuuuuuuuuito bom mesmo.
    É exatamente oque eu procurava.
    Brigadão por compartilhar.
    Felicidades.

  12. 13/05/07 às 7:21 pm #Lau

    Muito bom esse tutorial cara, parabéns!

    Eu peguei um erro:
    You don’t have permission to access /railsapp/ on this server

    Você sabe como posso arrumar isso?
    Obs: eu uso um vps centos com plesk.

    Valeu!!

Deixe um comentário

Não é aceito código HTML