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