Varnish + Magento “cache warmer” script

Reind -
Geschatte leestijd: +/_ 7 minuten

Met de komst van Magento 2 kwam ook de ondersteuning voor Varnish, een full page cache oplossing welke (mits goed geconfigureerd) niet alleen een boost geeft qua performance maar ook je server ontlast.

Varnish wordt nog wel eens aangedragen als DE oplossing voor een slechte performance bij Magento. Dat is echter maar de helft van het verhaal. Varnish is een prima oplossing om een Magento webshop met een goede performance nog net even wat beter te laten presteren zonder dat er meteen weer bakken met server resources tegenaan gesmeten hoeven te worden. Zie Varnish als een “kers op de taart” welke je net dat beetje extra performance geeft.

Probleem wanneer Varnish namelijk gebruikt wordt om een ontzettend trage webshop “snel te doen laten lijken” is dat wanneer de bezoeker pagina’s voorgeschoteld krijgt welke niet vanuit Varnish aan de gebruiker geserveerd worden (neem bijvoorbeeld de account sectie binnen Magento, de checkout, gebruik van filters binnen een categorie e.d.) deze gebruiker alsnog lang aan het wachten is. In de basis kun je dus stellen dat wanneer je Magento webshop niet in staat is om pagina’s binnen 2 seconden op het scherm bij de eindgebruiker te toveren Varnish je ook niet gaat helpen!

Cache warmer

Wanneer je de basis snelheid goed op orde hebt van Magento en Varnish goed geconfigureerd hebt moet de pagina’s natuurlijk wel ook in Varnish terecht komen. Standaard zal dat gebeuren wanneer een bezoeker een pagina bezoekt maar (zeker wanneer je een grotere webshop hebt en/of weinig bezoekers) kan het zo zijn dat veel pagina’s alsnog niet vanuit de cache geserveerd worden.

Om dat probleem op te lossen kun je een zogenaamde cache warmer extensie aanschaffen maar dat betekent weer een extensie binnen Magento en betalen voor iets wat eigenlijk heel simpel op te lossen is met een paar regels code op de server waar Magento draait.

Sitemap aanmaken binnen Magento

Om alle pagina’s van Magento in een cache te kunnen krijgen is het eerst van belang dat we weten welke pagina’s we allemaal tot onze beschikking hebben binnen Magento. Nu is de oplossing daarvoor heel simpel, we gebruiken de sitemap. Praktisch iedereen zet hem aan vanwege SEO redenen (en terecht) maar verder wordt hij eigenlijk nergens anders voor gebruikt, daar gaan we nu verandering in brengen.

Mocht je nog geen sitemap hebben gegeneerd binnen Magento, zie onderstaande stappen.

  1. Log in op de backend van je Magento 2 webshop
  2. In het linker zij menu, kies voor “Marketing” > “Sitemaps
  3. Rechts bovenin de oranje button “Sitemap toevoegen”
  4. Geef de naam op voor de sitemap (in het onderstaande screenshot, sitemap_nl.xml)
  5. Kies de locatie waar de sitemap gegenereerd moet worden (/pub/ folder is aan te raden, anders is hij niet bereikbaar)
  6. Kies het winkelaanzicht
  7. Kies voor “opslaan & genereren
  8. KLAAR!

Je zult na het opslaan en genereren nu terug worden gebracht door Magento naar de overzichtpagina van de sitemaps, controleer daar of de sitemap ook daadwerkelijk bereikbaar is en resultaten geeft.

Om de sitemap ook dagelijks te laten verversen is het zaak deze door de Magento cron te laten genereren. Dit kun je instellen onder “Winkels > Configuratie > Catalogus > XML Sitemaps“. Onderstaand screenshot geeft de correcte instellingen weer (tijd e.d. kan men zelf bepalen, rustige uren is aan te raden). De rest van de instellingen kan op zich met rust gelaten worden.

Bash script

Wanneer we een sitemap voor handen hebben is het tijd om op de server zelf aan het werk te gaan. Log in op de server en navigeer naar de root directory van Magento (zelf heb ik naast de Magento root directory nog een map tools waar o.a. scripting als deze in geplaatst wordt maar dat terzijde) en maak daar een nieuwe file “cache-warmer.sh”. Kopieer onderstaande code, plak deze in de zojuist aangemaakte “cache-warmer.sh” en pas de url regel aan naar de juiste waarde (het volledige pad naar je sitemap).

#!/bin/bash
URL='http(s)://magento-base-url/pub/sitemap_nl.xml'

