Apache – Proxy Reverso

Como montar um proxy reverse no servidor Apache

O que vem a ser um proxy reverse

O que vem a ser necessariamente um Proxy Reverse?

Imagine que você tenha uma máquina Linux rodando o Apache como servidor de aplicações web com páginas em HTML que pode ser facilmente acessado por qualquer pessoa de qualquer lugar.

Bom, suponhamos que você tem dois servidores Windows 2000 Server rodando na rede interna com IPs não roteáveis, um rodando aplicações ASP com o Serviço IIS (Internet Information Service) e outro rodando aplicações Java, por exemplo o JakartaTomCat. Ambos acessando um bando de dados robusto do tipo Oracle ou outro banco qualquer.

Só que essas máquinas só conseguem responder por http://192.168.0.1/aplicacao ou http://servidor_windows/aplicacao, ou seja, somente as máquinas da sua rede interna poderão navegar na aplicação e você não tem nenhum ip verdadeiro para estar delegando a essas máquinas para poder torná-las acessíveis para a internet.

Aí entra a jogada o Proxy Reverse! O Proxy Reverse pode ser entendido também como Cluster Web, ou seja, uma máquina principal recebe a solicitação e essa máquina tem por objetivo solicitar o serviço de outra máquina. Não entenda como redirecionamento e sim como troca de processamento, sendo que o processamento estará sendo dividido, ou seja, uma estará postando as informações e a outra estará fornecendo o serviço.

Configurando o Apache para o funcionamento do proxy

Passei um bom tempo estudando o funcionamento desse serviço de Proxy Reverse, pois eu não conhecia ninguém que já tivesse feito isso, porém tive o auxílio de um grande amigo e professor chamado Ulisses T.V. Guedes (responsável pela área de redes do Instituto Nacional de Pesquisa Espaciais) e aqui deixo meus votos de agradecimentos à ele.

No meu caso utilizei o Apache 1.3.27 instalado num Slackware 8.1. As aplicações envolvidas são:

  • Windows 2000 Server rodando o IIS com páginas ASP;
  • Windows 2000 Server rodando o Jakarta TomCat da Apache.

Suponhamos que esses 2 Servidores Windows já estão configurados para rodar, só que com IPs não roteáveis, ou seja, somente na rede interna.

No caso, somente o Apache que está rodando no Slackware tem o domínio válido e pode ser acessado. Chamaremos o domínio de http://www.empresa.com.brpara o exemplo.

Como sou do tipo que gosto de fazer tudo na unha, tive que baixar o pacote .tar.gz do Apache, descompactar e compilar. Vamos a receita do bolo!

Os seguintes pacotes foram utilizados:

  • apache_1.3.27.tar.gz
  • mod_ssl-2.8.14-1.3.27.tar.gz
  • php-4.3.4RC2.tar.gz
  • openssl-0.9.6i.tar.gz

Vou ser bonzinho e explicar todos os passos desde a instalação do Apache completo até…. 😉

NOTA: vou partir do princípio que você já fez o download dos pacotes, que podem ser facilmente encontrados a partir do site de buscahttp://freshmeat.net.

Primeiro passo, descompacte todos os pacotes num diretório qualquer. No meu caso, escolhi /usr/local/src e lá coloquei os arquivos:

# cd /usr/local/src
# tar -zxvf apache_1.3.27.tar.gz
# tar -zxvf mod_ssl-2.8.14-1.3.27.tar.gz
# tar -zxvf php-4.3.4RC2.tar.gz
# tar -zxvf openssl-0.9.6i.tar.gz

Comece a instalação pelo PHP:

# cd php-4.3.RC2
# ./configure –with-apache=../apache_1.3.27
# make
# make install

Agora vá para o diretório do OpenSSL:

# cd ../Openssl-0.9.6i
# ./config
# make
# make install

Agora o ModSSL:

# cd ../mod_ssl-2.8.14-1.3.27
# ./configure –with-apache=../apache_1.3.27 –with-ssl=../openssl-0.9.6i

Agora o Apache:

# ./configure –with-prefix=/usr/local/apache –with-bindir=/usr/local/bin –with-sbindir=/usr/local/sbin –enable-module=ssl –enable-module=proxy –enable-shared=proxy –enable-module-rewrite –enable-shared=rewrite –activate-module=src/modules/libphp4.a
# make
# make certificate
# make install

Falei que gosto de fazer as coisas na mão né? rs. Taí o resultado, porém funciona somente com os módulos que quero.

O importante são os parâmetros –enable-module=proxy e –enable-module=rewrite. No caso de instalações por RPM tipo RedHat, esses módulos vem ativados por padrão, bastando apenas desativar na configuração do httpd.conf o que você não deseja carregar.

