Cómo configurar Varnish para almacenar en caché los sitios Magento 2

servidor de barniz es una aplicación de almacenamiento en caché especial. Podrías instalarlo antes que cualquier servidor web y aceleraría significativamente el tiempo hasta el primer byte (TTFB).

Varnish es una solución de almacenamiento en caché recomendada para sitios web de comercio electrónico Magento 2.

En este artículo te mostraré cómo configurarlo y configurarlo correctamente. Usaremos una máquina Debian 12 Bookworm como referencia, pero las instrucciones podrían aplicarse a un sistema operativo diferente.

El barniz es una gran herramienta para optimizar la velocidad de Magento 2. Este es un tutorial para mostrarle cómo optimizar la velocidad de Magento con Varnish. Aunque existen muchos más métodos y formas de optimizar la velocidad de tu Magento 2. Algunos servicios como el vinculado anteriormente hacen todas esas optimizaciones por usted, no solo configuran Varnish, que es solo la punta del iceberg.

Usaré Nginx y Magento 2.4.6p3 y serviré todo a través de HTTPS.

Índice de contenidos
  1. Instalación en Debian
  2. Conectándolo a Magento 2
  3. Configuración de Nginx
  4. Confirmación

Instalación en Debian

En primer lugar, necesitamos instalar algunos paquetes:

$ apt-get update
$ apt-get install varnish

Una vez que se complete la instalación, barniz escuchará en un puerto predeterminado 6081:

$ ps aux | grep varnish
vcache   2767358  0.1  0.0  18828 10936 ?        SLs  17:44   0:00 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
vcache   2767373  0.6  0.2 292948 142080 ?       SLl  17:44   0:00 /usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
varnish+ 2767589  0.2  0.0  86152  1280 ?        Ss   17:44   0:00 /usr/bin/varnishncsa -a -w /var/log/varnish/varnishncsa.log -D -P /run/varnishncsa/varnishncsa.pid

Conectándolo a Magento 2

Necesitamos realizar algunos cambios de configuración en nuestra tienda de comercio electrónico:

Vaya al panel backend > Tiendas > Configuración > Avanzado > Sistema > Caché de página completa y configure Aplicación de almacenamiento en caché en Barniz (recomendado). Haga clic en un botón Guardar.

Luego expandiremos la pestaña Configuración de Varnish y exportaremos el archivo VCL para su versión. Nuestra versión es la 7:

$ varnishd -V
Varnishd (varnish-7.1.1)

Estamos ejecutando Magento 2.4.6p3 que admite Varnish 7 aunque no hay ningún botón Varnish 7 🙂

Continuaremos y descargaremos un archivo VCL de Varnish 6.

Importante: En el archivo descargado necesitamos hacer un cambio. Alrededor de la línea 13 cambiaremos una URL de sonda:

    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = { 
-        .url = "/pub/health_check.php";
+       .url = "/health_check.php";
        .timeout = 2s;

Sin ese cambio, Varnish solicitará pub/health_check.php, obtendrá 404 (página no encontrada), pensará que Magento no está disponible y mostrará una página de error 503 como esta:

Continúe, haga ese cambio y guarde el archivo como barniz6_edited.vlc.

A continuación, reemplazamos el VCL predeterminado con nuestro archivo personalizado y reiniciamos Varnish:

$ cp varnish6_edited.vcl /etc/varnish/default.vcl
$ /etc/init.d/varnish restart

Ahora el servidor Varnish se está ejecutando y escuchando en el puerto 6081 (de forma predeterminada) las solicitudes entrantes.

Configuración de Nginx

Un sitio de comercio electrónico debe estar bajo HTTPS en todo momento. Vanish no puede escuchar en el puerto 443, por lo que debemos mantener un servidor web que acepte solicitudes.

Un diagrama de nuestra configuración será algo como esto:

Usuario -> Servidor web (nginx en nuestro caso) escuchando 443 -> Varnish -> Magento (ejecutándose como un host nginx virtual en el puerto 8080)

Importante: solicitaremos Magento a través del puerto 8080, pero debemos hacerle creer que es 443 (SSL). Por ese motivo pasaremos una variable especial HTTPS = on:

    fastcgi_param HTTPS on

Este paso es importante, sin esa variable obtendrás un error de redireccionamiento indefinido como este:

Tomemos un archivo nginx.conf.sample predeterminado que viene con cada instalación de Magento 2 y edítelo alrededor de la línea 207 (agregamos una variable HTTPS):

location ~ ^/(index|get|static|errors/report|errors/404|errors/503|health_check)\.php$ {
    try_files $uri =404;
    fastcgi_pass   fastcgi_backend;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param  PHP_FLAG  "session.auto_start=off \n suhosin.session.cryptua=off";
    fastcgi_param  PHP_VALUE "memory_limit=756M \n max_execution_time=18000";
+  fastcig_param HTTPS on;
    fastcgi_read_timeout 600s;
    fastcgi_connect_timeout 600s;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Ahora lo guardamos en nginx.conf.edited.

A continuación configuramos un servidor Nginx:

# This is the main entry, a browser request comes here and gets forwarded to Varnish
server {
    listen 443 http2;
    ssl on; 
    server_name yourdomain.com;
    ssl_certificate /etc/nginx/ssl/latest-cert.crt;
    ssl_certificate_key /etc/nginx/ssl/www-new.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    location / { 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:6081;
        proxy_http_version 1.1;
    }   
}

# Here comes a request from Varnish if a page wasn’t found in its cache. We need to run 
# Magento code and render a page. nginx.conf.edited file is the same file we edited above.

server {
    listen 8080;
   port_in_redirect off;
   set $MAGE_ROOT /var/yoursitefolder;
  Include /var/yoursitefolder/nginx.conf.edited;
}

Ahora reiniciemos nginx y todo debería funcionar.

$ /etc/init.d/nginx restart

Confirmación

Verifiquemos que Varnish esté almacenando en caché nuestras páginas.

Abra Google Chrome, solicite una página de inicio varias veces, vaya a Herramientas para desarrolladores/Red y verifique los encabezados de la página. Deberías ver un resultado:

También puede iniciar el registro de barniz y ver las solicitudes de páginas:

$ varnishlog

…..
*   << Request  >> 3964957
-   Begin          req 3964956 rxreq
-   Timestamp      Start: 1708119375.564378 0.000000 0.000000
-   Timestamp      Req: 1708119375.564378 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       127.0.0.1 46430 a0
-   ReqMethod      GET
-   ReqURL         /dummypage

Si tiene alguna pregunta, no dude en dejar un comentario o contactarme directamente.

Te podría interesar...

Deja una respuesta

Subir