wget --quiet $URL --no-cache --output-document - | egrep -o '.*' | sed -e 's///g' -e 's/<\/loc>//g' | while read line; do
    time curl -A 'Cache Warmer' -s -L $line > /dev/null 2>&1
    echo $line
done

Na het aanpassen van de URL kunnen we de file opslaan en sluiten. Nu is het nog zaak de “cache-warmer.sh” executable te maken op de server, dit doe je met het volgende commando “chmod +x varnish-cache-warmer.sh“.

Nu kan het script getest worden op een juiste werking. Open een nieuwe terminal window en open daar de acces.log van de server met bijvoorbeeld het volgende commando (afhankelijk van de server configuratie en zal dus niet standaard voor iedereen werken), “tail -f /var/log/nginx/access.log | grep “Cache Warmer”

Schakel nu terug naar het vorige terminal venster en voer nu het “cache-warmer” script uit middels het commando “./cache-warmer.sh“. Het script zal nu output geven welke vergelijkbaar is met onderstaand,

./cache-warmer.sh 

real	0m0.431s
user	0m0.021s
sys	0m0.004s
https://magento-base-url/vochtbestrijding.html

real	0m0.032s
user	0m0.017s
sys	0m0.008s
https://magento-base-url/gereedschappen.html

real	0m0.033s
user	0m0.019s
sys	0m0.007s
https://magento-base-url/oppervlaktebescherming.html

real	0m0.295s
user	0m0.022s
sys	0m0.004s
https://magento-base-url/dryrod-cutter-tool.html

real	0m0.032s
user	0m0.017s
sys	0m0.007s
https://magento-base-url/dryrod-pack-10-sticks.html

real	0m0.031s
user	0m0.020s
sys	0m0.004s
https://magento-base-url/dryrod-box-50-sticks.html

In het andere terminal window waar de acces log op open hebben staan zal output als onderstaand verschijnen,

tail -f /var/log/nginx/access.log | grep "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:50:18 +0000] "GET /blog/post/hello-world/ HTTP/2.0" 200 40626 "-" "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:51:07 +0000] "GET /vochtbestrijding.html HTTP/2.0" 200 119990 "-" "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:51:07 +0000] "GET /gereedschappen.html HTTP/2.0" 200 43471 "-" "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:51:07 +0000] "GET /oppervlaktebescherming.html HTTP/2.0" 200 60532 "-" "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:51:07 +0000] "GET /dryrod-cutter-tool.html HTTP/2.0" 200 55041 "-" "Cache Warmer"
37.xxx.xx.108 - - [13/Jul/2018:12:51:07 +0000] "GET /dryrod-pack-10-sticks.html HTTP/2.0" 200 54973 "-" "Cache Warmer"

Als alles dus goed is gegaan zal het script nu dus alle pagina’s langs zijn gegaan uit de sitemap en zitten deze nu in de Varnish cache.

Pagina’s in de cache hebben echter maar een bepaalde levensduur en zullen na verloop van tijd uit de cache gegooid worden. Daarom is het zaak de “cache warmer” met enige regelmaat te draaien. Nu kun je 2 x per dag inloggen op de server en handmatig het script starten maar dat is niet heel handig, daarom zetten we hem in de cron van de server.

Cronjob

Om het geheel af te maken voeren we het script 1 maal daags (kan vaker als de levensduur van pagina’s in de Varnish cache kort is ingesteld) uit middels een cronjob. Switch hiervoor naar de juiste user op de server en voer het commando “crontab -e” uit. Als het goed is zijn nu de standaard Magento cronjobs al zichtbaar (zo niet, heel rap voor elkaar maken ;-)) enĀ  kunnen we de volgende regels onderaan toevoegen,

55 4 * * * varnishadm -T 127.0.0.1:6082 -S /etc/varnish/secret "ban req.url ~ ."
0 5 * * * /var/www/tools/renopartner-varnish-cache-warmer.sh >/dev/null 2>&1

Door middel van de cronjob wordt nu iedere nacht (op basis van bovenstaand script) om 4:55 de complete Varnish cache leeg gegooid, vervolgens wordt om 5:00 het cache warmer script afgevuurd en hebben we alle pagina’s welke aanwezig waren in de sitemap weer vers in de cache zitten.

 

Reind -
Geschatte leestijd: +/_ 7 minuten

1 Reactie

  1. Rene
    Misschien ook eens een stukje wagen aan hoe Varnish het beste opgezet kan worden?

Reageer

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *