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:
- O sistema oferece gráficos em tempo real das estatísticas de cache do proxy.
- Gerenciamento de múltiplos servidores Varnish.
- Edição e carga e arquivos de configuração VCL.
- Acesso ao modo console telnet através de uma página do sistema.
Tela principal da interface de administração Web