Varnish: Uma camada de velocidade

O objetivo deste trabalho é apresentar ao leitor a ferramenta de proxy reverso Varnish, mostrar suas principais características e averiguar seu desempenho através de testes de benchmark. Nesta última fase foram feitos testes comparativos entre o Varnish e o Squid, em que ficou patente do desempenho superior do Varnish em todos os testes executados.

[ Hits: 71.306 ]

Por: Perfil removido em 10/05/2010


Parte 1 - Características do Varnish



Segundo o site do projeto [11], Kamp [12] e Okama [2], podemos citar como principais características do Varnish:

1. Alta performance

  • O Varnish foi desenvolvido especificamente para servir de proxy reverso para sistemas de gerenciamento de conteúdo ( CMS ) lentos. Não foram incluídas no Varnish funcionalidade extras normalmente encontradas em outros servidores de proxy, com suporte a diversos protocolos.
  • Foco 100% em performance, Kamp utilizou todo o seu conhecimento sobre o funcionamento do Kernel para fazer com que o Varnish trabalhe sempre junto com o Kernel, aproveitando suas qualidade de gerenciamento de memória ao máximo.
  • Capacidade de trabalhar em 32 ou 64 bits aproveitando ao máximo cada operação do processador. Kamp [12] contabiliza que o Varnish é capaz de responder a uma requisição Web utilizando aproximadamente 11 syscalls e 7 locks.
  • Multi-cpu e multi-core escalonando pools de threads por todos os núcleos, aproveitando toda a capacidade de processamento.
  • Os arquivos de configuração do Varnish são compilados e executados juntamente com a aplicação.
  • Execução em dois processos para garantir o reinício automático da aplicação em caso de falha.

2. Controle sobre cada passo na resposta às requisições

  • Possibilidade de sobrescrever o TTL dos pacotes, adicionar ou remover cabeçalhos, remover cookies, reescrever urls e invalidar objetos no cache.
  • Possui uma linguagem de configuração VCL, específica para configurações de domínio, possibilitando a intervenção em praticamente todas as fases do tratamento da requisição.
  • Permite a inserção de códigos C dentro de seus arquivos de configuração, de forma transparente. No site do sistema, inclusive, é possível se encontrar um método para interligar, através deste recurso, o sistema de proxy Varnish com a ferramenta de localização de IP's GeoIP(1) para criar desta forma um balanceamento de carga geo referenciado.
  • Capacidade de trabalhar com múltiplos arquivos de configuração VCL, podendo inclusive carregar novos arquivos ou alternar entre diversas configurações em tempo de execução.
  • Suporte a balanceamento de carga inclusive com checagem da saúde dos servidores.
  • Mesmo após vencido o tempo de vida de um objeto em memória, o sistema permite se configurar um tempo de vida extra (grace) a objetos para que, caso o servidor Web não responda, este possa continuar atendendo as requisições sem paradas no serviço.

(1) - O GeoIP é uma API e banco de dados em GPL oferecidos pela empresa MaxMind e que possibilita a identificação do Pais e Cidade de um determinado IP com uma precisão de 99,5%.

3. Controle sobre o que deverá ser cacheado

  • Implementa parcialmente a tecnologia ESI, a qual permite se definir, no código da aplicação, como deverá funcionar o cache para as diversas partes de uma página Web. Com o uso desta tecnologia, é possível se definir propriedades de cache diferentes para partes diferentes de uma mesma página Web.

4. Diversas ferramentas de apoio e controle para o sistema de cache

  • Possui um conjunto de ferramentas em modo texto muito completo possibilitando uma fácil administração e monitoria do serviço.
  • Oferece uma interface telnet para um fácil gerenciamento da aplicação

5. Diversos módulos de gerenciamento Web

  • O Varnish possui um módulo próprio para gerenciamento de seu sistema Online bem como módulos para integração dele com o Webmin, Nagios e Munin.

6. Log centralizado em memória

  • A fim de evitar chamadas para gravação em disco desnecessárias, todo o gerenciamento do log é feito em memória.
  • O sistema oferece ferramentas completas para visualização do log de formas variadas permitindo uma análise profunda do seu funcionamento.
  • Serviço para armazenamento do log em disco em um formato compatível com o Apache / NCSA para integração com outras ferramentas como o Awstats2.

