Pular para o conteúdo

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.
Perfil removido removido
Hits: 73.194 Categoria: Linux Subcategoria: Internet
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Parte 2: 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;
   }
}
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Introdução
   2. Parte 1 - Características do Varnish
   3. Parte 2 - Testes de benchmark
   4. Conclusão

Um tour pelo skin do Viva o Linux para aMSN

Variety - Instalação e configuração

DragonLinux - Distro levíssima

File Globbing ou Englobamento - Introdução

Turck MMcache completo e sem mistérios

Bem vindo ao planeta Viva o Linux

Transações Financeiras (Warsaw vs User Agent Overrider) - Itaú Bankline 30 horas

Configuração do Speedy Telefônica no Slackware 10.2

Alcatel SpeedTouch USB no Slackware 10.1

Baixando arquivos do MegaUpload, Rapidshare, 2Shared, 4Shared, ZShare, Badongo, DepositFiles e Mediafire

#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

Entre na sua conta para comentar.