Aceleração de Sites com Varnish

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.)

Tags: varnish cache Proxy Reverso aceleração web vcl

Publicado em 6-19 03:36