Linguagem VCL

Uma das características mais importantes do Varnish é a flexibilidade no tratamento das requisições através de uma linguagem específica para tratamento de domínios VCL (Linguagem de Configuração do Varnish).

Exemplo de configuração para um blog Wordpress.

backend default {
   .host = "127.0.0.1"; # Ip e porta do servidor Web
   .port = "80";
}

# Apagar todos os cookies que o cliente enviar para o servidor quando a url contiver wp-login ou wp-admin
sub vcl_recv {
   if (!(req.url ~ "wp-(login|admin)")) {
      unset req.http.cookie;
   }
}

# Apagar todos os cookies que servidor tentar enviar para o cliente nas mesmas condições
sub vcl_fetch {
   if (!(req.url ~ "wp-(login|admin)")) {
      unset obj.http.set-cookie;
   }
}

Como pode se perceber no exemplo acima, a configuração do Varnish é bastante simples e efetiva. Uma descrição completa da linguagem VCL fugiria do escopo deste trabalho, mas, de forma resumida, ela pode ser descrita como a declaração de um ou mais serviços Web "backend" e a configuração das funcionalidades utilizando para isto um modelo de ganchos "hooks", em que é possível se inserir códigos configurando diversas etapas no atendimento às requisições. Schofmann [10] destaca dentre os ganchos principais da linguagem VCL:
  • vcl_recv - Recebe a requisição do cliente e decide o que fazer.
  • vcl_fetch - Chamado após um documento ser recebido com sucesso do servidor Web.
  • vcl_deliver - Chamado antes de enviar um objeto do cache para o cliente.
  • vcl_hash - Calcula a chave de hash para identificar os objetos no cache, o padrão é a URL.
  • vcl_miss e vcl_hit - Chamados quando o Varnish identifica "hit" ou não "miss" uma requisição com um objeto em cache.
  • vcl_error - Chamado quando é identificado um erro na resposta à requisição
  • vcl_discard - Chamado quando um objeto esta prestas a ser descartado.
  • vcl_timeout - Chamado quando um documento em memória expira.
  • vcl_pipe ou vlc_pass - Chamados quando o proxy deve ignorar as comunicações entre o servidor Web e o cliente em uma determinada condição.

Edge Side Includes - ESI

Para cada requisição de página html, sistemas de proxy reverso devem decidir entre obter o documento do servidor Web ou entregar algum objeto de seu cache. Não existia porém uma forma de diferenciar partes diferentes de uma mesma página e dar tratamento diferenciado a certas regiões da página. Para resolver este problema, um grupo de empresas desenvolveu um padrão de instruções que permitisse realizar esta diferenciação chamado ESI(Edge Side Includes).

Em 2001, o padrão ESI foi submetido ao World Web Consotion (W3C) para sua aprovação. O instituto tomou conhecimento do padrão, porém não a aceitou a proposta enviada. Atualmente diversas empresas como a Akamai, o Oracle e a IBM, entre outras, aceitam e reconhecem este padrão.

O Varnish implementa somente a parte desta linguagem responsável pelo gerenciamento de políticas de cache. Segundo a página do projeto, ele implementa a tag <esi:include>. Esta permite que sejam inseridos trechos de uma página dentro de outra, para que este trecho seja incluído no momento em que a página for tratada pelo proxy.

Exemplo de página utilizando ESI
Abaixo pode se observar o exemplo de aplicação ESI encontrado no site do projeto.

Um script cgi para mostrar um relógio - /cgi-bin/data.cgi

#!/bin/sh
echo 'Content-type: text/html'
echo ''
date "+%Y-%m-%d %H:%M"

Um documento html - texto.html

<HTML>
<BODY>
A hora neste momento é: <esi:include src="/cgi-bin/data.cgi"/>.
</BODY>
</HTML>

Uma regra para tratamento do arquivo ESI:

