Saltar al contenido principal

Balanceador de Carga Varnish

Introducción

El Varnish es un proxy inverso HTTP de alto rendimiento, diseñado principalmente para actuar como acelerador de aplicaciones web mediante caché en memoria.

Se posiciona entre los clientes y los servidores backend, almacenando respuestas HTTP en caché para reducir la carga en los servidores de aplicación y mejorar el tiempo de respuesta de las solicitudes.

Aunque no soporta TLS de forma nativa, normalmente se utiliza detrás de un terminador SSL, como NGINX o HAProxy, permitiendo que Varnish opere internamente con HTTP mientras los clientes externos usan HTTPS.

Es ideal cuando:

  • el sitio tiene un alto volumen de tráfico
  • muchas solicitudes se repiten
  • el backend es costoso o lento para generar respuestas
  • quieres reducir la carga en servidores de aplicación

Además del caché, Varnish también ofrece funciones de enrutamiento y distribución de solicitudes entre múltiples servidores backend, permitiendo actuar como un balanceador de carga HTTP básico.


Configuración de Varnish como Balanceador

Paso 1 – Montando la Topología

Agrega en la capa de balanceo el Varnish con IPv4 Público. Después de eso, aplica el cambio.

imagem

Paso 2 – Apuntamiento de Dominio

  1. Apunta tu dominio a la IP Pública de Varnish.
  2. Accede al directorio /etc/varnish, el archivo de configuración es default.vcl

imagem

  1. El archivo default.vcl ya viene preconfigurado al crear la topología, a continuación un ejemplo del archivo con 2 servidores backend: Obs: IP_INTERNO mostrará la IP interna de tu aplicación.
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);
}

Después de ajustar si es necesario, solo reinicia el nodo de Varnish y si todo está correcto mostrará en la esquina superior derecha que se reinició con éxito:

imagem