sexta-feira, 6 de fevereiro de 2009

Utilizando o Zope com o Apache2

Saudações, pessoal.

Acredito que várias pessoas que utilizam aplicações Zope já ouviram falar sobre a possibilidade de rodar tais aplicações sob o Apache. E muitas outras já leram diversos tutoriais que tentam explicar como é feito tal acoplamento dos dois servidores. Eu sou uma dessas pessoas e minha experiência com tais tutoriais é que quase todos mostram exemplos de como realizar esta tarefa mas pouco explicam do mecanismo utilizado, ficando como que algo nebuloso, como que uma caixa preta. Neste pequeno artigo tentarei explicar algumas das partes que considero mais confusas deste procedimento.

Por que usar o Apache ao invés do Zserver?

Segundo [WIKIZOPE], existem várias motivações para você querer usar o Apache ao invés do ZServer (servidor web que vem junto com o Zope), entre elas estão:
  • Mesclagem em um mesmo site de conteúdos baseados em Zope e outros não baseados em Zope;
  • Hospedar em um mesmo host aplicações baseadas em Zope e aplicações baseadas em outras tecnologias, como JavaEE ou PHP;
  • Proteger suas aplicações Zope, uma vez que o ZServer é vulnerável a alguns tipos de ataques, como DOS - Denial Of Service;
  • Aplicar a camada SSL. Apesar de existir o ZopeSSL, mas o ApacheSSL é muito melhor testado e possui muito mais recursos;
  • Definir o cache para melhorar a velocidade de acesso de suas páginas.
Formas de integração

Como podemos ver, são bastante plausíveis os motivos para usar o Apache ao invés do Zserver e para fazer isto existem pelo menos três maneiras diferentes:
  • RewriteRules - Este é o método recomendado e que será abordado por este tutorial;
  • ProxyPass - Menos flexível que o primeiro e raramente usado nos dias de hoje;
  • PCGI/FastCGI - Deprecated - não use isto!
Segundo [IMASTERS], o método RewriteRules é mais usado do que o ProxyPass, simplesmente porque o ProxyPass pode falhar em alguns casos atípicos, além de apresentar alguns problemas com a URL. O método RewriteRules possui uma configuração um pouco mais extensa, mas é tecnicamente o melhor de trabalhar e por isso o recomendado.

O VirtualHostMonster

Antes de passarmos para a configuração propriamente dita, precisamos ao menos citar o mecanismo que já vem pré-instanciado por padrão nas versões mais recentes do Zope, na raiz do ZODB, que é o VirtualHostMonster.

O VirtualHostMonster (ou VHM) modifica o protocolo, o host, e/ou o caminho das URLs geradas pelo Zope, o que possibilita a hospedagem de diferentes domínios em uma única instância do Zope. O VHM não fará nada enquanto não detectar na URL requisitada ao menos um dos elementos-chave:
  • VirtualHostBase - Usado para modificar o protocolo e o host;
  • VirtualHostRoot - Usado para configurar a raiz do caminho da URL.
O VHM faz com que o Zope interprete URLs do tipo
http://www.site.com:8080/VirtualHostBase/http/www.site.com:80/portal/VirtualHostRoot/_vh_portal/
O VHM, no geral, não necessita de nenhuma configuração específica para funcionar, e é tudo que você precisará do lado do Zope.

Configurando o Apache para interagir com o Zope usando RewriteRules

Vou supor que você já tenha devidamente instalado em seu servidor ambos os serviços Apache2 e Zope. Para elaborar este artigo usei o Apache2.2.8 e o Zope2.10.

Para o nosso exemplo, vamos supor que nosso servidor responda a requisições feitas ao endereço www.heldervieira.eti.br, estando os serviços Apache e Zope rodando sob as portas 80 e 9673, respectivamente. Suponhamos também que você disponha de um Plone Site em seu Zope, acessível em http://www.heldervieira.eti.br:9673/portal .

Nota:
Como havia dito anteriormente, não precisamos adicionar nenhuma configuração adicional no Zope. Todas as configurações a seguir são relativas ao Apache.

1º Passo:
Habilite os módulos rewrite e proxy. Se você estiver, como eu, utilizando o Ubuntu, é possível fazer isto facilmente através dos comandos:
$ cd /etc/apache2/mods-enabled
$ sudo a2enmod proxy
$ sudo a2enmod rewrite

2º Passo:
Criar/Modificar o VirtualHost para conter as regras de re-escrita de URL.

