VARNISH. Cache y Geo Localización

Laura Trejo
TechWo
Published in
6 min readNov 1, 2018

Este post está basado en la plática que presenté durante Mage Titan Austin 2018 que a su vez está basado en mi día a día.

¿Qué es Varnish?

Varnish Cache es un acelerador de aplicaciones web, también conocido como caché de proxy HTTP inverso. Se instala delante de cualquier servidor HTTP y se configura para almacenar en el caché del servidor una copia del recurso solicitado. Está ideado para aumentar el rendimiento de aplicaciones web con contenidos pesados y APIs altamente consumidas.

Es una alternativa a otras opciones existentes que plantean caché de cliente o servidores de origen. Además Varnish Cache está orientado exclusivamente a HTTP a diferencia de otros que ofrecen soporte FTP, SMTP u otros protocolos de red.

¿Qué beneficios tiene en Magento?

Magento instance with Varnish

Varnish será colocado intermedio entre los request que lleguen a Magento desde el navegador del usuario. Si el recurso solicitado existe en su memoria lo regresa al usuario, si no existe va y consulta a Magento por la copia del contenido. Creando una menor carga en el servidor y una sensación de mayor rapidez en la carga del contenido.

Tipo de Contenido

Para continuar debemos conocer el tipo de contenido que Magento puede generar:

Contenido Público:
Todo contenido que sea independiente al usuario y que está presente en el frente de la tienda es considerado como tal. Ejemplo: Header, footer, listado de categorías, etc.

Contenido Privado:
Todo contenido que contenga información sobre un usuario es considerado como tal. Ejemplo: Mi cuenta, carrito de compras, nombre de usuario, libreta de direcciones.

Bonus:
Dentro del código de Magento en los archivos de layout puede existir una marca cachable=false que puede volver todo el contenido de cualquier página como privado. Volveremos a ésta más tarde.

Tipos de contenido en Magento

En este ejemplo, del lado izquierdo tenemos un sitio web que solo nos muestra contenido público, todos los usuarios que entren a nuestro sitio verán el mismo contenido. Del lado derecho en cambio, tenemos un sitio donde el usuario ya ha iniciado sesión e incluso ha enviado productos a su carrito de compras, razón por la cual el contenido se vuelve privado.

VCL: Varnish Configuration Language

VCL es el lenguaje utilizado para crear los archivos de configuración en Varnish que nos permitirá darle un trato específico a cada uno de los request que suceden en Magento.

VCL es muy similar en sintaxis con C y Pearl. Los bloques se delimitan con llaves y las instrucciones terminan con punto y coma. Aparte de la sintaxis podemos encontrar el uso de operadores lógicos y de comparación.

Ejemplo de archivo de configuración de VCL

ESI Tags
Edge-Side Include

Es un estándar web propuesto originalmente por Akamai y Oracle entre otras compañías. Su razón de ser es poder juntar el contenido de varias URL y presentarlo en una sola vista.

La teoría nos dice que podemos tener ESI tags dentro de nuestro código de la página web que corresponda a las secciones con contenido privado. Así podríamos mantener el resto del contenido dentro del caché y obtener el máximo rendimiento del sitio.

ESI Tags FTW

¿Y entonces por qué no es tan popular?

Suena a ser la solución de nuestros problemas y sin embargo no es el estándar en nuestros sitios.

Utilizar Varnish trae consigo varios y nada pequeños retos:

  1. Varnish no soporta el protocolo de SSL.

2. En conjunto con Varnish, borrar manualmente el directorio de /var/cache/ en tu instancia de Magento te exige un reboot completo de todo el ambiente.

3. Mostrar el sitio con errores 503 Service Unavailable en caso de un error en los archivos .vcl

4. Hay que cuidar nuestro código y el de terceros de que no contenga el metatag cachable=false. De ser así el caché de toda la página se vuelve privado.

¿Cómo lo resolvemos?

Tenemos dos maneras de resolver estos conflictos: Acudiendo a contratar el servicio de 3ros o creando tu propia implementación.

Servicios de terceros.

Proveedores de cache con Varnish para Magento

