[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
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….
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.
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?
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.
13/05/07 às 7:21 pm #Paulo
Ótima referência, estava procurando uma solução assim, vou testar aqui.
Parabéns
13/05/07 às 7:21 pm #Evandro Pastor
Excelente tutorial! Está de parabéns!
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!
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)
13/05/07 às 7:21 pm #Luizxx
Parabéns kra!
Ótimo Tutorial!!!
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
13/05/07 às 7:21 pm #Garcia Souza
Olá Arthur.
Paaraabeens.
Muuuuuuuuuuuuito bom mesmo.
É exatamente oque eu procurava.
Brigadão por compartilhar.
Felicidades.
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!!