Fevereiro 19, 2012 Destaque

Varnish Cache – O que é e como implementá-lo?

Você já se perguntou: “Como posso aumentar o desempenho do meu site sem o incremento de custos?”. Pois é, se a resposta foi sim, gostaria de te apresentar o Varnish Cache. Vamos esquecer o conteúdo dinâmico… Vamos falar do conteúdo estático! É, isso mesmo, imagens, scripts, páginas, textos, folhas de estilos, etc., etc., etc. Tudo […]

Você já se perguntou: “Como posso aumentar o desempenho do meu site sem o incremento de custos?”. Pois é, se a resposta foi sim, gostaria de te apresentar o Varnish Cache.

Vamos esquecer o conteúdo dinâmico… Vamos falar do conteúdo estático! É, isso mesmo, imagens, scripts, páginas, textos, folhas de estilos, etc., etc., etc. Tudo isto pode ser ‘cacheado’ pelo Varnish Cache. Atualmente, grandes portais, lojas virtuais, blogs e qualquer tipo de website tem conteúdos que se repetem. Estes conteúdos acabam por gerar requisições desnecessárias ao servidor todas as vezes que são novamente carregados pelos usuários. Quando falamos em servidores de hospedagem compartilhada o desafio é ainda maior: São centenas de websites e milhares de conteúdos estáticos sendo requisitados todos os segundos no servidor.

Saulo, tecnicamente, o que é o Varnish Cache?

Basicamente, é um proxy HTTP Reverso muito eficiente que armazena o conteúdo HTTP requisitado na memória RAM, fazendo com que o servidor não consulte e processe diversas vezes o mesmo conteúdo solicitado – e na maioia das vezes simultâneamente . No caso do Varnish, o servidor apenas busca em cache o objeto da requisição e o retorna ao usuário final de forma extremamente ágil. Todas as requisições são tratadas pelo arquivo de configuração que é compatível as expressões regulares do PERL (Perl Compatible Regular Expressions – PCRE) trazendo assim um leque de possibilidades de customização.

Pode-se perfeitamente trabalhar também com diferentes virtualhosts e em ambiente de hospedagem compartilhada, embora a documentação oficial seja um pouco limitada quanto a isto. Então, há assim a necessidade de desenvolvimento de algumas ferramentas de automatização da sincronização do virtualhost do apache com IPs dedicados ao arquivo de configuração do Varnish, principalmente quando se esta trabalhando em servidores com cPanel/WHM que, na maioria das vezes, as contas são criadas de forma automática e sem a intervenção do administrador, como é o caso da integração com sistemas como o WHMCS, sendo necessário ao desenvolvedor desta solução uma atenção especial a domínios que utilizam endereços IPs dedicados, no qual haverá necessidade de se trabalhar em diferentes “backends” que vamos abordar a seguir.

Os arquivos de configuração do Varnish estão localizados no /etc/varnish/default.vcl e /etc/sysconfig/varnish, o default.vcl é onde esta localizada toda configuração de cache e de comunicação ao Apache, assim como configurações relacionadas a segurança utilizando a sintax PCRE citada anteriormente, juntamente com funções nativas do Varnish que podem ser configuradas, como as restrições a diretórios, assim como aplicar regras similares ao do mod_security que também podem ser aplicadas para domínios específicos. Para dominarmos ainda mais o assunto, precisamos saber de forma rápida como funciona esta configuração:

[code]
backend hostdime {
.host = "127.0.0.1";
.port = "8080";
}
backend dominio {
.host = "127.0.0.2";
.port = "8080";
}

sub vcl_recv {
set req.backend = hostdime;
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
}

sub vcl_recv {
if (req.http.host ~ "hostdime") {
set req.backend = hostdime;
} else if (req.http.host ~ "dominio.com$")
set req.backend = dominio;
}

[/code]

O backend caracteriza o funcionamento do Varnish como o proxy onde você vai informar o IP real do servidor configurado no virtualhost do Apache e a porta que você indicou para o Apache funcionar – no caso esta como porta 8080. Todos os vhosts com este endereço IP podem receber configurações diferenciadas caso o backend seja citado (set req.backend = hostdime;) na diretiva nativa do Varnish, no caso (sub vcl_recv{}) como no exemplo demonstrativo acima.

Recomendo também que compile o módulo rpaf ao Apache para que algumas funções do PHP, como a $_SERVER[‘REMOTE_ADDR’], por exemplo, funcione de forma correta e não fiquem retornando o IP do backend configurado e sim retornando o do usuário final, como deve acontecer. Para isto, realize o seguinte procedimento:

[code]
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar -xzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-*
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
[/code]

Insira as linhas abaixo no arquivo httpd.conf:

[code]
LoadModule rpaf_module modules/mod_rpaf-2.0.so

RPAFenable On
RPAFproxy_ips 127.0.0.1 127.0.0.2 #substitua os endereços IPS pelos ips que irão ser utilizados como proxy
RPAFsethostname On
RPAFheader X-Real-IP
[/code]

Agora, basta reiniciar o Apache e estará tudo ok. Para verificar se o módulo esta ativo, basta rodar o comando: /etc/init.d/httpd -M|grep rpaf. Você deverá receber algo assim: “rpaf_module (shared)“.

O arquivo de configuração de funcionamento do daemon é localizado no diretório /etc/sysconfig/varnish. Na opção DAEMON_OPTS=”” você poderá setar de maneira simples e intuitiva a porta que o Varnish vai rodar a interface administrativa e a forma de armazenamento do cache, se ocorrerá na memória ou arquivo, assim como o tamanho do espaço a ser armazenado em cache. Para entrar na interface administrativa do Varnish, basta digitar varnishadm estando logado via ssh no servidor.

Alguns comandos administrativos do Varnish são: varnishtop, varnishhist, varnishlog (não trabalha escrevendo informações no disco em arquivos de log) e varnishstat.

Bem, esta foi uma ligeira apresentação desta ferramenta fantástica que, em breve, estaremos disponibilizando em todos os nossos servidores compartilhados. Para maiores informações, acesse: https://www.varnish-cache.org/ e https://www.varnish-cache.org/docs

Compartilhe com seus amigos!Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone
.