Forzar la caché Varnish en LWS

Procédure

En esta documentación, vamos a explicarle paso a paso cómo obligar a Varnish y a los navegadores a conservar sus recursos en caché, incluso cuando estos envían solicitudes Pragma: no-cache o Cache-Control: no-cache.

1. Contexto y arquitectura LWS

Las ofertas de alojamiento compartido y cPanel/VPS gestionados de LWS se basan en la pila:

Navegador ⇄ NGINX (SSL + HTTP/2) ⇄ Varnish Cache ⇄ Apache/PHP-FPM

  • NGINX gestiona TLS y comprime los contenidos.
  • Varnish (Fastest Cache) se sitúa como proxy inverso para almacenar en memoria las respuestas HTTP.
  • Apache o PHP-FPM generan la respuesta final cuando Varnish no tiene un HIT.

Cuando todo está correctamente configurado, Varnish puede entregar hasta 1000 veces más rápido que un acceso directo a PHP, al tiempo que alivia la CPU del servidor.

2. Recordatorio: ¿cómo decide Varnish poner en caché?

Elemento Impacto sobre la caché Cómo influir en él
Método Solo GET y HEAD son elegibles Evitar los POST para las páginas públicas
Encabezados de respuesta Cache-Control, Expires, Pragma Determinan la duración y el alcance Ajustar vía .htaccess (ver §3)
Cookies / Set-Cookie Una cookie presente = no hay caché por defecto Eliminar o neutralizar las cookies innecesarias
Status HTTP 200, 203, 301, 302, 404, 410 son almacenables en caché Sin acción, ¡pero evitar los 500!

Trucs et astuces


Varnish ignora por defecto el Cache-Control: no-cache enviado por el navegador para los archivos estáticos, pero respeta la "revalidation logic" si el objeto ya está en caché.

3. Controlar la duración de vida mediante .htaccess

Active el módulo mod_headers (es el caso por defecto en LWS) y luego coloque el siguiente snippet donde quiera:

⌨ Comando

  Header set Cache-Control "public, max-age=3600, s-maxage=3600, stale-while-revalidate=60, stale-if-error=86400"
  Header set Expires "Thu, 31 Dec 2037 23:55:55 GMT"
  • max-age : duración (en segundos) en el navegador.
  • s-maxage : duración específica para las cachés compartidas (Varnish/CDN).
  • stale-while-revalidate : permite a Varnish servir un contenido caducado mientras lo actualiza en segundo plano.
  • stale-if-error : sirve la versión caducada si el backend responde con error (fail-safe).

3.1. Objetivo por carpeta

Colocar el mismo archivo .htaccess en la carpeta "/images/" aplica la regla únicamente a la carpeta "images".

3.2. Objetivo por extensión

⌨ Comando

  
    Header set Cache-Control "public, max-age=2592000, s-maxage=2592000, immutable"
  

immutable : indica al navegador que no es necesaria ninguna revalidación mientras el objeto no haya expirado; ideal para los archivos versionados (style.483bf.css).

3.3. Caché corta para HTML

⌨ Comando

  Header set Cache-Control "public, max-age=300, s-maxage=600, must-revalidate"

Expira después de 5 min del lado del cliente y 10 min del lado de Varnish, y luego revalidación obligatoria.

4. Escenarios concretos de uso

Caso real Fragmento de .htaccess ¿Por qué?
Landing page actualizada cada hora max-age=600, s-maxage=1200 Los visitantes tienen datos «casi en tiempo real» sin saturar PHP
CSS/JS versionados max-age=31536000, immutable Tráfico casi nulo en el servidor, carga instantánea
Imágenes de productos e-commerce max-age=604800 Reduce el TTFB, acelera el catálogo
Back-office / wp-admin no-store, private Evita poner datos sensibles en la caché compartida

5. Vaciar o invalidar la caché

Desde su hosting (script PHP de su sitio, tarea Cron o terminal SSH), la purga de la caché Varnish no requiere ningún token:

  • Una página :
⌨ Comando
curl -X PURGE https://exemple.com/chemin/ressource.jpg
  • Todo un directorio, mediante expresión regular :
⌨ Comando
curl -X PURGE -H 'X-Purge-Method: regex' 'https://exemple.com/images/.*'
  • Todo el sitio :
⌨ Comando
curl -X FULLPURGE https://exemple.com
  • En PHP, por ejemplo después de actualizar un contenido :
Código
$ch = curl_init('https://exemple.com/chemin/page.html');
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => 'PURGE', CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20]);
curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 200 : purga de caché ; 405 : purga rechazada
curl_close($ch);

Un script completo, listo para una tarea Cron, se propone en la ayuda Acelerar la velocidad de su sitio con Fastest Cache. También puede vaciar la caché desde su panel, con el botón «Vaciar la caché» de Fastest Cache.

6. Probar y depurar

⌨ Comando
curl -I https://exemple.com/style.css

Observe:

  • Age: 356 → Varnish ha servido una respuesta con una antigüedad de 356 s.
  • Cache-Control: public, max-age=2592000, s-maxage=2592000, immutable
  • X-Cache: HIT (o MISS).

Con Chrome/Edge: DevTools > Network > Disable cache puede simular a un primer visitante.

7. Errores comunes

  1. Cookies innecesarias : muchos temas de WordPress colocan una cookie incluso para las páginas públicas. Elimínelas o desactívelas mediante functions.php.
  2. Cadenas de consulta : por defecto, ?v=123 crea una nueva entrada en la caché. Mejor versionar en el nombre del archivo.
  3. Contenido sensible : formularios, páginas de área de cliente ➡ no-store, private, max-age=0.
  4. Compresión Brotli/Gzip : actívelas antes de la capa Varnish para evitar una doble caché.

8. Buenas prácticas resumidas

  • Utilice s-maxage ⩾ max-age para conservar una caché proxy más larga que la del navegador.
  • Coloque immutable en cualquier archivo cuyo nombre contenga un hash.
  • No mezcle Expires obsoleto con max-age salvo para navegadores antiguos.
  • Documente sus TTL en un archivo CACHE_POLICY.md para el equipo.

9. Recursos útiles

✅ ¡Su caché Varnish está ahora bajo control!

help.lws.net/a/1949
¿Le ha resultado útil este artículo?

Sí

No

Leído 7 648 veces

¡Gracias! No dude en hacer preguntas sobre nuestra documentación si desea más información y ayudarnos a mejorarla.

Artículos similares

¿Tiene una pregunta sobre este artículo?

Hágala al equipo de LWS y a la comunidad. La respuesta se publica tras la moderación.

Formule una pregunta al equipo de LWS y a su comunidad

RGPD: Responsable: LWS-Ligne Web Services. Finalidad: moderación y publicación pública de su pregunta, posible aviso de una respuesta. Base jurídica: consentimiento (art. 6.1.a RGPD). Conservación de los correos: 90 días tras el aviso, 12 meses como máximo sin respuesta. Para ejercer sus derechos, consulte la sección RGPD de nuestras condiciones generales.