varnish – Webcache

Varnish ist ein Webbeschleuniger welcher die Inhalte von einem Webserver entgegennimmt und an den Client ausgibt. Dabei werden die Seiten bzw. Daten im Speicher zwischengespeichert. Auf diese weise kann zusätzlicher IO vermieden werden. Varnish ist stark Threadbasiert. Für jede Anfrage wird ein Arbeitsthread gestartet bis die Grenze erreicht ist ab da an werden die Anfragen in die Warteschlange eingereiht. Die Konfiguration wird in einer eigenen Sprache der VCL geschrieben. Da das Paket von Debain für Raspbian veraltet ist compiliere ich das aktuelle:

mkdir -p /source/varnish-cache
aptitude install autotools-dev automake1.9 libtool autoconf libncurses-dev xsltproc groff-base libpcre3-dev pkg-config
cd varnish-cache
git clone git://git.varnish-cache.org/varnish-cache
sh autogen.sh
sh configure
make && make install

Eine VCL_Configfile für Worpress:

backend default {
    .host = "127.0.0.1"; 
    .port = "8080";
}

sub vcl_recv {
    if (req.restarts == 0) {
        if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }
    if (req.request == "PURGE") {
        if ( client.ip != "<IP>") {
            error 405 "Not allowed.";
        }
        return (lookup);
    }
    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "PUT" &&
        req.request != "POST" &&
        req.request != "TRACE" &&
        req.request != "OPTIONS" &&
        req.request != "DELETE") {
            return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        return (pass);
    }
    if (!(req.url ~ "wp-(login|admin)") &&
        !(req.url ~ "&preview=true" ) ) {
        unset req.http.cookie;
    }

    if (req.http.Authorization || req.http.Cookie) {
        return (pass);
    }
    return (lookup);
}

sub vcl_hit {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return (deliver);
}

sub vcl_miss {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return (fetch);
}

sub vcl_fetch {
    if (!(req.url ~ "wp-(login|admin)")) {
        unset beresp.http.set-cookie;
        set beresp.ttl = 96h;
    }

    if (beresp.ttl <= 0s ||
        beresp.http.Set-Cookie ||
        beresp.http.Vary == "*") {
            set beresp.ttl = 120 s;
            return (hit_for_pass);
    }
    return (deliver);
}

Wenn noch nicht vorhanden fügt folgende Zeilen in das init-Script des varnish-cahe ein:
# Open files (standard: 1024, zu wenig fuer varnish)
ulimit -n ${NFILES:-131072}
# Maximum locked memory groesse fuer shared memory log
ulimit -l ${MEMLOCK:-82000}