Varnish configureren voor Magento 2 — stap voor stap
Terug naar blog

Varnish configureren voor Magento 2 — stap voor stap

AuthorRuthger Idema
31 maart 202612 min leestijd

Een correct geconfigureerde Varnish-server serveert pagina's in onder de 50 milliseconden. Zonder cache doet Magento er gemiddeld 800ms tot 2 seconden over. Dit is hoe je Varnish installeert, configureert en debugt.

Varnish configureren voor Magento 2 — stap voor stap

Een Magento 2 pagina zonder cache duurt gemiddeld 800ms tot 2 seconden. Met Varnish als full page cache is dat onder de 50 milliseconden. Dat is geen kleine optimalisatie — dat is een ander gebruikerservaring.

Magento heeft een ingebouwde full page cache, maar die slaat op in de bestandssysteemcache of Redis. Varnish zit als proxy voor je webserver en serveert gecachte responses vanuit RAM. Dat is de reden voor het snelheidsverschil.

Dit artikel beschrijft de volledige installatie, configuratie en debugcyclus.

Wat je leert in dit artikel

  • Hoe Varnish werkt als caching-laag voor Magento 2
  • Installatie op Ubuntu/Debian
  • Magento VCL configureren
  • Cache invalidation via PURGE-requests
  • Debugging met varnishlog en varnishstat

Hoe Varnish werkt

Varnish plaatst zich tussen de gebruiker en je webserver (Nginx of Apache). De eerste keer dat een pagina wordt opgevraagd, haal Varnish de response op bij de webserver en slaat die op in RAM. Elke volgende request voor dezelfde URL krijgt de gecachte versie — zonder dat Magento of PHP iets hoeft te doen.

Gebruiker → Varnish (poort 80/443) → Nginx (poort 8080) → PHP-FPM → Magento
                ↓
         (bij cache hit)
         Direct response vanuit RAM

Magento communiceert met Varnish via PURGE-requests. Wanneer een product of pagina wordt bijgewerkt, stuurt Magento een PURGE-request naar Varnish, die de betreffende cache-entries verwijdert.

Installatie op Ubuntu 22.04

bash
# Stap 1: Varnish installeren
sudo apt-get update
sudo apt-get install varnish -y

# Stap 2: versie controleren (Magento 2.4 ondersteunt Varnish 6.x en 7.x)
varnishd -V

Magento 2.4.x ondersteunt officieel Varnish 6.5, 7.3 en 7.4. Gebruik geen oudere versies — de VCL-syntax verschilt.

Nginx aanpassen naar poort 8080

Varnish luistert op poort 80. Nginx moet opschuiven naar 8080.

nginx
# /etc/nginx/sites-available/jouwshop.nl
server {
    listen 8080;
    server_name jouwshop.nl;

    # ... rest van je Nginx-configuratie
}

Varnish configureren op poort 80

bash
# /etc/default/varnish
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

De malloc,256m parameter geeft Varnish 256MB RAM voor cache. Stel dit in op 20-30% van het beschikbare servergeheugen, afhankelijk van het aantal unieke pagina's in je shop.

VCL configureren vanuit Magento

Magento genereert automatisch een VCL-bestand dat je kunt downloaden.

bash
# In de Magento CLI
php bin/magento varnish:vcl:generate --output-file /etc/varnish/default.vcl

Of via de Admin: Stores > Configuration > Advanced > System > Full Page Cache > Varnish Configuration > Export VCL for Varnish.

De gegenereerde VCL aanpassen

Het gegenereerde VCL-bestand bevat een werkende basisconfiguratie. Een paar secties die je moet begrijpen:

vcl
# Backend: jouw Nginx-server
backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600s;
    .connect_timeout = 300s;
    .between_bytes_timeout = 300s;
}

# Toegestane IP's voor PURGE-requests
acl purge {
    "localhost";
    "127.0.0.1";
    "::1";
    # Voeg hier het IP van je applicatieserver toe als dat anders is
}

Cookies en caching

Magento gebruikt cookies voor sessie en winkelwagen. Varnish slaat standaard geen responses op als er cookies aanwezig zijn. De VCL regelt dit:

vcl
sub vcl_recv {
    # Verwijder cookies die caching niet mogen blokkeren
    if (req.http.cookie) {
        # Bewaar alleen Magento-gerelateerde cookies
        set req.http.cookie = regsuball(req.http.cookie, ";? *[a-zA-Z0-9_-]+=[^;]+", "");
        if (req.http.cookie ~ "^\s*quot;) {
            unset req.http.cookie;
        }
    }

    # PURGE-requests alleen toestaan van bekende IP's
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed"));
        }
        return (purge);
    }
}

Magento instellen op Varnish

bash
# Stel Varnish in als full page cache backend
php bin/magento config:set system/full_page_cache/caching_application 2

