Varnish

Varnish ist ein Caching Reverse Proxy, d.h. er sitzt unmittelbar vor dem Web-Server und cached die ausgehenden Inhalte.yc

Installation

Aktuelle Versionen von Varnish benötigen die folgenden Pakete auf Debian/Ubuntu:

$ sudo apt-get install autotools-dev automake1.9 libtool autoconf libncurses-dev xsltproc groff-base libpcre3-dev pkg-config

Unter CentOS/Fedora benötigen Sie die folgenden Pakete:

$ yum install automake pcre

Unter Mac OS X lassen sich die benötigten Pakete mit MacPorts oder Homebrew installieren:

$ sudo port install automake pcre

oder:

$ brew install automake pcre

Anschließend kann Varnish mit Buildout heruntergeladen, kompiliert und konfiguriert werden. Hierzu tragen Sie folgendes in Ihre deploy.cfg-Datei ein:

[buildout]
parts =
…
varnish-build
varnish-config
varnish-instance
…
[varnish-build]
recipe = zc.recipe.cmmi
url = ${varnish-instance:download-url}

[varnish-config]
recipe = collective.recipe.template
input = templates/plone.vcl.in
output = ${buildout:directory}/etc/plone.vcl
backend-host = 127.0.0.1
backend-port = 8010

[varnish-instance]
recipe = plone.recipe.varnish
daemon = ${buildout:parts-directory}/varnish-build/sbin/varnishd
config = ${buildout:directory}/etc/plone.vcl
bind = 127.0.0.1:8000
cache-size = 1G
runtime-parameters =
    thread_pool_max=100
daemon
${buildout:parts-directory}/varnish-build/sbin/varnishd
bind

Hostname und Port, an dem Varnish auf Anfragen lauscht.

Der Standardwert ist 127.0.0.1:8000.

cache-size

Die Größe des Caches. Beachten Sie bitte, dass die Größe bei 32bit-Systemen auf 2G begrenzt ist.

Der Standardwert ist 256M.

config
Pfad zur Varnish-Konfigurationsdatei, in unserem Fall ${buildout:directory}/etc/plone.vcl
runtime-parameters

Parameter, die zur Laufzeit angegeben werden, z.B.:

thread_pool_max
Maximale Anzahl der Threads, in unserem Fall 100.

Die vollständige Liste der Parameter finden Sie beim Aufruf der Manpages für varnishd:

$ man varnishd

Weitere Konfigurationsmöglichkeiten erhalten Sie in plone.recipe.varnish.

Anmerkung 1: Wird Varnish auf Mac OS X mit plone.recipe.varnish installiert, wird automatisch ein Patch mitinstalliert. Weitere Informationen erhalten Sie unter http://varnish.projects.linpro.no/ticket/118.

Anmerkung 2: Falls Sie als Caching Reverse Proxy lieber Squid verwenden möchten, steht auch hierfür ein Rezept bereit: plone.recipe.squid

Konfiguration

Eine examplarische Varnish-Konfigurationsdatei finden Sie hier: plone.vcl.in. In ihr wird das Backend spezifiziert, das auf localhost an Port 8080 läuft und erlaubt Anfragen via HTTP-Basic Authentication oder Cookie-basierte Authentifizierung.

Weitere Informationen zur Varnish-Konfiguration erhalten Sie in Varnish Configuration Language - VCL.

Starten und Statistiken

Anschließend können Sie Varnish mit dieser Konfigurationsdatei und 1 GB Cache am Port 8100 starten mit:

$ ./bin/varnish-instance

Dies startet den Varnish-Daemon in {buildout:directory}/parts/varnish- build/sbin/varnishd unter Verwendung der Konfigurationsdatei

System Message: ERROR/3 (<string>, line 123)

Unexpected indentation.
{buildout:directory}/etc/plone.vcl.

Auf manchen Systemen muss ulimit erhöht werden, z.B. mit:

$ ulimit -n ${NFILES:-131072}
$ ulimit -l ${MEMLOCK:-82000}

Um zu überprüfen, ob der Varnish auch tatsächlich die gewünschten Dateien cached, stehen Ihnen diverse Werkzeuge in {buildout:directory}parts/varnish- build/bin zur Verfügung:

varnishtop
gibt die Memory-Log-Dateien in einer regelmäßig aktualisierten Liste der häufigsten Log-Einträge aus.
varnishhist
gibt die Memory-Log-Dateien als regelmäßig aktualisierte Histogramme der Lastverteilung der letzten N Anfragen aus.
varnishsizes
macht dasselbe wie varnishhist, zeigt jedoch die Größe der Objekte und nicht die Zeit zum Abarbeiten der Anfragen. Dies gibt Ihnen einen guten Überblick über die Größe der ausgelieferten Objekte.
varnishstat
gibt Ihnen eine detaillierte Angabe über die Anzahl der misses, hits, den verwendeten Storage, erstellte Threads und gelöschte Objekte.

Weitere Informationen zu den statistischen Auswertungsmöglichkeiten von Varnish erhalten Sie in Statistics.

Load Balancing

Varnish erlaubt auch Load Balancing zwischen verschiedenen Instanzen. Hierzu wird statt der Angaben zu backend default folgendes angegeben:

backend instance {
    .host = "127.0.0.1";
    .port = "8081";
    .probe = {
              .url = "/";
              .interval = 5s;
              .timeout = 1 s;
              .window = 5;
              .threshold = 3;
    }
}

backend instance2 {
    .host = "127.0.0.1";
    .port = "8082";
    .probe = {
              .url = "/";
              .interval = 5s;
              .timeout = 1 s;
              .window = 5;
              .threshold = 3;
    }
}

backend sorryserver {
    .host = "localhost";
    .port = "80";
}

director zeo round-robin  {
     {
        .backend = instance;
    }
     {
        .backend = instance2;
    }
}

…

sub vcl_recv {

    set req.backend = zeo;
    …
    if (! req.backend.healthy)  {
        set req.backend = sorryserver;
        return(pass);
    }
    …
}
probe
gibt in unserem Fall an, dass Varnish das /-Objekt alle 5 Sekunden aufruft. Falls die Antwort länger als eine Sekunde ausbleibt, nimmt Varnish an, dass das Backend nicht erreichbar ist. Umgekehrt nimmt Varnish an, dass das Backend erreichbar ist wenn drei der letzten fünf Verbindungsversuche erfolgreich waren. Weitere Informationen hierzu erhalten sie in backend health polling.
round-robin
zeigt an, dass die Anfragen zufällig an die Backends weitergegeben werden.

Note

Allgemeine Informationen zum Load-Balancing mit Varnish erhalten Sie unter LoadBalancing.

Note

Hinweise zur Änderung der Varnish Configuration Language in Varnish 3 erhalten Sie in Upgrading from Varnish 2.1 to 3.0.