Pular para o conteúdo principal

Load Balancer Varnish

Introdução

O Varnish é um proxy reverso HTTP de alta performance, projetado principalmente para atuar como acelerador de aplicações web através de cache em memória.

Ele é posicionado entre os clientes e os servidores de backend, armazenando respostas HTTP em cache para reduzir a carga nos servidores de aplicação e melhorar o tempo de resposta das requisições.

Embora não suporte TLS nativamente, ele é normalmente utilizado atrás de um terminador SSL, como NGINX ou HAProxy, permitindo que o Varnish opere internamente com HTTP enquanto clientes externos utilizam HTTPS.

Ele é ideal quando:

  • o site tem alto volume de tráfego
  • muitas requisições são repetidas
  • o backend é caro ou lento para gerar respostas
  • você quer reduzir carga em servidores de aplicação

Além do cache, o Varnish também oferece recursos de roteamento e distribuição de requisições entre múltiplos servidores backend, permitindo atuar como um balanceador de carga HTTP básico.


Configuração do Varnish como Balancer

Passo 1 – Montando a Topologia

Adicione na camada de balanceamento o Varnish com IPv4 Público. Após isso, aplique a alteração.

imagem

Passo 2 – Apontamento de Domínio

  1. Aponte o seu domínio para o IP Público do Varnish.
  2. Acesse o diretório /etc/varnish, oa arquivo de configuração é o default.vcl

imagem

  1. O arquivo default.vcl ja vem pré configurado ao criar a topologia, segue exemplo do arquivo abaixo com 2 servidores backend: Obs: IP_INTERNO será exibido o ip interno da sua aplicação.
vcl 4.0;
import std;
import directors;
backend serv2 { .host = "IP_INTERNO "; .port = "80"; .probe = { .url = "/"; .timeout = 30s; .interval = 60s; .window = 5; .threshold = 2; } }
backend serv1 { .host = "IP_INTERNO "; .port = "80"; .probe = { .url = "/"; .timeout = 30s; .interval = 60s; .window = 5; .threshold = 2; } }



sub vcl_init {
new myclust = directors.hash();
myclust.add_backend(serv2, 1);
myclust.add_backend(serv1, 1);
}

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}

sub vcl_recv {
if (req.http.Upgrade ~ "(?i)websocket") {
set req.backend_hint = myclust.backend(client.identity);
return (pipe);
}
else {
set req.backend_hint = myclust.backend(client.identity);
}
}

sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}

sub vcl_fini {
return (ok);
}

Após ajuste se necessario, basta reiniciar o node do Varnish e se tudo certo ele vai mostrar no canto superior direto que foi reiniciado com sucesso:

imagem