Várias Apps Web.py no DreamHost com Passenger

N*web.py+DreamHost+Passenger = Diversao^2
portanto
Diversao=\sqrt{DreamHost+Passenger+N*web.py}

Há algumas semanas eu me diverti por horas tentando colocar duas aplicações web.py funcionando no DreamHost com Passenger. Eu consegui e vou mostrar como.

Este post é completo mas, antes de seguirmos adiante, recomendo dar uma olhada no guia do usuário do Passenger e mantê-lo à mão para eventualidades. Além disso, para se familiarizar com o assunto deste post, é uma boa ideia passar os olhos pelas seguintes páginas do Wiki do DreamHost: wiki.dreamhost.com/Passenger, wiki.dreamhost.com/Passenger_WSGI e wiki.dreamhost.com/Web.py.

Este artigo também pode ser útil no caso de ser necessário rodar uma aplicação Web.py, ou qualquer outra em Python (tais como em Django ou Flask) em um subdiretório do seu domínio.

Vamos por partes.

1) Passenger

Caso não tenha habilitado o Passenger para o seu domínio, acesse o Painel de Controle do DreamHost e vá para Manage Domains. Seja na criação de um novo domínio ou na alteração de um existente, basta você marcar o checkbox como mostrado a seguir. Saiba que o seu diretório web deve terminar em /public para habilitar o Passenger.

Check the checkbox

Verifique tudo e clique em “Fully host this domain” ou em “Change settings“. Essa foi fácil.

2) Python 2.7

A partir desta parte vamos precisar de acesso ao shell, portanto acesse o Painel de Controle do DreamHost e ative o acesso ao shell.

Se prestar atenção, o Python do DreamHost é bem antigo e nós queremos usar um mais novo pois é um prerrequisito para a maioria das bibliotecas atuais. Portanto, vamos instalar o Python 2.7.3 na sua conta compartilhada do DreamHost dentro do diretório ~/Python27.

Acesse sua conta via SSH e faça o download do código-fonte do Python:

Configure-o para instalar em ~/Python27 — você pode escolher outro diretório qualquer — rode o build e instale. Esse processo vai levar alguns minutos e gerar muita saída no shell, da qual apenas as mensagens de erro, se houver, são importantes:

Pronto! Experimente o seu novo Python:

Se desejar colocá-lo no PATH, adicione esta linha ao arquivo ~/.bash_profile:

Faça logout/login e verifique se está no PATH:

Agora sim a coisa está começando a esquentar!

3) Virtualenv

O Virtualenv é uma mão na roda quando precisamos instalar pacotes/módulos do Python, é conveniente e, na minha opinião, bem fácil. Para usufruir da mais nova versão do Virtualenv, basta baixar um único arquivo, virtualenv.py, e executá-lo:

Vamos assim usá-lo para criar um ambiente de Python isolado, que é o propósito do Virtualenv:

Ative o seu virtalenv:

E instale os pacotes necessários, tipo:

Isso torna o virtualenv pronto para rodar algumas boas aplicações web.py!

4) Apps Web.py

Para este exemplo, vamos colocar pra rodar duas aplicações web.py simples e a estrutura de diretório deve ser a seguinte:

Vamos passar por cada arquivo.

4.1) passenger_wsgi.py

Os arquivos public/app1/passenger_wsgi.py e public/app2/passenger_wsgi.py são os “gatilhos” das aplicações e devem ter esse nome (passenger_wsgi.py) pra que funcionem com o Passenger. O conteúdo de exemplo é o seguinte:

4.2) ~/example.com/public/.htaccess

O arquivo ~/example.com/public/.htaccess é onde desativamos o Passenger para todo o domínio, dentre outras coisas. Não se preocupe pois vamos ativar o Passenger quando necessário. O conteúdo de ~/example.com/public/.htaccess é:

4.3) ~/example.com/public/app*/.htaccess

Os arquivos public/app1/.htaccess e public/app2/.htaccess são responsáveis por ativar o Passenger e definir o diretório raiz de cada aplicação. Como no caso da app1:

Breve nota: o diretório raiz da aplicação não tem de necessariamente estar na árvore do diretório public, pode muito bem estar localizado em ~/example.com/app3 ou em qualquer outro, só não se esqueça de definir ~example.com/public/app3/.htaccess de acordo:

4.4) ~/example.com/public/app*/tmp/restart.txt

A documentação do Passenger diz “Criar ou modificar o arquivo tmp/restart.txt no diretório raiz da aplicação faz com que o Phusion Passenger reinicie automaticamente a aplicação durante a próxima requisição.” Então vamos nos lembrar de atualizar este arquivo sempre que necessário, por exemplo, devido a uma alteração na aplicação:

5) Hora de ver tudo rodando!

Abra o navegador e acesse http://example.com/app1 ou http://example.com/app2 para ver as duas aplicações funcionando independentemente. Agora é só relaxar e aproveitar!

6) Conclusion

Até então, tenho tido boas experiencias com o Passenger. É uma alternativa bem rápida e, na minha opinião, até fácil de usar. Um louvor e um muito obrigado à comunidade Ruby!

Bem, é isso por enquanto! Deixe uma mensagem aí abaixo, eu gostaria muito de ler seus pensamentos. =)