O que é Varnish Cache: instalação e configuração básica do Varnish Cache Server

Ambiente de teste Família RHELAlmaLinux 9.8conta rootVerificado em 2026-10-16

O Varnish Cache é um cache de proxy reverso que fica na frente do servidor web, guarda as respostas HTTP na memória e responde às mesmas solicitações sem passar pelo servidor de origem. Quando colocamos o Varnish 6.6.2 na frente do WordPress em um servidor AlmaLinux 9.8, as páginas não eram armazenadas em cache por causa do max-age=0, e resolvemos isso definindo um tempo de armazenamento no VCL.

Quais solicitações armazenar em cache e por quanto tempo guardá-las é escrito em um arquivo VCL (Varnish Configuration Language).

1️⃣ Conceito do Varnish Cache: cache de proxy reverso

A cada solicitação, o Varnish verifica primeiro se existe uma resposta armazenada. Se responde com uma resposta armazenada, é um acerto de cache (HIT); se precisa buscar a resposta no servidor de origem (backend), é uma falha de cache (MISS). A resposta buscada em uma falha é guardada durante o tempo de armazenamento e usada nas próximas solicitações.

O Varnish de código aberto não oferece suporte a TLS, por isso não consegue receber solicitações HTTPS diretamente. Na porta 443, o Nginx ou o HAProxy processa o TLS e depois repassa a solicitação ao Varnish.

O projeto de código aberto Varnish Cache mudou de nome para Vinyl Cache a partir da versão 9.0, lançada em março de 2026. O nome Varnish Cache continua sendo usado pela versão que a Varnish Software distribui com recursos de TLS adicionados.

2️⃣ Instalação do Varnish Cache Server

No AlmaLinux 9, você instala com o pacote varnish do repositório padrão (AppStream), e a versão desse pacote é o Varnish 6.6.2, anterior à mudança de nome.

dnf -y install varnish

Quando a instalação terminar, verifique a versão com [varnishd -V].