# Stel het Varnish-host en -poort in
php bin/magento config:set system/full_page_cache/varnish/access_list "localhost"
php bin/magento config:set system/full_page_cache/varnish/backend_host "localhost"
php bin/magento config:set system/full_page_cache/varnish/backend_port "8080"

# Cache legen
php bin/magento cache:flush

Controleer in de Admin onder System > Cache Management of "Varnish Cache" als caching-methode is geselecteerd.

Cache invalidation

Wanneer een productpagina wordt bijgewerkt, moet Varnish die pagina uit de cache verwijderen. Magento doet dit via PURGE-requests met cache tags.

Magento voegt aan elke response een X-Magento-Tags-header toe met de cache tags voor die pagina:

X-Magento-Tags: cat_1,cat_12,store_1,cms_b,FPC

Bij een productupdate stuurt Magento een PURGE-request met die tags. Varnish verwijdert alle gecachte responses die die tags bevatten.

vcl
# Cache tags verwerken in VCL
sub vcl_recv {
    if (req.method == "PURGE") {
        if (req.http.X-Magento-Tags-Pattern) {
            ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
            return (synth(200, "Banned"));
        }
    }
}

sub vcl_backend_response {
    # Cache tags doorsturen naar gecachte object
    set beresp.http.X-Magento-Tags = beresp.http.X-Magento-Tags;
}

Varnish debuggen

varnishstat: statistieken in real-time

bash
varnishstat

Let op deze metrics:

MetricBetekenisStreefwaarde
MAIN.cache_hitRequests beantwoord vanuit cacheZo hoog mogelijk
MAIN.cache_missRequests doorgestuurd naar backendZo laag mogelijk
MAIN.cache_hitpassRequests die cache bypassenAnalyseer oorzaak
MAIN.n_objectAantal objecten in cacheAfhankelijk van shop

Een cache hit ratio onder de 80% wijst op een configuratieprobleem. Controleer of cookies correct worden verwijderd.

varnishlog: request-level logging

bash
# Bekijk alle requests in real-time
varnishlog

# Filter op een specifieke URL
varnishlog -q 'ReqURL ~ "/categorie/shirts"'

# Bekijk alleen cache misses
varnishlog -q 'VCL_call eq "MISS"'

Controleren of een response gecached is

bash
curl -I https://jouwshop.nl/categorie/shirts | grep X-Cache
# X-Cache: HIT (gecached door Varnish)
# X-Cache: MISS (niet gecached, request ging naar Magento)

Voeg dit toe aan je VCL om de header mee te sturen:

vcl
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
}

Veelgemaakte fouten

  1. HTTPS niet via Varnish laten lopen — Varnish zelf ondersteunt geen SSL. Zet Nginx of HAProxy als SSL-terminator voor Varnish: Gebruiker → Nginx (443, SSL termination) → Varnish (80) → Nginx (8080).
  1. Vergeten Health Checks te configureren — Als Magento tijdelijk uitvalt, blijft Varnish requests sturen naar een onbereikbare backend. Configureer health checks in de VCL.
  1. Cache te klein instellen — Als de cache vol is, gooit Varnish oudere objecten weg (LRU eviction). Monitor MAIN.n_lru_nuked in varnishstat. Als dat hoog is, vergroot de cache.
  1. Checkout-pagina's cachen — Checkout, winkelwagen en My Account mogen nooit gecached worden. De gegenereerde Magento VCL sluit deze uit, maar controleer dit bij aanpassingen.

Best practices

PracticeWaarom
Sla VCL op in versiebeheerWijzigingen zijn traceerbaar en herstelbaar
Test cache invalidation na productwijzigingenVerouderde cache is erger dan geen cache
Monitor cache hit ratio dagelijksEen dalende ratio wijst op een probleem
Gebruik grace modeServeert verouderde cache als backend traag is
Stel beresp.ttl per pagina-type inProductpagina's langer cachen dan zoekresultaten

Conclusie

Varnish is de snelste full page cache-oplossing voor Magento 2. De installatie kost een middag. De opbrengst — pagina's die in 50ms laden in plaats van 800ms — is permanent.

De kritieke stap zit niet in de installatie maar in de configuratie. Cookies, cache invalidation en HTTPS-terminatie moeten correct zijn. Gebruik de Magento-gegenereerde VCL als uitgangspunt en bouw daarop verder.

Meer weten over Magento hosting en performance? Bekijk onze Magento hosting-pagina of ons artikel over Magento 2 full page cache configureren. Onze Magento 2 diensten omvatten ook performance-audits waarbij we je volledige cachingstack doorlichten. Voor geoptimaliseerde Magento-hosting raden wij Hypernode aan.


Heeft je Magento 2 shop een trage TTFB? Neem contact op voor een vrijblijvende performance-analyse.
Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check