Proxy reverso com Apache

proxyEntendo um proxy reverso

Para quem não sabe um proxy reverso faz exatamente o que diz o nome, ele serve como uma ponte para o que está atrás do proxy, como mostrado na figura abaixo.

 

Como podemos entender na imagem acima, quando um usuário quer acessar um serviço do Web Server por exemplo, ele passa pelo proxy reverso, que faz a requisição para o Web Server e depois repassa a informação para o usuário. Assim sendo, sempre que existir um proxy reverso antes do Web Server ou qualquer outro tipo de servidor de serviço, o usuário sempre irá falar e somente falará com o proxy reverso, que então irá fazer toda as requisições ao servidor de serviço.
Agora que sabemos o que é um proxy reverso, vamos ao trabalho.

Instalação e configuração do Apache

Vou usar o CentOS x64 como base. Vamos instalar o Apache 2.2.3:
# yum install httpd.x86_64 httpd-devel.x86_64
Apache instalado, vamos a configuração.
Vou apenas falar sobre as configurações de proxy reverso.
Para melhor ilustrar vou criar o seguinte cenário:

  • Site principal da empresa = http://www.nossoproxy.com.br
  • Site de um sistema chamado SOS da empresa = sos.nossoproxy.com.br
  • Site de outro sistema chamado ONLINE da empresa = online.nossoproxy.com.br

A ideia é fazer com que todos os serviços da empresa passem a funcionar somente pelo site principal, o http://www.nossoproxy.com.br.
Após a configuração ficará assim:

# vi /etc/httpd/conf/httpd.conf
Verifique se as seguintes linhas estão descomentadas, sem ‘#’ a frente:

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so

Acredito que por padrão já devem estar descomentadas.
Vamos adicionar as seguintes linhas ao final do arquivo:

<VirtualHost *:80>
<IfModule mod_proxy.c>
####COMPACTAÇÃO####
<IfModule mod_headers.c>
   ProxyPreserveHost Off
   <Proxy "http://sos.nossoproxy.com.br"&gt;
      RequestHeader set Host  sos.nossoproxy.com.br
   </Proxy>
   ProxyPass /sos  http:// sos.nossoproxy.com.br/sos
   ProxyPassReverse /sos/ http://www.nossoproxy.com.br/sos/
</IfModule>
<IfModule mod_headers.c>
   ProxyPreserveHost Off
   <Proxy "http://online.nossoproxy.com.br"&gt;
      RequestHeader set Host  sos.nossoproxy.com.br
   </Proxy>
   ProxyPass /online  http://online.nossoproxy.com.br/online
   ProxyPassReverse /online/ http://www.nossoproxy.com.br/online/
</IfModule>
<IfModule mod_headers.c>
   ProxyPreserveHost Off
   <Proxy "http://www.nossoproxy.com.br"&gt;
      RequestHeader set Host   http://www.nossoproxy.com.br
   </Proxy>
   ProxyPass /  http://www.nossoproxy.com.br/
   ProxyPassReverse / http:// http://www.nossoproxy.com.br
</IfModule>
### CACHE###
</IfModule>
</VirtualHost>

Salvar e feche.
Reinicie o Apache:
# service httpd restart
Apache configurado, agora vou explicar cada item:
<IfModule mod_headers.c>
</IfModule>
Dentro dele você pode fazer configuração de proxy que modifica o header da requisição. Necessário quando o servidor que você queira se conectar solicita o Host Header.
RequestHeader set Host Modifica o Host Header, assim você pode se conectar no Web Server através de nome.
ProxyPass pega o que o usuário digita após a primeira / (ela também está incluída) e direciona para um endereço. Sendo que isso é em direção ao servidor proxy. Exemplo: http://www.nossoproxy.com.br/sos
O ProxyPass vai pegar o /sos e se conectar em http://sos.nossoproxy.com.br/sos.
ProxyPassReverse altera ou mantém o que vem após a primeira / (ela também está incluída) e direciona para um endereço. Sendo que isso é em direção ao usuário (reverso).

Configuração de cache

Coloque as informações abaixo de onde está escrito ###CACHE###:

<IfModule mod_disk_cache.c>
   CacheEnable disk /
   CacheRoot /var/spool/httpd
   CacheDirLevels 5
   CacheDirLength 4
   CacheMinFileSize 1024
   CacheMaxFileSize 10485760
   CacheDefaultExpire 144000
</IfModule>

Essas são as minhas configurações, cada um deve fazer a sua. Vou explicar cada item.
CacheEnable disk /, aqui diz que irá fazer cache de tudo que é possível fazer.
CacheRoot, diretório onde os arquivos do cache serão salvos, não esquecer de dar permissão ao usuário apache:
# chown apache:apache -R "diretório"
CacheDirLevels, quantidade de níveis de diretórios do CacheRoot.
Exemplo: /var/spool/httpd/1111/2222/3333/4444/5555
CacheDirLength, quantidade de caracteres dos nomes de diretórios. Teoricamente quanto menor, mais rápido vai ser a busca do cache no disco.
CacheMinFileSize, tamanho mínimo em byte do arquivo a ser pego para o cache.
CacheMaxFileSize, tamanho máximo em byte do arquivo a ser pego para o cache.
CacheDefaultExpire, tempo em segundos para o arquivo ser mantido em cache.