sub vcl_fetch {
   if (req.url == "/texto.html") {
      esi;  /* Fazer processamento ESI */
      set obj.ttl = 24 h;
   } elseif (req.url == "/cgi-bin/data.cgi") {
      set obj.ttl = 1m;
   }
}

Ferramentas do Varnish

O Varnish possui um conjunto completo de ferramentas em modo texto para o gerenciamento e monitoração da qualidade de seu serviço. Dentre as ferramentas oferecidas destacamos:

VarnishHist - Este utilitário cria um gráfico, em tempo real, mostrando o fluxo de requisições atendidas pelo Varnish. As requisições respondidas com objetos do cache são representadas com um "|" e as repassadas para o servidor Web com um "#". Na linha inferior do gráfico é possível ver uma régua de tempo possibilitando uma visualização imediata das requisições atendidas e seu tempo de resposta.

Gráfico gerado pelo VarnishHist
VarnishStat - Um poderoso aplicativo que apresenta, em tempo real, em uma única tela, a visualização completa de todas as estatísticas do Varnish. Sua utilização permite o monitoramento, de forma dinâmica, do funcionamento do Varnish em seus diversos aspectos.

Interface de administração Web

Além de todas as ferramentas em modo shell e do ambiente telnet para gerenciamento da ferramenta, o Varnish ainda oferece um módulo completo de interface Web. Dentre os recursos desta interface destacamos:
  1. O sistema oferece gráficos em tempo real das estatísticas de cache do proxy.
  2. Gerenciamento de múltiplos servidores Varnish.
  3. Edição e carga e arquivos de configuração VCL.
  4. Acesso ao modo console telnet através de uma página do sistema.


Tela principal da interface de administração Web
Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Parte 1 - Características do Varnish
   3. Parte 2 - Testes de benchmark
   4. Conclusão
Outros artigos deste autor

Asterisk com PostgreSQL e unixodbc

Servidores Debian ou Ubuntu integrados ao AD com cid-tty

Ubuntu - configurando dois monitores numa mesma placa de vídeo

Funtoo Linux - Pré-instalação

Escreva para o VOL - Contribua você também!

Leitura recomendada

Freeradius - servidor radius eficiente e completo

Criando VPN site-to-site, conectando diversas filiais a matriz com openVPN

Vídeo e rádio no Firefox

Instalando o MSN-Proxy 0.7 no OpenSuSE 11.1 Linux

Ligando, conectando e desligando automaticamente com o Kurumin

  
Comentários
[1] Comentário enviado por tomassoni em 12/05/2010 - 14:10h

Muito legal.
Gostaria de saber se você já o utilizou na prática, se teria um exemplo de regras.

[2] Comentário enviado por removido em 12/05/2010 - 14:39h

Participei de alguns testes na época do lançamento do Blog do Planalto em que pudemos por a prova esta ferramenta em uma rede de alta velocidade. Existem varios exemplos de configuração no site do projeto http://varnish-cache.org, mas depende do soft que for utilizar. Por exemplo, utilizei com um sistema de blogs wordpress/buddypress e na epoca eu checava a existência de um cookie para definir se iria fazer cache.

[3] Comentário enviado por Gilmar_GNU/Slack em 13/05/2010 - 14:00h

TO curtindo o lance de aprender sobre o varnish.
Pois eu estava lá na palestra na Area 1.
O Varnish tem uma vantagem bem interessante em cima do Squid.

[4] Comentário enviado por dolivervl em 13/05/2010 - 18:42h

Muito bom, eu estava procurando um artigo desse aqui no VOL há algum tempo atrás, mas não encontrei. Hoje já tenho meu proxy com varnish rodando.

[5] Comentário enviado por jr.jorro em 14/05/2010 - 14:34h

E para controle de internet ? Num ambiente que envolve muitos usuários ?

Gostaria de saber as vatagens do Squid sob o varnish e as desvantagens do varnish. Se alguém puder me dar uma luz, agradeço.

[6] Comentário enviado por removido em 14/05/2010 - 15:15h

Serviço de hospedagem de sites tam uma fila de atendimento, se o seu servidor consegue atender rapidamente, esta fila se mantem pequena, se ele engasga ela cresce e derruba o serviço. O varnish serve para acelerar o atendimento às requisições mantendo as páginas em memoria.

