WP Varnish Cache
================

Combinatie van "WP Varnish Domain Purge" en de cache warmer.

Functies
--------
1. Knop "Varnish cache legen" in de adminbalk (wp-admin): stuurt een PURGE
   naar Varnish die alleen objecten van het huidige domein bant.
2. Cache warm houden: elke 5 minuten worden alle URL's ververst waarvan de
   gecachte versie ouder is dan "Verversen na" (standaard 55 minuten).
   Pagina's die net door een bezoeker zijn gerenderd worden overgeslagen.
3. Na het legen worden alle pagina's automatisch opnieuw gevuld (instelbaar).
4. Bij het opslaan van een bericht worden die pagina en de homepage bij de
   volgende run direct ververst.

Varnish-server staat vast in de plugin: 93.114.128.68:6081
(constanten VARNISH_HOST / VARNISH_PORT bovenin wp-varnish-cache.php).

Installatie per site
--------------------
1. Upload de ZIP via Plugins > Nieuwe plugin > Plugin uploaden en activeer.
2. Zet DISABLE_WP_CRON in wp-config.php en voeg de systeem-cron toe (zie Cron).
Klaar. Optionele instellingen: Hulpmiddelen > Varnish Cache.

Overstappen van WP Varnish Domain Purge
---------------------------------------
Deactiveer en verwijder de oude plugin, installeer deze en activeer hem.
De VCL hieronder vervangt het oude PURGE-blok (de oude "acl purge" kan weg).

Varnish VCL (4/5/6/7)
---------------------
acl wp_servers {
    "localhost";
    "127.0.0.1";
    # IP-adres(sen) van de WordPress/webserver(s) die PURGE- en
    # warm-requests naar Varnish sturen:
    # "203.0.113.10";
}

sub vcl_recv {
    if (req.method == "PURGE") {
        if (client.ip !~ wp_servers) {
            return (synth(405, "PURGE not allowed"));
        }
        if (!req.http.X-WP-Purge-Host) {
            return (synth(400, "Missing purge host"));
        }
        if (req.http.X-WP-Purge-Host != req.http.host) {
            return (synth(400, "Host mismatch"));
        }
        ban("obj.http.x-wp-cache-host == " + req.http.X-WP-Purge-Host);
        return (synth(200, "Domain cache purged"));
    }

    # Warm-request: altijd naar de backend en het object vervangen.
    if (req.http.X-Cache-Warm) {
        if (client.ip ~ wp_servers) {
            set req.hash_always_miss = true;
        } else {
            unset req.http.X-Cache-Warm;
        }
    }
}

sub vcl_backend_response {
    # Domein op het object opslaan zodat BAN per domein werkt.
    set beresp.http.x-wp-cache-host = bereq.http.host;
}

sub vcl_deliver {
    unset resp.http.x-wp-cache-host;
}

Herlaad Varnish na de wijziging (bijv. varnishreload).

Cron
----
Achter Varnish komen bezoekers zelden bij PHP, dus WP-Cron is onbetrouwbaar.
Zet in wp-config.php:

    define('DISABLE_WP_CRON', true);

en voeg een systeem-cron toe:

    */5 * * * * www-data wp --path=/pad/naar/site cron event run --due-now --quiet

WP-CLI
------
wp varnish warm [--force]   cache vullen
wp varnish purge            cache van dit domein legen
wp varnish status           aantal URL's en hoeveel er aan de beurt zijn

Filter
------
add_filter('wvc_urls', function ($urls) { $urls[] = home_url('/extra/'); return $urls; });

Veiligheid
----------
- Purge en handmatig vullen alleen voor gebruikers met manage_options, met nonce.
- Alleen het (gevalideerde) domein uit home_url() wordt meegestuurd.
- Beperk PURGE en warm-requests in Varnish via de ACL tot je webserver(s).