Ambos servicios se han especializado en el último año en llevar a las tiendas de Magento a ser súper rápidas y resolviendo los principales problemas que se presentan.

Comparativa de servicios

¡Por supuesto que esto nos deja limitados a las funciones que ellos nos puedan ofrecer y nos quita la diversión de implementar nuestra propia solución!

Geo Localización

Ambos servicios nos proveen un servicio de geo localización, pero este se limita a cargar el frente de una tienda dependiendo de donde provenga la petición.

Aquí es el momento de tomar la implementación en nuestras manos y hacer todo lo que nos venga en gana. Para eso vamos a usar Nginx:

https://nginx.org/en/

Nginx mejor conocido como el némesis de Apache a la hora de elegir el servidor web sirve para mucho más que eso. Nginx nos puede servir como:

  • Web Server
  • Load Balancer
  • Content Cache
  • Api Gateway
  • Proxy Reverse
  • Web Application Firewall

¿Dónde lo ponemos y para qué nos sirve?

¿Recuerdan que unos de los problemas principales de Varnish es que no sabe manejar el protocolo de SSL? tener una tienda que no use SSL es impensable y fuera de los estándares de la industria.

Nginx + Varnish

Vamos a usar NGINX para procesar todos los request que entren a nuestra página. Los que lleguen al puerto 80 pueden pasar directo a Varnish, los que lleguen al puerto 443 serán desencriptados por NGINX, enviados a Varnish , una vez obtenido el resultado este será encriptado de nuevo y enviado al navegador.

Tener NGINX como parte de nuestra infraestructura también nos permitirá tener acceso a los datos de Geo Localización de nuestro request. Para lograrlo es necesario tener instalado y habilitado el módulo :

Esté módulo está disponible desde la version 0.8.6 en adelante y hará presente los valores de geo localización que correspondan a la IP de donde se genere el request. Para lograrlo, se hace uso de la base de datos de MaxMind.

Para habilitarlo es necesario compilar NGINX con el comando — with-http_geoip_module.

nginx -v

Dentro de la configuración default de Nginx haremos visibles las variables para nuestro entorno.

Algunos ejemplos de la información que tenemos disponible es:

$geoip_country_code
two-letter country code, for example, “RU”, “US”.

$geoip_country_code3
three-letter country code, for example, “RUS”, “USA”.

$geoip_country_name
country name, for example, “Russian Federation”, “United States”.

Cómo te puedes dar cuenta el código de dos letras es igual al que Magento usa para hacer referencia al listado de países.

Cuando juntamos todo

Formula final.

En nuestro sitio tendremos ESI tags para delimitar el contenido que no es cachable, este contenido será obtenido desde las URL que genera el tag y después inyectado en el DOM de nuestra página.

Magento puede procesar esas URL en un controlador de frontend y generar el bloque asociado a nuestro país, idioma o moneda deseada.

Ejemplo de bloque estático geo localizado.

Esto es un proyecto en proceso de ser mejorado, aún seguimos encontrando cosas que pueden hacerse mejor y más eficiente, conforme progrese les mantendré informados :D

Recursos

https://devdocs.magento.com/guides/v2.0/config-guide/varnish/config-varnish-install.html

https://www.section.io/blog/magento-performance-magento-varnish-cache/

http://www.sivaschenko.com/apache-ssl-termination-https-varnish-cache/

https://tiennhan.com/varnish-cache-key-fly-high-site/

https://endertech.com/blog/edge-computing-fastly-cdn-varnish-vcl-authenticated-requests

https://www.eschrade.com/page/magento-esi-varnish-and-performance/

https://www.smashingmagazine.com/2015/02/using-edge-side-includes-in-varnish/
https://devdocs.magento.com/guides/v2.2/frontend-dev-guide/cache_for_frontdevs.html

https://www.cdnoverview.com/compare/section.io-vs-fastly/

https://www.linode.com/docs/websites/varnish/use-varnish-and-nginx-to-serve-wordpress-over-ssl-and-http-on-debian-8/

--

--

Laura Trejo
TechWo
Editor for

Magento developer. Coffee junkie. Dog Lover. Blogger in process.