O Varnish é um acelerador HTTP de alto desempenho e código aberto, projetado para reduzir significativamente a carga dos servidores web e melhorar a velocidade de acesso. De acordo com sua documentação oficial, o Varnish opera como um proxy reverso HTTP baseado em cache.
O criador do Varnish, Poul-Henning Kamp, é um dos desenvolvedores do kernel do FreeBSD. Ele argumenta que os computadores modernos são muito mais complexos do que em 1975. Naquela época, havia apenas dois tipos de armazenamento: memória e disco rígido. Hoje, os sistemas de computação incluem não apenas a memória principal, mas também caches L1, L2 e até L3 dentro das CPUs, além de mecanismos de cache próprios nos discos rígidos. Por isso, a arquitetura do Squid, que gerencia a substituição de objetos de forma independente, não pode otimizar completamente esses recursos, pois o sistema operacional tem visão mais ampla dessas camadas de cache. Essa é a filosofia por trás da arquitetura do Varnish.
Ao implantar o Varnish, o fluxo de processamento de requisições web muda. As requisições dos clientes são primeiro recebidas pelo Varnish. O Varnish analisa essas requisições e as encaminha para o servidor web backend. O servidor web processa normalmente a requisição e retorna os resultados ao Varnish.
O principal recurso do Varnish é armazenar em cache as respostas do servidor web. Quando uma requisição idêntica é feita posteriormente, o Varnish responde diretamente do cache sem encaminhar a requisição ao servidor web. Essa abordagem reduz consideravelmente a carga do servidor web, melhora o tempo de resposta e permite processar mais requisições por segundo. Outro fator importante para a velocidade do Varnish é que todo o cache reside na memória, muito mais rápida que o armazenamento em disco. Várias otimizations adicionais contribuem para o desempenho excepcional do Varnish. No entanto, considerando que a memória é geralmente limitada, é necessário configurar limites de espaço para o cache e evitar o armazenamento de conteúdo duplicado.
A sequência de processamento do cache é: recebimento da requisição → análise (URL e cabeçalhos) → cálculo de hash → busca no cache → verificação de frescor → acesso à fonte → armazenamento → construção da resposta → envio e registro de logs.
O Varnish opera por padrão na porta 6081, com um processo de gerenciamento e processos filhos (cache). Seu site oficial é https://www.varnish-cache.org/.
Características do Varnish e Comparação com Squid
Principais Características do Varnish:
- Baseado em cache em memória - os dados são perdidos após reinicialização
- Utiliza memória virtual para melhor desempenho de I/O
- Suporte para tempo de cache preciso de 0 a 60 segundos
- Linguagem de configuração flexível (VCL - Varnish Configuration Language)
- Limite de 2GB para arquivos de cache em sistemas de 32 bits
- Ferramentas poderosas de gerenciamento como top, stat, admin, list
- Design de máquina de estado elegante e estruturado
- Utilização de heap binário para gerenciar arquivos de cache, permitindo remoção proativa
Comparação entre Varnish e Squid:
Pontos em Comum:
- Ambos funcionam como servidores proxy reverso
- Ambos são softwares de código aberto
Vantagens do Varnish sobre Squid:
- Maior estabilidade - sob cargas equivalentes, o Squid apresenta maior probabilidade de falhas, exigindo reinicializações frequentes
- Velocidade de acesso superior - o Varnish usa "Visual Page Cache" com todos os dados lidos diretamente da memória, enquanto o Squid lida do disco
- Suporte a mais conexões simultâneas - o Varnish libera conexões TCP mais rapidamente, permitindo maior número de conexões em alta concorrência
- Possibilidade de limpeza seletiva de cache usando expressões regulares via porta de gerenciamento
- O Squid utiliza processo único com núcleo único, enquanto o Varnish usa múltiplos processos através de fork, aproveitando todos os núcleos disponíveis
Desvantagens do Varnish em relação ao Squid:
- Maior consumo de recursos (CPU, I/O e memória) em estados de alta concorrência
- Se o processo Varnish travar, crashar ou reiniciar, todo o cache é perdido, enviando todas as requisições ao backend com potencial sobrecarga
- Em ambientes com balanceamento de carga (HA/F5), requisições para a mesma URL podem ser encaminhadas para diferentes servidores Varnish, resultando em cache duplicado e desperdício de recursos
Instalação do Varnish
Configuração do Ambiente
Para este exemplo, utilizaremos três servidores:
- servidor1 (192.168.1.6) - Instalação via código-fonte
- servidor2 (192.168.1.7) - Instalação via yum e back end web
- servidor3 (192.168.1.8) - Backend web adicional
Instalação
Instalação via código-fonte no servidor1
# Instalar pacotes de dependência
[root@servidor1 ~]# yum -y install make autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python3-docutils python3-sphinx graphviz
[root@servidor1 ~]# tar xf varnish-6.2.0.tgz -C /usr/local/src/
[root@servidor1 ~]# cd /usr/local/src/varnish-6.2.0/
[root@servidor1 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish
[root@servidor1 varnish-6.2.0]# make && make install
[root@servidor1 varnish-6.2.0]# echo $?
0
[root@servidor1 varnish-6.2.0]# cd /usr/local/varnish/
[root@servidor1 varnish]# mkdir etc
[root@servidor1 varnish]# cp share/doc/varnish/example.vcl etc/default.vcl
Instalação via yum no servidor2
[root@servidor2 ~]# vim /etc/yum.repos.d/varnishcache_varnish62.repo
[varnishcache_varnish62]
name=varnishcache_varnish62
baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[varnishcache_varnish62-source]
name=varnishcache_varnish62-source
baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[root@servidor2 ~]# yum clean all && yum list
[root@servidor2 ~]# yum -y install varnish
Configurando o Varnish no servidor1 para cache do site do servidor2
Modificando o arquivo de configuração VCL:
[root@servidor1 ~]# vim /usr/local/varnish/etc/default.vcl
backend principal {
.host = "192.168.1.7";
.port = "80";
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cache";
}
else {
set resp.http.X-Cache = "Miss cache";
}
}
Configurando variáveis de ambiente:
[root@servidor1 ~]# vim /etc/profile.d/varnish.sh
export PATH=/usr/local/varnish/bin:/usr/local/varnish/sbin:$PATH
[root@servidor1 ~]# . /etc/profile.d/varnish.sh
Iniciando o Varnish:
[root@servidor1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (18374) Started
[root@servidor1 ~]# ps aux | grep varnishd
root 18364 0.0 0.0 22188 1532 ? SLs 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
root 18374 1.8 4.4 1029912 89468 ? SLl 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
root 18593 0.0 0.0 112724 992 pts/0 S+ 23:00 0:00 grep --color=auto varnishd
[root@servidor1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
Configurando o backend web no servidor2
[root@servidor2 ~]# yum -y install httpd
[root@servidor2 ~]# echo servidor2 > /var/www/html/index.html
[root@servidor2 ~]# systemctl start httpd
[root@servidor2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
Testando o cache
Usando o comando curl para testar o cache:
[root@servidor1 ~]# curl -I 192.168.1.7 // Acesso direto ao servidor2
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:14:16 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Accept-Ranges: bytes
Content-Length: 7
Content-Type: text/html; charset=UTF-8
[root@servidor1 ~]# curl -I 192.168.1.6 // Primeiro acesso ao servidor1
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:14:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 12
Age: 0
Via: 1.1 varnish (Varnish/6.2)
X-Cache: Miss cache // Cache não encontrado
Accept-Ranges: bytes
Connection: keep-alive
[root@servidor1 ~]# curl -I 192.168.1.6 // Segundo acesso ao servidor1
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:16:39 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 15 32773
Age: 2
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache // Cache encontrado
Accept-Ranges: bytes
Connection: keep-alive
O tempo de cache é curto. Para melhorar, pode-se configurar a funcionalidade de conexão persistente no httpd (definindo KeepAlive On no arquivo de configuração e reiniciando o serviço).
Configurando múltiplos sites no Varnish (servidor1 cacheando servidor2 e servidor3)
Modificando o arquivo de configuração VCL:
[root@servidor1 ~]# vim /usr/local/varnish/etc/default.vcl
backend backend2 {
.host = "192.168.1.7";
.port = "80";
}
backend backend3 {
.host = "192.168.1.8";
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?exemplo.com"){
set req.http.host = "www.exemplo.com";
set req.backend_hint = backend2;
} elsif (req.http.host =~ "^forum.exemplo.com") {
set req.backend_hint = backend3;
}
}
Reiniciando o Varnish:
[root@servidor1 ~]# yum -y install psmisc
[root@servidor1 ~]# killall varnishd
[root@servidor1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (19017) Started
Configurando o backend web no servidor3
[root@servidor3 ~]# yum -y install httpd
[root@servidor3 ~]# echo servidor3 > /var/www/html/index.html
[root@servidor3 ~]# systemctl start httpd
[root@servidor3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
Configurando resolução de nomes no servidor1
[root@servidor1 ~]# vim /etc/hosts
192.168.1.6 www.exemplo.com
192.168.1.6 forum.exemplo.com
Testando múltiplos sites
[root@servidor1 ~]# curl www.exemplo.com // Primeiro acesso, aponta para servidor2
servidor2
[root@servidor1 ~]# curl -I www.exemplo.com // Segundo acesso, apenas cabeçalhos
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 16:09:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 5 32772
Age: 12
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache // Cache encontrado
Accept-Ranges: bytes
Connection: keep-alive
[root@servidor1 ~]# curl forum.exemplo.com // Primeiro acesso, aponta para servidor3
servidor3
[root@servidor1 ~]# curl -I forum.exemplo.com // Segundo acesso, apenas cabeçalhos
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 16:09:49 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 2019 16:07:43 GMT
ETag: "7-58f4ccaa0e583"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 32774 8
Age: 6
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache
Accept-Ranges: bytes
Connection: keep-alive
Conceitos Estendidos sobre Cache
Por que usar cache?
- Dados acessados tendem a ser acessados novamente (princípio da localidade de referência) li>Após um dado ser acessado, clientes próximos ou próximos no tempo provavelmente acessá-loão novamente Estratégias de armazenamento em cache
Para máxima velocidade de acesso, a melhor abordagem é armazenar tudo na memória. No entanto, bancos de dados como memcached, redis e HANA, embora eficientes, não são práticos para páginas inteiras devido ao volume de dados.
Uma abordagem mais realista combina memória com discos de alta velocidade:
li>Armazenar chaves (keys) na memória li>Armazenar valores (values) em discos de alta performance Modelo de dados: chave-valor
- Chave: resultado do cálculo hash de características específicas (como URL), armazenada na memória
- Valor: conteúdo real (corpo da página), geralmente armazenado em disco de alta velocidade
Componentes essenciais de sistemas de cache
li>Memória cache li>Disco cache de alta velocidade Termos comuns em caching
- Hit: dado encontrado no cache
- Miss: dado não encontrado no cache
- Taxa de acerto: (número de hits)/(número de hits + número de misses)
- Dados quentes: dados frequentemente acessados
- Limpeza (eviction): remoção de dados do cache quando espaço é limitado
- LRU (Least Recently Used): política de remoção que descarta os itens menos recentemente usados
- Purge: remoção intencional de itens específicos do cache
- Objeto de cache: qualquer item armazenado no cache (usuários, cookies, transações, páginas, etc.)