varnishd -V
varnishd (varnish-6.6.2 revision 17c51b08e037fc8533fb3687a042a867235fc72f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2020 Varnish Software

Os pacotes da família RHEL mantêm a versão 6.6.2, cujo suporte pelo projeto já terminou, e a distribuem apenas com correções de segurança adicionadas. O pacote 6.6.2-7, lançado em junho de 2025, inclui a correção de uma vulnerabilidade de HTTP request smuggling (CVE-2025-47905).

A instalação também cria [/etc/varnish/default.vcl] e [/usr/lib/systemd/system/varnish.service].

grep ExecStart= /usr/lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m

[-a :6081] define a porta que recebe as solicitações, e [-s malloc,256m], os 256MB de memória usados como espaço de armazenamento do cache.

3️⃣ Configuração básica: backend e porta

O arquivo VCL padrão, [/etc/varnish/default.vcl], já vem com a porta 8080 do mesmo servidor configurada como backend.

vcl 4.1;

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

No Apache, mude o valor de [Listen] em [httpd.conf] para 8080 para que ele receba as solicitações repassadas pelo Varnish.

# /etc/httpd/conf/httpd.conf
Listen 8080

Em sites que usam HTTPS, deixe o Varnish na porta 6081 e conecte o Nginx, que processa o TLS, para que ele repasse as solicitações ao Varnish.

A configuração em que o Varnish recebe solicitações diretamente na porta 80 é adequada para sites que usam apenas HTTP. Nesse caso, crie uma cópia do arquivo de serviço como indica a documentação de instalação da Varnish Software e mude 6081 para 80 na linha [ExecStart].

systemctl edit --full varnish

A cópia salva no editor é criada em [/etc/systemd/system/varnish.service], e a porta alterada se mantém mesmo quando você atualiza o pacote.

systemctl enable --now varnish

Seja qual for a configuração escolhida, termine com o comando enable e a opção now para registrar a inicialização automática no boot e já iniciar o Varnish.

4️⃣ Verificação do funcionamento: cabeçalhos X-Varnish e Age

Depois de iniciar o Varnish, verifique pelos cabeçalhos de resposta se as páginas do WordPress realmente saem do cache. A solicitação vai direto para a porta 6081 do Varnish, sem passar pelo Nginx, então o domínio e se é HTTPS são informados com os cabeçalhos [Host] e [X-Forwarded-Proto].

curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"
HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1001
Age: 0
Via: 1.1 varnish (Varnish/6.6)

[X-Varnish] é o número que o Varnish dá à solicitação, e [Via: 1.1 varnish] indica que a resposta passou pelo Varnish. [Age] é o tempo (em segundos) desde que a resposta foi armazenada no cache.

Quando enviamos a mesma solicitação de novo 3 segundos depois, [X-Varnish] ainda tinha um único número e [Age] era 0, ou seja, o servidor de origem respondeu outra vez. Uma regra que o plugin de cache colocou no [.htaccess] adiciona [max-age=0] ao HTML, e por isso a configuração padrão do Varnish calculou o tempo de armazenamento como 0 segundo.

Solicitações com cookies também não passam pelo cache na configuração padrão. O mesmo vale para os cookies das ferramentas de análise de visitantes, então todas as solicitações de visitantes que têm esses cookies vão para o servidor de origem.

O VCL abaixo repassa ao servidor de origem as solicitações de login e de administração e as que não são GET nem HEAD, e armazena em cache as demais depois de remover os cookies. Respostas com tempo de armazenamento de 0 segundo que não criam cookies são guardadas por 10 minutos, e respostas que pedem para não ser guardadas, como [no-cache], não são guardadas.

vcl 4.1;

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

sub vcl_recv {
    if (req.method != "GET" && req.method != "HEAD") {
        return (pass);
    }
    if (req.url ~ "^/(wp-admin|wp-login\.php)" || req.http.Cookie ~ "wordpress_logged_in_|wp-postpass_|comment_author_") {
        return (pass);
    }
    unset req.http.Cookie;
}

sub vcl_backend_response {
    if (beresp.ttl <= 0s && !beresp.http.Set-Cookie) {
        set beresp.ttl = 10m;
    }
}

Depois de alterar o arquivo VCL, recarregue-o com [systemctl reload varnish]. Abaixo está a segunda de duas respostas obtidas ao enviar a mesma solicitação duas vezes ao Varnish com este VCL aplicado.

curl -sI -H "Host: example.com" -H "X-Forwarded-Proto: https" http://127.0.0.1:6081/ | grep -iE "^(HTTP|cache-control|x-varnish|age|via)"
HTTP/1.1 200 OK
Cache-Control: max-age=0
X-Varnish: 1004 1002
Age: 3
Via: 1.1 varnish (Varnish/6.6)

A segunda solicitação, enviada 3 segundos depois de aplicar o VCL, tinha dois números em [X-Varnish] e [Age] era 3. Dois números significam que a resposta veio do cache, e o segundo número é o da solicitação que buscou a página no servidor de origem e a armazenou.

A solicitação com cookie de login recebeu um único número e foi respondida pelo servidor de origem, enquanto a que tinha apenas o cookie da ferramenta de análise foi respondida pelo cache.

🔢 FAQ & conteúdo recomendado

Se você define o tempo de armazenamento como 10 minutos no VCL, durante esses 10 minutos a página de antes da edição guardada no cache é exibida. Para limpar o cache assim que você salva um post, é preciso uma regra VCL que processe solicitações PURGE e um plugin como o Proxy Cache Purge. No VCL, limite as solicitações PURGE para aceitar só as enviadas do mesmo servidor.

Se o servidor web envia diretamente, sem PHP, os arquivos HTML criados pelo plugin de cache, o Varnish acaba fazendo o mesmo trabalho de novo. Se as páginas em cache também passam pelo PHP para responder, o Varnish responde na frente e reduz a execução do PHP.

Um site pode usar Varnish mesmo que o cabeçalho não apareça, porque os administradores do servidor às vezes renomeiam ou removem cabeçalhos de resposta. Em um servidor da Cloudways com o Varnish ativado, as respostas do WordPress tinham os cabeçalhos [x-cache: HIT] e [age] no lugar de [X-Varnish].

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 10   +   7   =