Apache, Rails, mod_passenger e variáveis do ambiente

Recentemente precisei configurar uma aplicação Rails em um servidor Apache com o módulo Phusion Passenger. As instalações iniciais foram simples, bastando habilitar a extensão mod_passenger e configurar um virtual host para minha aplicação.

No entanto, perdi algum tempo tentando descobrir porque minhas varáveis do ambiente não estavam sendo configuradas corretamente na aplicação quando acessadas via navegador ‐ tudo funcionava perfeitamente no console.

O mod_passenger não acessa as variáveis armazenadas diretamente no ambiente do servidor. Acabei descobrindo que, para driblar essa limitação, você precisa criar um wrapper que carregue as variáveis antes de executar qualquer script ruby via Passenger.

Por exemplo, basta criar um script em /usr/local com o nome de ruby_wrapper e alterar/adicionar a seguinte configuração no arquivo de configuração do Apache para a sua aplicação:

PassengerRuby /usr/local/ruby_wrapper

No script você inicia as varáveis e depois executa o Ruby:

#!/bin/sh
export TWITTER_KEY=123
export TWITTER_SECRET=abc
export FACEBOOK_APP_ID=1456
export FACEBOOK_SECRET=abc
exec "/usr/bin/ruby" "$@"

Pronto, agora você já pode acessar variáveis configuradas no servidor antes do interpretador Ruby ser executado e não precisa colocar nenhuma informação sensível diretamente no código da sua aplicação.

Mais informações no blog da Phusion.