Para finalizar a configuração do Apache, volte para o diretório do PHP e copie o arquivo php.ini-dist para /usr/local/lib/php.ini.

Configurando o proxy reverse para acessar outras máquinas

Após tudo estar funcionando, vá para o diretório do Apache e edite o arquivo de configurações:

# cd /usr/local/apache/conf
# vi httpd.conf

Nele, verifique se as seguintes configurações foram bem sucedidas na instalação:

LoadModule rewrite_module     libexec/mod_rewrite.so
LoadModule php4_module        libexec/libphp4.so  -> esse é apenas para o PHP
LoadModule proxy_module       libexec/libproxy.so

AddModule mod_proxy.c
AddModule mod_rewrite.c

Esses caras são os responsáveis pelo funcionamento do Proxy Reverse. Caso esses não estejam declarados, reveja a compilação do seu Apache.

Agora vamos para o que interessa realmente, procure a linha <IfModule mod_proxy.c>, iremos trabalhar com ela agora:

<IfModule mod_proxy.c>
ProxyRequests Off   -> deixe essa linha como Off, já tive problema com ela
ProxyPass /serv1/ http://192.168.0.22:80/serv1/
ProxyPassReverse /serv1/ http://192.168.0.22:80/serv1/
<Directory /usr/local/apache/htdocs/serv1>
Order Allow,deny
Allow from all
</Directory>
Redirect Permanent /serv1 https://www.empresa.com.br/serv1/
Nessa primeira passagem está acontecendo o seguinte:

O que se refere a ProxyPass /serv1, significa que quando alguém digitar http://www.empresa.com.br/serv1 ele irá solicitar o serviço emhttp://192.168.0.22:80/serv1/ ou seja, o serviço solicitado roda na porta 80 do primeiro servidor na rede interna.

Um detalhe importante é que a primeira solicitação que é o serv1 digitado no http://www.empresa.com.br tem que ser idêntica a entrada do servidor da rede interna, ou seja, no primeiro caso é um IIS que está rodando no 192.168.0.22, então no diretório de serviços dele a pasta onde se encontra as páginas ASP tem que se chamar serv1 (nesse exemplo é claro).

Uma vez encontrado, o ProxyPassReverse devolve a solicitação e quem vai postar a tela é o Apache, sendo que ele não precisa ter suporte a ASP, pois quem está processando páginas ASP é o Windows 2000. Isso forma um cluster, as duas máquinas estão processando as informações e deixando o serviço bem mais rápido.

A diretiva <Directory /usr/local/apache/htdocs/serv1> tem que existir, pois o Apache está fazendo de conta que é ele quem é dono do serviço. então você tem que ter criada uma pasta chamada serv1 no seu htdocs do Apache.

No Redirect Permanent estou forçando para que a navegação do servidor Windows 2000 Server utilize a criptografia de SSL criada no Apache, ou seja oWindows 2000 não tem criptografia, então o Apache fornece o serviço de criptografia.

Continuando dentro da tag <IfModule mod_proxy.c>, vamos ao exemplo de configuração para o segundo servidor:

    ProxyPass /clijava/ http://192.168.0.20/clijava/
ProxyPassReverse /clijava/ http://192.168.0.20/clijava/
AllowCONNECT 443
<Directory /usr/local/apache/htdocs/clijava>
Order Allow,deny
Allow from all
</Directory>
Redirect Permanent /clijava https://www.empresa.com.br/clijava/
</IfModule>
Essa outra diretiva está acionando o outro Windows 20000, o que roda o Jakarta TomCat. O procedimento é quase idêntico ao que expliquei acima, sendo que nesse caso o AllowCONNECT 443 é utilizado porque além da criptografia do Apache, o Jakarta também está criptografado, então nesse caso os dois servidores estão conversando em criptografia.

Em todo o caso o Jakarta não precisaria estar criptografado, mas fiz uns testes com ele e percebi que se os dois estiverem criptografado, tenho que usar essa diretiva.

E por fim:

ProxyVia On

<IfModule mod_disk_cache.c>
CacheRoot “/usr/local/apache/proxy”
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
</IfModule>

Isso serve para a troca de cache e é extremamente importante, dependendo de quantas requisições seu servidor interno tiver, você tem que alterar esse números ai. Caso queira saber mais a fundo consulte a documentação do Apache.

Finalmente, pronto!

Aqui termino minha publicação do artigo e espero que isso possa ajudar alguém como tem me ajudado até hoje. Caso alguém tenha alguma dúvida, estarei a disposição para poder exclarecê-las.

 

Fonte:  http://xoops.net.br/docs/apache/apache-proxy-reverso/index.php

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s