Crie um arquivo em /etc/apache2/sites-enable que conterá nosso VirtualHost.
$ cd /etc/apache2/sites-enabled
$ > portal_zope
Edite este arquivo portal_zope e faça com que ele contenha as seguintes linhas:
<VirtualHost www.heldervieira.eti.br>
ServerName www.heldervieira.eti.br
RewriteEngine on
RewriteRule ^/(.*)
http://localhost:8080/VirtualHostBase/http/localhost:80/portal/VirtualHostRoot/$1 [L,P]
</VirtualHost>
Importante:
Esta configuração fará com que todas as requisições feitas ao endereço www.heldervieira.eti.br ou abaixo dele sejam redirecionadas para a pasta portal do Zope, que contém o nosso Plone Site.

Sim. Mas se eu quiser disponibilizar outras aplicações Zope sob o meu domínio? E as outras aplicações (em PHP, por exemplo) rodando em meu Apache?


É possível todas elas coexistirem pacificamente. Basta para isto fazer alguns ajustes em nossa configuração. Um exemplo de VirtualHost que publicaria nosso Plone Site e possibilitaria o acesso a todas as nossas aplicações PHP seria:

<VirtualHost www.heldervieira.eti.br>
ServerName www.heldervieira.eti.br
ServerAdmin webmaster@helder-laptop.eti.br

# Redirecionamento para o Zope
RewriteEngine on
RewriteRule ^/portal$ \
http://localhost:8080/VirtualHostBase/http/%{SERVER_NAME}:80/portal/VirtualHostRoot/_vh_portal/ [L,P]
RewriteRule ^/portal/(.*) \
http://localhost:8080/VirtualHostBase/http/%{SERVER_NAME}:80/portal/VirtualHostRoot/_vh_portal/$1 [L,P]


# Apache + PHP
DocumentRoot /var/www/
<Directory>
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory>
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On

Alias /doc/ "/usr/share/doc/"
<Directory>
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

# Redirecionamento da raiz do site para o portal
Redirect permanent /index.html http://www.heldervieira.eti.br/portal/

</VirtualHost>
Explicando o Redirecionamento

A definição de VirtualHost acima nada mais é do que a definição padrão do Apache2 com algumas pequenas modificações que garantem a mágica do negócio. Este VirtualHost possibilita a coexistência de aplicações PHP e mapeia uma pasta existente no Zope, que no nosso caso é um Plone Site, que é o nosso portal.

Atenção para as linhas:
   RewriteEngine on
RewriteRule ^/portal$ \
http://localhost:8080/VirtualHostBase/http/%{SERVER_NAME}:80/portal/VirtualHostRoot/_vh_portal/ [L,P]
RewriteRule ^/portal/(.*) \
http://localhost:8080/VirtualHostBase/http/%{SERVER_NAME}:80/portal/VirtualHostRoot/_vh_portal/$1 [L,P]
e
   Redirect permanent /index.html http://www.heldervieira.eti.br/portal/
  • RewriteEngine on - habilita o módulo Rewrite para que as RewriteRules ou regras de re-escrita possam funcionar devidamente.
  • RewriteRule ^/portal$ \ - Inicia a definição da regra de re-escrita, de forma a capturar todas as requisições realizadas a www.heldervieira.eti.br/portal.
  • http://localhost:8080 - Onde se encontra rodando a instância do Zope. Este endereço poderá apontar para um servidor remoto.
  • VirtualHostBase e VirtualHostRoot - Expressões especiais que serão tratadas pelo VirtualHostMonster do Zope.
  • %{SERVER_NAME}:80/portal - Destino do redirecionamento. A variável %{SERVER_NAME} é substituída por www.heldervieira.eti.br de acordo com a diretiva configurada no ínício do VirtualHost.
  • _vh_portal - Esta parte informa ao Zope que a raiz do conteúdo é a pasta portal dentro do ZODB. Esta configuração é necessária para que a raiz do redirecionamento não se confunda com a raiz do ZODB. Para funcionar deve existir uma pasta chamada portal na raiz do Zope.
Existe ainda a possibilidade de utilizar tais configurações para trabalharem em conjunto com uma camada SSL. O http depois de VirtualHostBase serve para mudar o protocolo.

Estas configurações, em outras palavras, fazem com que o Apache se comporte normalmente com relação a todos os sub-diretórios com excessão do /portal, o qual todas as requisições para este serão redirecionadas para o Zope.

Por fim, a última linha faz com que o endereço www.heldervieira.eti.br/ seja redirecionado para www.heldervieira.eti.br/portal automaticamente. Porém, nada impede de você possuir outra aplicação rodando em outra pasta, por exemplo, www.heldervieira.eti.br/almoxarifado .

Aqui encerramos mais este artigo. Espero ter colaborado.

Referências
  • [WIKIZOPE] http://wiki.zope.org/zope2/ZopeAndApache
  • [IMASTERS] http://imasters.uol.com.br/artigo/3396/cms/integracao_com_apache/