Configuração de compactação

Coloque as informações abaixo de onde está escrito ###COMPACTAÇÃO###:

<IfModule mod_deflate.c>
   AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript application/xml application/xhtml+xml "application/x-javascript \n\n" "text/html \n\n"
   DeflateCompressionLevel   9
</IfModule> ## COLOQUE NA LINHA ANTERIOR AO </VirtualHost>

Vamos as explicações:
AddOutputFilterByType DELATE, diz que vai compactar os tipos de arquivos que estiverem saindo do proxy.
Os arquivos que configurei são a grande maioria de tipos de arquivos que compreendem hoje a internet. Vale informar que não configurei arquivos de imagem, já que na maioria das vezes elas já estão compactadas e seu ganho seria pequeno e o processamento iria aumentar bastante.
DeflateCompressionLevel 9, nível de compactação dos arquivos, varia de 1 até 9, quanto maior, maior a compactação e processamento.

Instalação e configuração do awstats para estatísticas

Pelo que tem no mercado hoje, esse foi o melhor software livre que encontrei que gera estatísticas através do log do Apache.
Baixar o arquivo do site:

Baixando:
# wget http://awstats.sourceforge.net/files/awstats-7.0.tar.gz
Descompactando:
# tar -zvf awstats-7.0.tar.gz
Entre do diretório awstats-7.0/tools:
# cd awstats-7.0/tools
Instalando:
# perl awstats_configure.pl
Siga a instalação normalmente.
Dentro do seu httpd.conf foi inserido novas linhas, vamos dar um pouco mais de segurança a página de estatísticas.
Adicione as linhas que estão em negrito. Meu local de instalação das páginas é /var/www/html:

<VirtualHost *:8080>
#
# Directives to allow use of AWStats as a CGI
#
Alias /awstatsclasses "/var/www/html/awstats-7.0/wwwroot/classes/"
Alias /awstatscss "/var/www/html/awstats-7.0/wwwroot/css/"
Alias /awstatsicons "/var/www/html/awstats-7.0/wwwroot/icon/"
ScriptAlias /awstats/ "/var/www/html/awstats-7.0/wwwroot/cgi-bin/"
#
# This is to permit URL access to scripts/files in AWStats directory.
#
<Directory "/var/www/html/awstats-7.0/wwwroot">
    Options FollowSymLinks Indexes
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

Feche e salve.
Vamos alterar o arquivo de configuração do awstats:
# vi awstats/awstats.www.nossoproxy.com.br.conf
Localize a linha:
LogFormat=
Altere para:

LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %deflateratio %refererquot %uaquot"

Agora vamos alterar o arquivo de configuração do Apache:
# vi /etc/httpd/conf/httpd.conf
Localize a linha LogFormat. Verifique se a configuração está assim:

LogFormat "%h %l %u %t \"%r\" %>s %b (%{ratio}n) \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

Para que isso? Para que o awstats consiga pegar os informações necessárias do log do Apache.
Localize a linha Listen. Adicione a seguinte linha:

Listen seuip:8080

Salve e feche.
Vamos agora configurar com que frequência o awstats vai ler o log do Apache para buscar informações para gerar as estatísticas.
# crontab -e
Adicione as seguintes linhas:

## ATUALIZA ESTATISTICA A CADA 2 MIN
00-59/2 * * * * /var/www/html/awstats-7.0/wwwroot/cgi-bin/awstats.pl -update -config=www.nossoproxy.com.br

Salve e feche.
Com essa configuração o script de atualização irá executar a cada 2 minutos todos os dias.
Pronto, está configurado o awstats, para acessar basta ir em:
http://www.nossoproxy.com.br:8080/awstats/awstats.pl?config=www.nossoproxy.com.br
Configure o hosts:
# vi /etc/hosts
Inserir as linhas:

seuip sos.nossoproxy.com.br
seuip online.nossoproxy.com.br

Salve e feche.
Finalizando…
Alterar nome do servidor para http://www.nossoproxy.com.br:
# vi /etc/sysconfig/network
Altere para:

HOSTNAME=www.nossoproxy.com.br

Considerações finais

A pergunta que não quer calar, por quê Apache?
Testei o poderoso Varnish, realmente ele parece ser muito bom (globo.com usa), mas infelizmente cheguei em um ponto que precisava de ajuda e não tive, a documentação é muito pobre ainda e tive certa demora com o uso de tickets no site deles.
Pensei também no ngnix, mas achei que teria o mesmo problema do Varnish. Então vamos de Squid, ele deixou a desejar em certas configurações que não consegui fazer. Um ponto muito positivo do Apache é a vasta documentação.
Fiz testes durante 2 semanas utilizando cache de disco, cache de memória e sem cache, posso afirmar que o cache de disco obteve o melhor desempenho em conjunto com a compactação nível 9.

Fonte:Diego Oliveira da Silva

Anúncios

Tags:

About Desmonta&CIA

Somos um blog que busca informar aos apaixonados por tecnologia tudo sobre o mundo de TI.

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

%d blogueiros gostam disto: