ArthurGeek.net

Rails, Mac... e Rock'n Roll!

Pôr do sol em São Paulo

Deploy Rails com: Apache + mod_proxy_balancer + mongrel

13 de Maio de 2007 às 16:21 · 12 comentários

[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:······

12 comentários até agora ↓

  • 1 Eduardo Fiorezi // 13 de Maio de 2007 às 20:24

    Fala Arthur,

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

  • 2 Renato Elias // 14 de Maio de 2007 às 11:02

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

    Obrigado mesmo.

  • 3 Marcus Moreira // 14 de Maio de 2007 às 15:42

    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 ArthurGeek // 14 de Maio de 2007 às 16:38

    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 Paulo // 14 de Maio de 2007 às 17:22

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

  • 6 Evandro Pastor // 14 de Maio de 2007 às 18:45

    Excelente tutorial! Está de parabéns!

  • 7 Carlos Eduardo // 14 de Maio de 2007 às 21:53

    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 Flavio .: tonapraia :. // 17 de Maio de 2007 às 21:44

    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.:

    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 Luizxx // 25 de Maio de 2007 às 14:45

    Parabéns kra!

    Ótimo Tutorial!!!

  • 10 Markos // 21 de Junho de 2007 às 19:44

    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 Garcia Souza // 19 de Julho de 2007 às 17:41

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

  • 12 Lau // 06 de Junho de 2008 às 17:59

    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