Instalación y configuración de Varnish Cache en un VPS para acelerar sitios web
TL;DR
En esta guía detallada, configuraremos Varnish Cache paso a paso en un VPS para acelerar significativamente la carga de su sitio web, reducir la carga del servidor y mejorar la experiencia del usuario. Varnish actuará como un acelerador HTTP de alto rendimiento, almacenando en caché contenido estático y dinámico y entregándolo directamente a los usuarios sin recurrir al servidor web principal.
Configuramos Varnish Cache 7.x para funcionar como proxy inverso y acelerador HTTP.
Integramos Varnish con un servidor web (por ejemplo, Nginx) y un terminador SSL (Caddy).
Garantizamos la seguridad del servidor con UFW y Fail2ban.
Proporcionamos comandos y archivos de configuración listos para usar.
Incluimos una estrategia de copia de seguridad y consejos de mantenimiento.
Explicamos qué configuración de VPS es óptima para Varnish Cache.
Qué configuramos y por qué
Esquema: Qué configuramos y por qué
En esta guía, nos centraremos en la instalación y configuración detallada de Varnish Cache en un servidor privado virtual (VPS). Varnish es un potente acelerador HTTP que funciona como un servidor proxy inverso. Su tarea principal es el almacenamiento en caché del contenido solicitado con frecuencia, lo que le permite entregar respuestas directamente a los clientes sin sobrecargar su servidor web principal (Apache, Nginx, etc.).
Como resultado de una configuración exitosa, obtendrá:
Aceleración significativa de la carga del sitio web: Varnish procesa las solicitudes mucho más rápido que los servidores web tradicionales, especialmente para contenido estático y páginas que rara vez cambian.
Reducción de la carga del servidor: Menos solicitudes llegan a su servidor web y base de datos, lo que libera recursos para procesar tareas más complejas o un mayor número de solicitudes únicas.
Escalabilidad mejorada: Su servidor podrá soportar una carga mucho mayor y picos de tráfico, ya que Varnish asume una parte significativa del trabajo.
Mayor tolerancia a fallos: En caso de indisponibilidad temporal del backend, Varnish puede seguir entregando contenido en caché, asegurando una disponibilidad parcial del sitio.
Alternativas y por qué autoalojado en un VPS
Existen varios enfoques para acelerar los sitios web:
CDN (Content Delivery Network): Redes globales de servidores que almacenan en caché contenido y lo entregan a los usuarios desde el nodo más cercano. Ideal para audiencias geográficamente distribuidas. Ejemplos: Cloudflare, Akamai, Amazon CloudFront.
Almacenamiento en caché a nivel de servidor web: Nginx y Apache tienen módulos de almacenamiento en caché incorporados. Son efectivos, pero menos flexibles y potentes para el almacenamiento en caché HTTP puro que Varnish.
Almacenamiento en caché a nivel de aplicación: Plugins para CMS (WordPress, Joomla), frameworks (Laravel, Symfony) o lógica de aplicación personalizada. Esto permite almacenar en caché datos de la base de datos o páginas generadas.
La elección de Varnish autoalojado en un VPS tiene varias ventajas, especialmente para los propietarios de servidores que necesitan control total y optimización de costos:
Control total: Usted controla completamente la configuración de Varnish, VCL (Varnish Configuration Language), las reglas de caché y la lógica. Esto es crítico para aplicaciones complejas.
Ahorro: Para muchos proyectos, el costo de un VPS + Varnish puede ser significativamente menor que los pagos mensuales por CDN o servicios de caché gestionados, especialmente con altos volúmenes de tráfico.
Optimización para una tarea específica: Puede ajustar Varnish a las especificidades de su aplicación, lo que a menudo es imposible con las soluciones CDN genéricas.
Facilidad de integración: Varnish se integra fácilmente con la infraestructura existente en un VPS.
En este tutorial, nos centraremos en los pasos prácticos para que pueda implementar y configurar Varnish por su cuenta, utilizando las versiones de software actuales y las mejores prácticas.
Qué configuración de VPS se necesita para esta tarea
Esquema: Qué configuración de VPS se necesita para esta tarea
Los requisitos de VPS para Varnish Cache dependen principalmente del volumen de contenido a almacenar en caché, el tráfico esperado y la complejidad de las reglas VCL. Varnish es conocido por su alto rendimiento y uso eficiente de los recursos, especialmente la memoria RAM.
CPU: 1 núcleo (por ejemplo, Intel Xeon E5 o similar). Varnish no utiliza intensivamente la CPU, a menos que procese un volumen muy grande de solicitudes por segundo o reglas VCL complejas.
RAM: 1-2 GB. El consumo principal de memoria de Varnish se debe al almacenamiento en caché. Cuanta más RAM, más contenido se puede almacenar en caché en la memoria, lo que garantiza la máxima velocidad.
Disco: 20-40 GB NVMe/SSD. Varnish puede almacenar en caché en disco, pero esto es significativamente más lento que en RAM. El disco es necesario para el SO, los registros y el almacenamiento de copias de seguridad. NVMe/SSD es importante para la capacidad de respuesta general del sistema.
Red: 100 Mbps - 1 Gbps. Un alto ancho de banda de red es importante, ya que Varnish entregará el contenido en caché directamente a los clientes.
Plan de VPS recomendado (para sitios/proyectos medianos)
Para la mayoría de los proyectos, incluidas las aplicaciones SaaS, GitLab, Mattermost o servidores de juegos con tráfico moderado (si Varnish se utiliza para la interfaz web), se recomienda la siguiente configuración:
CPU: 2-4 núcleos (Intel Xeon o AMD EPYC modernos). Proporcionará un margen para manejar picos de tráfico y el funcionamiento de otros servicios.
RAM: 4-8 GB. Permitirá almacenar en caché un volumen significativo de contenido en la memoria RAM, lo cual es crítico para el rendimiento.
Disco: 80-160 GB NVMe/SSD. Espacio suficiente para el SO, los registros de Varnish, las copias de seguridad y otros archivos del sistema.
Red: 1 Gbps. Un canal estable y rápido para la entrega de contenido.
Tráfico muy alto: Si su sitio web o aplicación genera cientos de millones de solicitudes al mes, y Varnish opera constantemente al límite de las capacidades del VPS.
Gran volumen de caché: Si necesita almacenar en caché cientos de gigabytes de datos en memoria para un rendimiento máximo, y un VPS con esa cantidad de RAM es demasiado caro o no está disponible.
Requisitos de aislamiento: Para aplicaciones críticas donde el aislamiento completo de los recursos y la ausencia de "vecinos" en el hipervisor son importantes.
Requisitos de hardware específicos: Si necesita tarjetas de red especiales, controladores RAID u otras características de hardware no disponibles en un VPS.
Para proyectos muy grandes, donde Varnish forma parte de una infraestructura compleja, puede ser necesario un servidor dedicado. Un servidor dedicado adecuado garantizará el máximo rendimiento y flexibilidad.
Ubicación: en qué influye
La elección de la ubicación del VPS tiene un impacto directo en:
Latencia: Cuanto más cerca esté el servidor de su audiencia principal, menor será la latencia y más rápida la carga de las páginas. Para Varnish, esto es especialmente crítico, ya que se encuentra en la vanguardia del procesamiento de solicitudes.
Cumplimiento legal: Algunas regiones tienen requisitos estrictos para el almacenamiento de datos (por ejemplo, GDPR en Europa). La elección de la ubicación del servidor debe tener en cuenta estos aspectos.
Costo: Los precios de los VPS pueden variar según la región.
Siempre elija una ubicación lo más cercana posible a su audiencia objetivo para lograr el mejor rendimiento.
Preparación del servidor
Diagrama: Preparación del servidor
Antes de instalar Varnish Cache, es necesario realizar una configuración básica y proteger su VPS. Utilizaremos Ubuntu Server 24.04 LTS, ya que es una distribución actual y ampliamente utilizada con soporte a largo plazo.
1. Conexión SSH y creación de usuario
Se asume que se ha conectado al servidor como usuario root. Lo primero es crear un nuevo usuario con permisos sudo para el trabajo diario.
# Añadimos un nuevo usuario (reemplace 'su_usuario' por el nombre deseado)
sudo adduser ваш_пользователь
Siga las instrucciones para establecer la contraseña y la información del usuario. Luego, añada el usuario al grupo sudo para que pueda ejecutar comandos con privilegios de administrador.
# Añadimos el usuario al grupo sudo
sudo usermod -aG sudo ваш_пользователь
Salga de la sesión root e inicie sesión con el nuevo usuario:
# Salir de la sesión actual
exit
# Conexión con el nuevo usuario
ssh ваш_пользователь@ваш_ip_сервера
2. Configuración de claves SSH (recomendado)
Para mejorar la seguridad, se recomienda usar claves SSH en lugar de contraseñas. Genere una clave en su máquina local (si aún no lo ha hecho):
# En su máquina local
ssh-keygen -t rsa -b 4096
Copie la clave pública al servidor:
# En su máquina local
ssh-copy-id ваш_пользователь@ваш_ip_сервера
Después de esto, desactive el inicio de sesión con contraseña para root y su usuario, editando el archivo /etc/ssh/sshd_config:
# Abrimos el archivo de configuración del servidor SSH
sudo nano /etc/ssh/sshd_config
Busque y modifique las siguientes líneas (o añádalas si no existen):
# Desactivamos el inicio de sesión con contraseña
PasswordAuthentication no
# Desactivamos el inicio de sesión para root (si no lo usa para otros fines)
PermitRootLogin no
Guarde el archivo (Ctrl+O, luego Enter) y salga (Ctrl+X). Reinicie el servicio SSH:
# Reiniciamos el servicio SSH para aplicar los cambios
sudo systemctl restart sshd
3. Configuración del firewall (UFW)
Uncomplicated Firewall (UFW) es una interfaz fácil de usar para iptables. Lo configuraremos para permitir solo las conexiones necesarias.
# Actualizamos la lista de paquetes
sudo apt update
# Instalamos UFW
sudo apt install ufw -y
# Permitimos conexiones SSH (puerto 22)
sudo ufw allow OpenSSH
# Permitimos HTTP (puerto 80)
sudo ufw allow http
# Permitimos HTTPS (puerto 443)
sudo ufw allow https
# Habilitamos el firewall
sudo ufw enable
# Verificamos el estado del firewall
sudo ufw status verbose
Al habilitar el firewall, se le pedirá que confirme la acción. Ingrese y y presione Enter.
4. Instalación de Fail2ban
Fail2ban escanea los registros del servidor en busca de actividad sospechosa (por ejemplo, intentos fallidos de inicio de sesión SSH) y bloquea temporalmente las direcciones IP de los atacantes.
# Instalamos Fail2ban
sudo apt install fail2ban -y
# Habilitamos e iniciamos el servicio Fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Verificamos el estado
sudo systemctl status fail2ban
Fail2ban está configurado por defecto para proteger SSH. Puede crear un archivo de configuración /etc/fail2ban/jail.local para una configuración más detallada, por ejemplo:
# Creamos el archivo de configuración local de Fail2ban
sudo nano /etc/fail2ban/jail.local
# Reiniciamos Fail2ban para aplicar las nuevas reglas
sudo systemctl restart fail2ban
5. Actualización del sistema
Mantenga siempre su sistema actualizado.
# Actualizamos la lista de paquetes
sudo apt update
# Actualizamos todos los paquetes instalados
sudo apt upgrade -y
# Eliminamos paquetes y dependencias no utilizados
sudo apt autoremove -y
Su servidor está listo para la instalación de Varnish Cache y servicios relacionados.
Instalación de software — paso a paso
Diagrama: Instalación de software — paso a paso
Ahora que el servidor está preparado, procedamos con la instalación de Varnish Cache, así como Nginx (como servidor web backend) y Caddy (como frontend para terminación SSL y proxy).
1. Instalación de Nginx (servidor web backend)
Nginx escuchará en un puerto interno y entregará contenido a Varnish. Instalaremos la versión actual disponible a través de los repositorios de Ubuntu 24.04 LTS.
# Actualizamos la lista de paquetes
sudo apt update
# Instalamos Nginx (versión 1.25.x o posterior para 2026)
sudo apt install nginx -y
# Verificamos el estado de Nginx
sudo systemctl status nginx
Nginx debe estar activo (active (running)).
2. Instalación de Varnish Cache
Instalaremos Varnish Cache desde los repositorios oficiales de Ubuntu. Para 2026, se espera una versión estable de Varnish 7.x (por ejemplo, 7.4 o 7.5).
# Añadimos la clave GPG para el repositorio oficial de Varnish
sudo curl -s https://packagecloud.io/varnishcache/varnish7/gpgkey | sudo gpg --dearmor | sudo tee /usr/share/keyrings/varnishcache.gpg > /dev/null
# Añadimos el repositorio de Varnish Cache
echo "deb [signed-by=/usr/share/keyrings/varnishcache.gpg] https://packagecloud.io/varnishcache/varnish7/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/varnishcache.list
# Actualizamos la lista de paquetes para incluir el nuevo repositorio
sudo apt update
# Instalamos Varnish Cache (versión 7.4.x o posterior)
sudo apt install varnish -y
# Verificamos el estado de Varnish
sudo systemctl status varnish
Varnish también debe estar activo. Por defecto, puede estar configurado para escuchar en el puerto 6081 o 80. Cambiaremos esto en la siguiente sección.
3. Instalación de Caddy (terminador SSL y frontend)
Caddy es un servidor web moderno con HTTPS automático. Escuchará en los puertos 80 y 443, manejará SSL y reenviará las solicitudes a Varnish. Para 2026, Caddy 2.x será la versión estable principal.
# Instalamos las dependencias para Caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Añadimos la clave GPG para el repositorio de Caddy
sudo curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Añadimos el repositorio de Caddy
sudo curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# Actualizamos la lista de paquetes
sudo apt update
# Instalamos Caddy (versión 2.x)
sudo apt install caddy -y
# Verificamos el estado de Caddy
sudo systemctl status caddy
Caddy también debe estar activo.
4. Apertura de puertos en el firewall para comunicación interna
Necesitaremos abrir puertos internos para la comunicación entre Caddy, Varnish y Nginx. Varnish escuchará en el puerto 8080 y Nginx en el 8081. Estos puertos no deben ser accesibles desde el exterior.
# Permitimos los puertos internos 8080 y 8081 solo para localhost (127.0.0.1)
sudo ufw allow in on lo to any port 8080
sudo ufw allow in on lo to any port 8081
# Verificamos que las reglas se hayan aplicado
sudo ufw status verbose
Ahora todos los componentes necesarios están instalados, y podemos proceder a su configuración.
Configuración
Diagrama: Configuración
Esta sección describe la configuración paso a paso de todos los componentes: Nginx (backend), Varnish Cache y Caddy (frontend con SSL).
1. Configuración de Nginx (backend)
Nginx escuchará en el puerto interno 127.0.0.1:8081. Crearemos un nuevo archivo de configuración para su sitio.
# Создаем новый конфигурационный файл для вашего сайта
sudo nano /etc/nginx/sites-available/ваш_домен.conf
Agregue el siguiente contenido, reemplazando ваш_домен.com por su dominio real e indicando la ruta a sus archivos web (por ejemplo, /var/www/ваш_домен/html).
server {
listen 127.0.0.1:8081; # Nginx escucha solo en localhost
server_name ваш_домен.com www.ваш_домен.com;
root /var/www/ваш_домен/html; # Ruta a sus archivos
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
# Ejemplo para aplicaciones PHP
# location ~ \.php$ {
# include snippets/fastcgi-php.conf;
# fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; # Especifique la versión actual de PHP-FPM
# }
# Agregando encabezado para Varnish, para que sepa que es el backend
add_header X-Served-By $host;
}
Cree un enlace simbólico a sites-enabled y elimine la configuración predeterminada de Nginx:
# Creamos un enlace simbólico
sudo ln -s /etc/nginx/sites-available/ваш_домен.conf /etc/nginx/sites-enabled/
# Eliminamos la configuración predeterminada de Nginx
sudo rm /etc/nginx/sites-enabled/default
# Verificamos la sintaxis de la configuración de Nginx
sudo nginx -t
# Reiniciamos Nginx
sudo systemctl restart nginx
Asegúrese de que no haya errores y que Nginx se haya reiniciado correctamente.
2. Configuración de Varnish Cache
Configuraremos Varnish para que escuche en el puerto 127.0.0.1:8080 y proxy las solicitudes a Nginx en 127.0.0.1:8081.
2.1. Configuración de Systemd para Varnish
Edite el archivo de configuración de Systemd para Varnish para cambiar el puerto de escucha. En lugar de modificar /etc/default/varnish (que puede ser sobrescrito durante una actualización), usaremos un override de Systemd.
# Creamos el directorio para los archivos de override de Systemd
sudo mkdir -p /etc/systemd/system/varnish.service.d/
# Creamos el archivo de override
sudo nano /etc/systemd/system/varnish.service.d/override.conf
Agregue el siguiente contenido:
[Service]
ExecStart=
ExecStart=/usr/sbin/varnishd -a 127.0.0.1:8080 -F -f /etc/varnish/default.vcl -s malloc,2G
Aquí:
-a 127.0.0.1:8080: Varnish escuchará en el puerto 8080 solo en la interfaz local.
-f /etc/varnish/default.vcl: Indica la ruta al archivo VCL.
-s malloc,2G: Asigna 2 GB de RAM para la caché de Varnish. Ajuste este valor de acuerdo con la RAM disponible de su VPS (por ejemplo, 4G para 4GB).
Guarde y salga. Recargue la configuración de Systemd y reinicie Varnish:
# Recargamos la configuración de Systemd
sudo systemctl daemon-reload
# Reiniciamos Varnish
sudo systemctl restart varnish
# Verificamos el estado de Varnish
sudo systemctl status varnish
Asegúrese de que Varnish esté en ejecución y escuchando en 127.0.0.1:8080.
2.2. Configuración de VCL (Varnish Configuration Language)
El archivo /etc/varnish/default.vcl define la lógica de caché de Varnish. Ábralo para editar:
# Abrimos el archivo VCL
sudo nano /etc/varnish/default.vcl
Reemplace el contenido con lo siguiente. Este archivo VCL es un buen punto de partida que almacena en caché contenido estático, maneja cookies y encabezados de caché.
vcl 4.1;
# Definimos el backend (Nginx)
backend default {
.host = "127.0.0.1";
.port = "8081";
.probe = {
.url = "/health"; # Ruta para verificar la salud del backend
.interval = 5s;
.timeout = 1s;
.window = 5;
.threshold = 3;
}
}
# Procesamiento de solicitudes entrantes
sub vcl_recv {
# Eliminamos encabezados innecesarios que pueden interferir con el almacenamiento en caché
unset req.http.Cookie;
unset req.http.If-Modified-Since;
unset req.http.If-None-Match;
# Todas las solicitudes al backend se envían si el método no es GET o HEAD
if (req.method != "GET" && req.method != "HEAD") {
return (pipe); # O pass, si es necesario procesar POST/PUT/DELETE
}
# No almacenar en caché solicitudes AJAX o solicitudes a la API
if (req.url ~ "^/api/" || req.url ~ "^/ajax/") {
return (pass);
}
# No almacenar en caché solicitudes a paneles de administración
if (req.url ~ "^/admin/" || req.url ~ "^/wp-admin/" || req.url ~ "^/gitlab/admin/") {
return (pass);
}
# Intentamos almacenar en caché todo lo demás
return (hash);
}
# Procesamiento de respuestas del backend
sub vcl_fetch {
# No almacenar en caché páginas con código de error
if (beresp.status >= 500) {
return (abandon);
}
# No almacenar en caché páginas con encabezados específicos (por ejemplo, Set-Cookie)
if (beresp.http.Set-Cookie) {
return (pass);
}
# Establecemos el tiempo de vida de la caché por defecto si el backend no especificó Cache-Control
if (!beresp.http.Cache-Control && !beresp.http.Expires) {
set beresp.ttl = 1h; # Almacenar en caché 1 hora por defecto
}
# Eliminamos las cookies para los objetos en caché para evitar problemas de personalización
unset beresp.http.Set-Cookie;
# Agregamos el encabezado X-Varnish para depuración
set beresp.http.X-Varnish = regsub(server.identity, "\(([^)]+)\)", "");
return (deliver);
}
# Procesamiento de respuestas de Varnish al cliente
sub vcl_deliver {
# Agregamos un encabezado indicando que el objeto fue entregado desde la caché
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
set resp.http.X-Cache-Hits = obj.hits;
unset resp.http.Via; # Eliminamos el encabezado Via
return (deliver);
}
Guarde y salga. Ahora verifique el archivo VCL en busca de errores de sintaxis y reinicie Varnish:
# Verificamos la sintaxis de VCL
sudo varnishd -C -f /etc/varnish/default.vcl
# Reiniciamos Varnish
sudo systemctl restart varnish
Para el correcto funcionamiento de la verificación del backend (.probe), agregue una ubicación para /health en su configuración de Nginx (/etc/nginx/sites-available/ваш_домен.conf):
No olvide reiniciar Nginx después de este cambio: sudo systemctl restart nginx.
3. Configuración de Caddy (terminador SSL y frontend)
Caddy escuchará en los puertos 80 y 443, obtendrá automáticamente certificados SSL y proxy las solicitudes a Varnish en 127.0.0.1:8080.
# Abrimos el archivo de configuración de Caddy
sudo nano /etc/caddy/Caddyfile
Reemplace el contenido con lo siguiente, especificando su dominio:
ваш_домен.com {
# HTTPS automático (Let's Encrypt)
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Ejemplo para Cloudflare DNS API. Use HTTP-challenge u otro proveedor de DNS.
}
# Proxy todas las solicitudes a Varnish
reverse_proxy 127.0.0.1:8080 {
# Pasamos la IP real del cliente
header_up X-Forwarded-For {remote_host}
header_up X-Real-IP {remote_host}
header_up Host {host}
# Pasamos la información de HTTPS
header_up X-Forwarded-Proto {scheme}
}
# Habilitamos la compresión Gzip (si Varnish no lo hace por sí mismo)
encode gzip zstd
# Registro
log {
output file /var/log/caddy/access.log
}
}
Nota importante sobre TLS: El ejemplo utiliza DNS-challenge para Let's Encrypt con Cloudflare. Si no usa Cloudflare o prefiere HTTP-challenge, elimine la línea dns cloudflare {env.CLOUDFLARE_API_TOKEN}. Caddy intentará automáticamente usar HTTP-challenge si el puerto 80 está disponible.
Si utiliza DNS-challenge, cree el archivo /etc/caddy/.env para almacenar el token de API de Cloudflare:
# Creamos el directorio para el archivo .env
sudo mkdir -p /etc/caddy
# Creamos el archivo .env
sudo nano /etc/caddy/.env
Agregue su token de API:
CLOUDFLARE_API_TOKEN=ВАШ_CLOUDFLARE_API_ТОКЕН
Asegúrese de que los permisos del archivo .env estén restringidos:
# Establecemos permisos solo para el propietario
sudo chmod 600 /etc/caddy/.env
# Establecemos el propietario Caddy
sudo chown caddy:caddy /etc/caddy/.env
Guarde Caddyfile y .env. Verifique la sintaxis de Caddy y reinícielo:
# Verificamos la sintaxis de Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
# Reiniciamos Caddy
sudo systemctl restart caddy
# Verificamos el estado de Caddy
sudo systemctl status caddy
Asegúrese de que Caddy esté en ejecución y haya obtenido los certificados SSL correctamente.
4. Verificación de funcionamiento
Después de configurar todos los componentes, nos aseguraremos de que todo funcione correctamente.
# Verificamos la disponibilidad del sitio a través de Curl
curl -I https://ваш_домен.com
En los encabezados de respuesta, debería ver:
HTTP/2 200 (o HTTP/1.1 200)
server: Caddy
x-cache: MISS (en la primera solicitud)
x-cache-hits: 0 (en la primera solicitud)
Repita la solicitud varias veces:
# Solicitud repetida a través de Curl
curl -I https://ваш_домен.com
Ahora debería ver:
x-cache: HIT
x-cache-hits: 1 (o más, si hubo muchas solicitudes)
Esto confirma que Varnish está almacenando el contenido en caché correctamente. También puede usar varnishlog y varnishstat para monitorear Varnish:
# Ver registros de Varnish en tiempo real
sudo varnishlog
# Estadísticas de Varnish
sudo varnishstat
Presione Ctrl+C para salir de varnishlog/varnishstat.
Copias de seguridad y mantenimiento
Diagrama: Copias de seguridad y mantenimiento
Las copias de seguridad regulares y el mantenimiento oportuno son cruciales para la estabilidad y seguridad de su sitio web que funciona con Varnish Cache.
1. Qué respaldar
Para Varnish Cache y la infraestructura asociada, es necesario respaldar los siguientes elementos:
Archivos de configuración de Varnish:
/etc/varnish/default.vcl (archivo VCL principal)
/etc/systemd/system/varnish.service.d/override.conf (configuración de Systemd)
Archivos de configuración del servidor web (Nginx):
/etc/nginx/nginx.conf
/etc/nginx/sites-available/su_dominio.conf
/etc/nginx/sites-enabled/ (enlaces simbólicos)
Archivos de configuración de Caddy:
/etc/caddy/Caddyfile
/etc/caddy/.env (si se usa)
/var/lib/caddy/.local/share/caddy/ (certificados Let's Encrypt, si no se usan plugins DNS)
Archivos del sitio web: Todo el contenido de su sitio web (HTML, CSS, JS, imágenes, scripts PHP, etc.), generalmente ubicado en /var/www/su_dominio/html.
Base de datos: Si su sitio utiliza una base de datos (MySQL, PostgreSQL), asegúrese de hacer un volcado de la misma.
Configuraciones del sistema:/etc/ssh/sshd_config, /etc/ufw/, /etc/fail2ban/.
2. Script simple de copia de seguridad automática
Puede usar un script simple de bash en combinación con cron para crear archivos automáticamente. Para el almacenamiento, puede usar rsync para copiar a otro servidor o restic/borg para copias de seguridad deduplicadas y cifradas en un almacenamiento compatible con S3.
Ejemplo de un script simple para crear archivos (/usr/local/bin/backup_script.sh):
#!/bin/bash
# Configuración
BACKUP_DIR="/var/backups/webserver"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
WEB_ROOT="/var/www/su_dominio/html"
NGINX_CONF="/etc/nginx"
VARNISH_CONF="/etc/varnish"
CADDY_CONF="/etc/caddy"
DB_NAME="su_base_de_datos" # Reemplace con el nombre de su BD
DB_USER="su_usuario_bd" # Reemplace con el usuario de la BD
DB_PASS="su_contraseña_bd" # Reemplace con la contraseña de la BD
MYSQL_CMD="/usr/bin/mysqldump" # O pg_dump para PostgreSQL
# Creamos el directorio para las copias de seguridad si no existe
mkdir -p $BACKUP_DIR
# 1. Copia de seguridad de archivos web
echo "Creando copia de seguridad de archivos web..."
tar -czf $BACKUP_DIR/web_files_$DATE.tar.gz $WEB_ROOT
# 2. Copia de seguridad de configuraciones de Nginx
echo "Creando copia de seguridad de configuraciones de Nginx..."
tar -czf $BACKUP_DIR/nginx_config_$DATE.tar.gz $NGINX_CONF
# 3. Copia de seguridad de configuraciones de Varnish
echo "Creando copia de seguridad de configuraciones de Varnish..."
tar -czf $BACKUP_DIR/varnish_config_$DATE.tar.gz $VARNISH_CONF /etc/systemd/system/varnish.service.d/override.conf
# 4. Copia de seguridad de configuraciones de Caddy
echo "Creando copia de seguridad de configuraciones de Caddy..."
tar -czf $BACKUP_DIR/caddy_config_$DATE.tar.gz $CADDY_CONF /var/lib/caddy/.local/share/caddy/
# 5. Copia de seguridad de la base de datos (ejemplo para MySQL)
if [ -n "$DB_NAME" ]; then
echo "Creando copia de seguridad de la base de datos..."
$MYSQL_CMD -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/database_$DATE.sql.gz
fi
# Eliminando copias de seguridad antiguas (más de 7 días)
echo "Eliminando copias de seguridad antiguas..."
find $BACKUP_DIR -type f -name ".tar.gz" -o -name ".sql.gz" -mtime +7 -delete
echo "Copia de seguridad completada."
Nunca almacene las copias de seguridad en el mismo servidor que los datos originales. Esto es inútil en caso de fallo del disco o compromiso del servidor.
Almacenamiento externo compatible con S3: Amazon S3, DigitalOcean Spaces, Backblaze B2. Esta es una opción económica y fiable. Use restic o borgbackup para el cifrado y la deduplicación.
VPS separado: Un VPS pequeño y económico en otra ubicación, destinado exclusivamente al almacenamiento de copias de seguridad. Use rsync por SSH.
Almacenamiento local en su máquina: Para proyectos pequeños, puede descargar periódicamente las copias de seguridad a su ordenador.
4. Actualizaciones: rolling vs maintenance window
Mantener el software actualizado es importante para la seguridad y el rendimiento.
Actualizaciones de SO y paquetes (Ubuntu, Nginx, Caddy, Varnish):
Rolling updates: Para sistemas no críticos o en un entorno de prueba, se pueden configurar actualizaciones de seguridad automáticas. Sin embargo, para servidores de producción, se recomienda la actualización manual con pruebas previas.
Maintenance window (ventana de mantenimiento): Planifique ventanas de mantenimiento regulares (por ejemplo, una vez al mes) durante el tiempo de menor actividad. Antes de aplicar las actualizaciones, haga una copia de seguridad.
Actualización de Varnish:
Las versiones principales de Varnish (por ejemplo, de 6.x a 7.x) pueden requerir la adaptación del archivo VCL debido a cambios en la sintaxis o la API. Lea atentamente el changelog.
Las actualizaciones menores (7.4.0 a 7.4.1) suelen ser retrocompatibles y seguras.
# Actualización del sistema
sudo apt update && sudo apt upgrade -y
# Reinicio de servicios, si fueron actualizados
sudo systemctl restart nginx caddy varnish
Siempre verifique la funcionalidad del sitio después de cualquier actualización.
Solución de problemas + Preguntas frecuentes
Esta sección recopila problemas típicos y preguntas frecuentes que pueden surgir al trabajar con Varnish Cache.
Error: Varnish no almacena contenido en caché (X-Cache: MISS)
Qué verificar: Asegúrese de que Varnish esté configurado correctamente y reciba las solicitudes. Verifique su archivo VCL (/etc/varnish/default.vcl) en busca de reglas que puedan provocar un salto de caché (return (pass) o return (pipe)). A menudo, la causa son los encabezados Set-Cookie, Cache-Control: private o solicitudes con un método diferente a GET/HEAD. Use sudo varnishlog para analizar las solicitudes y respuestas.
Cómo solucionarlo: Optimice el archivo VCL. Si el Set-Cookie es enviado por el backend, considere eliminarlo para los objetos en caché en vcl_fetch. Verifique que su backend (Nginx) no envíe encabezados que prohíban el almacenamiento en caché. Asegúrese de que no haya Cache-Control: no-cache o no-store para las páginas en caché.
Error: El sitio no está disponible o muestra un error 502 Bad Gateway
Qué verificar: Esto indica un problema con la conexión de Varnish al backend (Nginx) o de Caddy a Varnish. Verifique los registros de Caddy (sudo journalctl -u caddy --since "5 minutes ago"), Varnish (sudo varnishlog) y Nginx (sudo tail -f /var/log/nginx/error.log). Asegúrese de que todos los servicios (Caddy, Varnish, Nginx) estén en ejecución y escuchando en los puertos correctos (Caddy: 80/443, Varnish: 127.0.0.1:8080, Nginx: 127.0.0.1:8081). Verifique las reglas del firewall (UFW) para detectar el bloqueo de puertos internos.
Cómo solucionarlo: Reinicie los servicios en el orden correcto: primero Nginx, luego Varnish, luego Caddy. Asegúrese de que /etc/caddy/Caddyfile especifique la dirección correcta de Varnish (127.0.0.1:8080), y que /etc/varnish/default.vcl especifique la dirección correcta de Nginx (127.0.0.1:8081). Verifique override.conf para Varnish para asegurarse de que esté escuchando en el puerto 8080.
Error: Problemas con los certificados SSL (Caddy)
Qué verificar: Verifique los registros de Caddy. Si Caddy no puede obtener un certificado Let's Encrypt, esto podría deberse a errores en los registros DNS, al bloqueo del puerto 80/443 por el firewall o a una configuración incorrecta del desafío DNS (si se usa). Asegúrese de que su dominio apunte a la dirección IP del servidor.
Cómo solucionarlo: Asegúrese de que los puertos 80 y 443 estén abiertos en UFW. Verifique los registros A/AAAA de su dominio. Si usa el desafío DNS, asegúrese de que el token de API esté especificado correctamente y tenga los permisos necesarios. Deshabilite temporalmente el desafío DNS en Caddyfile e intente el desafío HTTP (asegúrese de que el puerto 80 esté abierto).
¿Qué configuración mínima de VPS es adecuada para Varnish Cache?
Para un sitio web pequeño con tráfico moderado, un VPS con 1 núcleo de CPU, 1-2 GB de RAM y 20-40 GB de disco NVMe/SSD será suficiente. Esto es suficiente para el funcionamiento de Varnish, el servidor web y el sistema operativo. Sin embargo, para obtener una mejora notable en el rendimiento y la capacidad de almacenar más contenido en la memoria caché, se recomiendan 2-4 GB de RAM.
¿Qué elegir — VPS o dedicado para esta tarea?
Para la mayoría de los proyectos medianos y grandes, un VPS será una excelente opción, ofreciendo un buen equilibrio entre rendimiento y costo. Un servidor dedicado solo es necesario en casos de carga muy alta (cientos de millones de solicitudes al mes), cuando se requiere almacenar cientos de gigabytes de datos en la memoria caché, o cuando existen requisitos estrictos de aislamiento de hardware y equipo específico. Comience con un VPS y escale a un dedicado si surge una necesidad real.
¿Por qué Varnish no almacena en caché las páginas para usuarios autenticados?
Qué verificar: Por defecto, Varnish evita almacenar en caché páginas que contienen cookies (Cookie en la solicitud, Set-Cookie en la respuesta) para evitar mostrar contenido personalizado a otros usuarios. Este es un comportamiento estándar, orientado a la seguridad y la corrección.
Cómo solucionarlo: Si necesita almacenar en caché páginas con cookies, debe eliminar explícitamente el encabezado Cookie de la solicitud en vcl_recv para URL o tipos de contenido específicos, así como Set-Cookie de la respuesta en vcl_fetch. Esto requiere una configuración muy cuidadosa de VCL para no romper la funcionalidad del sitio (por ejemplo, inicio de sesión, carrito de compras). Considere usar Edge Side Includes (ESI) para partes dinámicas de las páginas.
¿Cómo limpiar la caché de Varnish?
Qué verificar: Varnish ofrece varias formas de limpiar la caché. La más sencilla es reiniciar el servicio, pero esto borrará toda la caché. Métodos más granulares incluyen el uso de solicitudes HTTP PURGE o BAN.
Cómo solucionarlo:
Reinicio de Varnish:sudo systemctl restart varnish (borra toda la caché).
PURGE (limpieza de una URL específica): Agregue reglas en VCL para manejar el método PURGE. Por ejemplo, en vcl_recv:
if (req.method == "PURGE") {
if (!client.ip ~ "127.0.0.1") { # Permitir PURGE solo desde localhost
return (synth(403, "Forbidden"));
}
return (hash);
}
sub vcl_hit {
if (req.method == "PURGE") {
return (synth(200, "Purged"));
}
}
sub vcl_miss {
if (req.method == "PURGE") {
return (synth(200, "Purged"));
}
}
Después de esto, puede usar: curl -X PURGE http://127.0.0.1:8080/path/to/page.
BAN (limpieza por patrón): También requiere configuración en VCL. Permite eliminar de la caché todos los objetos que coincidan con una expresión regular (por ejemplo, todas las páginas que comienzan con /blog/).
Conclusiones y próximos pasos
Diagrama: Conclusiones y próximos pasos
¡Felicidades! Ha instalado y configurado Varnish Cache con éxito en su VPS, integrándolo con Caddy para la terminación SSL y Nginx como backend. Su sitio web ahora funciona significativamente más rápido y el servidor es capaz de soportar una mayor carga gracias al almacenamiento en caché eficiente. También ha sentado las bases para una infraestructura segura y mantenible con un firewall, Fail2ban y un sistema de copia de seguridad.
Ahora que la configuración básica está completa, puede considerar los siguientes pasos para optimizar y desarrollar aún más su proyecto:
Ajuste fino de VCL: Explore la documentación de Varnish VCL para adaptar las reglas de caché a las necesidades específicas de su aplicación. Esto puede incluir el almacenamiento en caché por tipos de usuario, el uso de Edge Side Includes (ESI) para el almacenamiento en caché fragmentado o reglas más complejas para la purga de caché.
Monitoreo y análisis: Configure herramientas de monitoreo, como Prometheus + Grafana, para rastrear las métricas de Varnish (hits, misses, backend health), Nginx, Caddy y el rendimiento general del servidor. Esto ayudará a identificar cuellos de botella y optimizar el funcionamiento.
Escalabilidad: Si su tráfico continúa creciendo, considere la escalabilidad horizontal, agregando varios servidores Varnish o migrando a una CDN para la distribución global de contenido.
¿Te fue útil esta guía?
Tus comentarios nos ayudan a mejorar nuestras guías.
Compartir esta publicación:
Envía esta guía a alguien a quien pueda resultarle útil.