Blabos de BlebePublicado em 12/09/2010
O Dreamhost é uma empresa de web hosting que fornece vários serviços relacionados a hospedagem de sites, tanto com servidores privados quanto com hosts compartilhados.
Neste texto trataremos da instalação de uma aplicação Mojolicious (Mojolicious::Lite para ser mais preciso) utilizando FastCGI em um host compartilhado do Dreamhost, no qual não temos acesso à senha de administrador ou qualquer privilégio especial.
O primeiro passo para a instalação de uma aplicação web é ter no servidor uma conta de usuário com shell e um domínio apontando para algum diretório dessa conta.
Várias aplicações e vários domínios podem ser configurados sob a mesma conta de usuário, mas neste exemplo vamos utilizar tanto uma conta quanto um domínio novos para demonstrar todos os passos.
Um novo usuário pode ser criado através do painel administrativo do Dreamhost.
Na opção Type of User Account (tipo de conta) vamos marcar a opção Shell: allows SFTP/FTP plus shell access. Com isso vamos dar a esse novo usuário acesso ao servidor via ssh.
É opcional, mas vamos ativar também a opção Enhanced security para deixar esta conta completamente isolada das demais. Com isso nem mesmo os seus outros usuários terão acesso aos arquivos dessa conta.
Um domínio ou subdomínio também pode ser configurado através do painel de controle do Dreamhost.
Neste caso vamos utilizar um sub-domínio, mas poderia ser um doutro domínio qualquer.
Na opção Domain to host vamos adicionar o nome do sub-domínio test.blabos.org.
Na opção Do you want the www in your URL? vamos marcar Remove WWW.
Já na opção PHP mode vamos marcar PHP 5 FastCGI. Isso vai ativar o suporte a FastCGI no diretório para onde aponta o nosso sub-domínio.
NOTA: Na wiki do próprio Dreamhost eles avisam que dão suporte somente para FastCGI com PHP. No nosso caso, vamos utilizar FastCGI com Perl, então estamos por nossa própria conta e risco.
Em Web directory configure o diretório que achar mais adequado. É para esse diretório que o sub-domínio vai apontar e nele que vamos instalar a aplicação Mojolicious depois.
A atualização do DNS deve levar algumas horas, portanto configure tanto o usuário quanto o domínio com uma certa antecedência (um ou dois dias, por exemplo).
Após as atualizações surtirem efeito, você será capaz de logar no sub-domínio via ssh e acessá-lo (o diretório configurado anteriormente) via browser.
Configurar o módulo local::lib corretamente vai nos permitir instalar outros módulos Perl do http://cpan.org diretamente no diretório do nosso usuário sem privilégios.
Para isso vamos logar no servidor e executar a primeira parte deste tutorial http://sao-paulo.pm.org/equinocio/2010/mar/2.
NOTA: O detalhe extra aqui é que diferentemente do tutorial, no Dreamhost o arquivo onde devemos configurar as variáveis de ambiente é o .bash_profile e não o .bashrc.
Após configurado o módulo local::lib vamos instalar o módulo Mojolicious::Lite com o comando:
[server]$ cpan Mojolicious::Lite
O Mojolicious só depende de módulos CORE do Perl, então esse passo deve ser bem rápido.
Feito isso vamos criar nossa pequena aplicação web de teste dentro do diretório para onde aponta o sub-domínio, que no nosso caso é test.blabos.org:
[server]$ cd test.blabos.org
[server]$ ls
favicon.gif favicon.ico quickstart.html
[server]$ mkdir TestApp
[server]$ cd TestApp/
[server]$ vi app.pl
Vamos criar nossa aplicação de teste contendo somente as linhas:
#!/usr/bin/perl
use strict;
use warnings;
use Mojolicious::Lite;
get '/' => sub {
my $self = shift;
$self->stash({
'message' => 'Hello World!!!',
});
} => 'index';
shagadelic;
__DATA__
@@ index.html.ep
<%= $message %>%=>
Depois precisamos dar permissão de execução para ela:
[server]$ chmod +x app.pl
Então podemos executá-la utilizando seu servidor web interno:
[server]$ ./app.pl daemon
Sat Sep 11 19:56:19 2010 info Mojo::Server::Daemon:363 [17141]: Server
listening (http://*:3000)
Server available at http://*:3000.
Ainda não podemos acessá-la pelo sub-domínio configurado, mas podemos fazer um teste apontando para o servidor dentro do Dreamhost. Isso pode ser feito com um browser ou usando as técnicas mostradas no texto sobre HTTP:
user@host:~$ nc server.dreamhost.com 3000
GET / HTTP/1.1
Host: server.dreamhost.com:3000
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: text/html
X-Powered-By: Mojolicious (Perl)
Date: Sun, 12 Sep 2010 03:04:56 GMT
Content-Length: 41
Server: Mojolicious (Perl)
Hello World!!!
Neste ponto apenas garantimos que nossa aplicação não contém erros de sintaxe e que ela é totalmente funcional, ainda precisamos configurar o ambiente FastCGI.
Para configurar o ambiente FastCGI, precisamos criar um arquivo .htaccess no diretório para onde o sub-domínio aponta. Esse arquivo nos permite passar configurações para o servidor web (Apache) que valem somente para esse diretório e sem precisar de acesso administrativo. Para maiores detalhes sobre o arquivo .htaccess, consulte a documentação do Apache.
Agora começa a parte delicada.
De acordo com a documentação na wiki do Dreamhost o arquivo .htaccess precisa ter exatamente o conteúdo abaixo:
Options +ExecCGI
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteRule ^(TestApp/dispatch\.fcgi/.*)$ - [L]
RewriteRule ^(.*)$ TestApp/dispatch.fcgi/$1 [PT,L]
Além disso, por causa da política de controle de processos no servidor compartilhado, o script executável da aplicação DEVE ser renomeado para dispatch.fcgi
[server]$ mv app.pl dispatch.fcgi
A aplicação também precisa ser parametrizada corretamente para poder utilizar o FastCGI e precisa obter explicitamente os caminhos para os módulos que foram instalados no diretório do usuário. Assim o código da aplicação fica:
#!/usr/bin/perl
use lib qw{
/index.t/user/perl5/lib/perl5
/index.t/user/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
};
use strict;
use warnings;
use Mojolicious::Lite;
get '/' => sub {
my $self = shift;
$self->stash({
'message' => 'Hello World!!!',
});
} => 'index';
shagadelic('fastcgi');
__DATA__
@@ index.html.ep
<%= $message %>%=>
Um outro detalhe também documentado na wiki do Dreamhost é que o executável e o diretório onde ele está precisam pertencer ao mesmo usuário e grupo da conta que criamos. Além disso, ambos precisam ter a permissão de escrita ativada para o grupo.
Nos nossos testes essa configuração foi irrelevante, mas como está documentado, vamos mantê-la:
[server]$ chmod -R g+w TestApp/
A nossa estrutura de diretórios a partir do diretório raiz do sub-domínio deve ser algo como:
[server]$ tree -a
.
|-- .htaccess
|-- TestApp
| `-- dispatch.fcgi
|-- favicon.gif
|-- favicon.ico
`-- quickstart.html
Os arquivos favicon.gif, favicon.ico e quickstart.html são instalados pelo Dreamhost quando da criação do sub-domínio e não tem nada a ver com a nossa aplicação.
Agora podemos testar a aplicação diretamente no sub-domínio:
user@host:~$ nc test.blabos.org 80
GET / HTTP/1.1
Host: test.blabos.org
HTTP/1.1 200 OK
Date: Sun, 12 Sep 2010 03:27:27 GMT
Server: Apache
X-Powered-By: Mojolicious (Perl)
Content-Length: 41
Vary: Accept-Encoding
Content-Type: text/html
Hello World!!!
Agradeço ao Breno G. de Oliveira pela paciênca, disponibilidade e suporte quando precisamos colocar a aplicação para funcionar. Muito obrigado!
Blabos de Blebe
É programador desde 1999 e atualmente também aluno do curso de Ciência da Computação no Centro Universitário da FEI em São Bernardo do Campo.
Este texto está licenciado sob os termos da Creative Commons by-sa