O squid perde de longe para esta belezinha, ele não consegue gerenciar corretamente a memoria nem distribuir seus jobs pelos núcleos do computador.

[7] Comentário enviado por mosoli em 14/05/2010 - 17:19h

Cara!
Excelente artigo!

[8] Comentário enviado por schenkmh em 25/05/2010 - 09:17h

Estou usando a versão 2.1 do Varnish baixada do repositório do Ubuntu. Segui algumas configurações sugeridas no site http://varnish-cache.org, porém são para versão 2.0 e estou enfrentando algumas dificuldades devido a interpretação de comandos por esta versão. Não tenho grande experiência nas linguagens C e Perl. Alguém pode me ajudar? Segue o erro retornado:

root@marco-desktop:/home/marco# varnishd -a :80 -T localhost:6082 -f /etc/varnish/teste.vcl -s file,/var/cache/varnish.cache,512M
storage_file: filename: /var/cache/varnish.cache size 512 MB.
Message from VCC-compiler:
Invalid assignment operator ';' only '=' is legal for strings
Message from C-compiler:
./vcl.1P9zoqAU.c: In function ‘VGC_function_vcl_fetch’:
./vcl.1P9zoqAU.c:736: error: expected ‘)’ before ‘;’ token
./vcl.1P9zoqAU.c:738: error: invalid use of void expression
./vcl.1P9zoqAU.c:738: error: expected ‘;’ before ‘}’ token
Running C-compiler failed, exit 1
VCL compilation failed

Valeu!

[9] Comentário enviado por removido em 25/05/2010 - 09:48h

Fiz a instalação do Varnish 2.1 no Ubuntu Lucid e a instalação padrão esta funcionando blz, tb testei este comando q vc enviou mudando somente o aquivo teste.vcl para default.vcl q é o padrão instalado e também funcionou normal. A falha esta em seu vcl, coloque o conteúdo padrão nele conforme abaixo e teste novamente para ver se funciona. Qualquer coisa meu mail é alexandrehaguiar arroba gmail.com.

backend default {
.host = "127.0.0.1";
.port = "8080";
}

[10] Comentário enviado por schenkmh em 25/05/2010 - 10:15h

Olá Alexandre

Não funcionou. Enviei um e-mail com meu arquivo vcl, ok!
Obrigado pela ajuda!

[11] Comentário enviado por pokado em 17/08/2010 - 14:55h

tinha lido sobre as vantagens dele sobre o squid... mas será que tem como fazer ele trabalhar como cache web normal (nao reverso) ?

[12] Comentário enviado por removido em 17/08/2010 - 17:11h

Ele foi feito para trabalhar especificamente como proxy reverso e não tem outros recursos que o squid possui necessários para uma ferramenta de proxy.

[13] Comentário enviado por FireBird em 10/05/2011 - 16:41h

Cara... Onde fica e como faço pra limpar o cache do varnish? Sabe me falar?

[14] Comentário enviado por fabriciocscte em 18/02/2013 - 17:21h

Eu queria saber se utilizando o varnish com a seguinte configuração eu tenho um acréscimo na segurança.
Eu tenho muitos ataques a sites wordpress, então pensei em isolar os clientes em um servidor X e liberar o acesso para o servidor Y que hospeda o varnish. Assim, apenas o servidor X terá acesso aos servidor Y(meus clientes wordpress).

Como esses ataques acontecem de forma automática e infectam com malware, queria saber se essa configuração isola os PHPs dosmeus sites wordspress.


vlw

[15] Comentário enviado por removido em 18/02/2013 - 21:09h

O varnish pode ajudar em ataques de negação de serviço mas não em ataques com bots.

Você pode tentar proteger as páginas wp-login e wp-admin com uma autenticação básica adicional para evitar que os scripts funcionem... pode até interligar esta autenticação básica com um sistema de firewall como o csf (http://configserver.com/cp/csf.html) e fazer com que o usuário fique bloqueado apos certo número de erros. Cuidado no entanto para não bloquear seus clientes;)

O melhor mesmo seria bloquear estes links para acesso somente por uma rede especifica...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts