Instalando o mod_rails (Phusion Passenger) no Mac OS X Leopard

20/05/08

Recentemente foi lançado o Phusion Passenger, módulo do Apache para deployment de aplicações Ruby on Rails[bb] e que, apesar de novo, já está sendo usado por grandes provedores de hospedagem como Dreamhost e, nacionalmente, pela Locaweb, como anunciado no blog. Mas não é só o ambiente de produção que pode se beneficiar do mod_rails.

Se configurado no ambiente de desenvolvimento, você não precisará mais iniciar um servidor específico para cada uma das aplicações que você tiver. Basta criar um arquivo de configuração VHost, definindo qual é o nome do servidor que irá responder para uma determinada aplicação e você já pode acessá-la.

Antes de começar, certifique-se de que tem o XCode instalado, pois o instalador irá usá-lo para compilar o Phusion Passenger. Você também precisa ter Apache 2 instalado. Se você possui uma versão mais antiga, lembre-se de atualizá-lo antes de continuar a instalação.

Instalando o Phusion Passenger

Para instalar o Phusion Passenger, você deve instalar a gem chamada passenger.

sudo gem install passenger

Depois, execute o comando abaixo para iniciar a instalação automática.

sudo passenger-install-apache2-module

Se tudo correr bem, você verá uma mensagem com algumas linhas que devem ser adicionadas ao seu arquivo de configuração do Apache.

Mensagem de instalação do Phusion passenger

Configurando o Apache

Agora, você precisa configurar o Apache para que suas aplicações Ruby on Rails sejam iniciadas. Abra o arquivo "/etc/apache2/httpd.conf" e adicione as seguintes configurações ao final do arquivo:

LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-1.0.5/ext/apache2/mod_passenger.so
RailsSpawnServer /Library/Ruby/Gems/1.8/gems/passenger-1.0.5/bin/passenger-spawn-server
RailsRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
 
NameVirtualHost *
Include /private/etc/apache2/vhosts/*.conf

As três primeiras linhas devem ser substituídas pela sua própria configuração, aquela que apareceu quando você terminou de instalar o Phusion Passenger.

Crie o diretório onde serão adicionados os arquivos de configuração do VHost com o comando abaixo.

sudo mkdir /private/etc/apache2/vhosts

Agora, basta criar a configuração que irá identificar sua aplicação. Supondo que você tenha um projeto chamado 'spesa' —e você não tem!— no diretório '/Users/fnando/Sites', você adicionará as configurações abaixo ao arquivo "/private/etc/apache2/vhosts/spesa.conf":

<VirtualHost *>
  ServerName dev.spesa
  DocumentRoot /Users/fnando/Sites/spesa/public 
  RailsEnv development
</VirtualHost>
 
<Directory "/Users/fnando/spesa">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS>
      Order allow,deny
      Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS>
      Order deny,allow
      Deny from all
    </LimitExcept>
</Directory>

Para que você possa acessar seu projeto digitando o nome do servidor, você precisa adicioná-lo ao seu arquivo de hosts. Abra o arquivo "/etc/hosts" e adicione a linha abaixo.

127.0.0.1	dev.spesa

Você pode adicionar diversos servidores para responderem em um mesmo IP; Basta separá-los por espaço, como no exemplo abaixo.

127.0.0.1	dev.spesa dev.soundslike

Remova o arquivo ".htaccess" presente no seu diretório "public" com o comando "rm ~/Sites/spesa/public/.htaccess".

Pronto! Seu ambiente já está configurado. Basta reiniciar o Apache com o comando "sudo apachectl restart" e acessar o projeto com o nome do servidor escolhido. Se, por algum motivo, sua aplicação não puder ser iniciada, uma mensagem do Phusion Passenger irá aparecer.

Tela de erro do Phusion Passenger

Existe uma documentação bastante completa, com diversas configurações adicionais que podem ser feitas, além de soluções para problemas comuns. Vale a pena dar uma olhada!

Rails escala? Quem se importa!

07/05/08

Image by Reuters Um verdadeiro flamewar se levantou em torno do assunto na lista rails-br nos últimos dias.

Mas e então, Rails escala? NÃO, assim como PHP ou Java também não escalam. O Rails permite que você faça isso de maneira mais simples que outras tecnologias.

A linguagem/framework não é a única responsável pela escalabilidade. Para escalar um website, você precisa de uma infraestrutura que permita fazer isso. Isso pode ser feito de diversas maneiras, como adicionar múltiplos bancos de dados, adicionar mais servidores, adicionar cache, otimizar pontos críticos de seu código, e por aí vai! Não sou especialista no assunto, mas este é, ao meu ver, o básico para se fazer!

Muitas pessoas citam exemplos de sites com grande volume de acessos, normalmente de fora de país. Não precisamos ir tão longe para ver um exemplo em Ruby on Rails que deu certo. O BlogBlogs, criado pelo Manoel Lemos, possui um widget 1 milhão de visualizações por dia e 35TB de transferência por mês! A maioria dos sites jamais chegará a um nível como este. E se chegar, você provavelmente terá recursos para levar seu site a um próximo nível, contratando pessoas competentes que saberão como lidar com o aumento de tráfego.

Para finalizar, o Google não é feito em Python, o Yahoo! não é feito em PHP, e o Twitter não é feito em Rails. Todos eles são uma mescla de diversas tecnologias, que permitem suportar, em maior ou menor escala, um grande volume de usuários. Alguns fazem isso muito bem, outros nem tanto.

Usando arrays no Ruby

17/04/08

O Ruby tem algumas particularidades que muitas pessoas não conhecem. Algumas são especialmente úteis, como é o caso do atalho de array. Normalmente, utilizamos a seguinte sintaxe:

items = ['mac', 'linux', 'windows', 'unix']
puts items.size # returns 4

Esse formato é bastante simples, mas se você tiver muitos itens pode se tornar um pouco cansativo para se digitar. No Ruby, você também pode utilizar esta sintaxe:

items = %w[mac linux windows unix]
puts items.size # returns 4

É importante notar que você deve escapar o espaço se quiser usar um termo composto por mais de uma palavra.

items = %w[mac linux windows\ vista unix]
puts items.size # returns 4

Note que você pode usar qualquer caracter como agrupador. Veja alguns exemplos:

items = %w{mac linux windows unix}
puts items.size # returns 4
 
items = %w"mac linux windows unix"
puts items.size # returns 4
 
items = %w(mac linux windows unix)
puts items.size # returns 4

Uma dica muito simples, mas elegante!