Fastblog: Schritt 1 – Varnish installieren / WordPress Konfig

Am Beispiel meines außerordentlich leistungsstarken Root-Servers soll gezeigt werden, wie man Varnish installiert und anschließend auch konfiguriert. Speziell ist hier eine vHost-Konfiguration, die Regeln sollen am Ende nur auf eine Domain angewendet werden. Die anderen Domains werden auch durch den Varnish geschickt, aber ohne spezielle Konfig. Weiß gar nicht genau, was da passiert… Piwik und all das geht jedenfalls noch. Schätze das wird 1:1 durch geleitet. Also, los geht’s.

Installation vom Varnish ist einfach. Ich nutze CentOS, weil ich Ubuntu aus nicht bekannten Gründen verachte. Vielleicht weil mir seinerzeit die Schaltsekunde auf den (Sekunden)-Zeiger ging. Hier hab ich die Repositories „epel“ und „atomic“ am Start, es reicht ein einfaches „yum install varnish“ und die Sache läuft. Zumindest mal grundsätzlich.

Varnish ist nun installiert und läuft mit den Default-Werten. Unter CentOS ist die Konfiguration für den Service an sich unter /etc/sysconfig/varnish zu finden. Dort sollte man wohl die Größe vom Cache anpassen. Normal 1 Gigabyte, ich setzte es mal auf 20G, da genug Plattenplatz da ist. Die Zeile ist weit unten:

VARNISH_STORAGE_SIZE=20G

Dann noch den Service automatisch starten lassen, wenn der Server startet:

chkconfig varnish on

Nun ist Varnish installiert und wird automatisch starten. Es hört auf dem vorgegebenen Port 6081. Was später wichtig ist. Nun werfen wir eine rudimentäre Konfig ab. Hier kommt man in Kontakt mit VCL, der Varnish Cache Language. Da kann man ziemlich viele Dinge anstellen, aber ein paar wichtige Sachen fehlen. vHost-Konfig zum Beispiel. Da muss man sich mit IF-vHost-Blöcken behelfen, was nicht so fein ist. Also, meine default.vcl ist mal diese, sicher noch großes Optimierungspotenzial:

backend default {
.host = "176.28.51.63";
.port = "7080";
}

acl purge {
"localhost";
"176.28.51.63";
"127.0.0.1";
}

sub vcl_recv {
if (! req.http.Host)
{
error 404 "Need a host header";
}

if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unknown algorithm
remove req.http.Accept-Encoding;
}

if ( req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$" ) {
unset req.http.cookie;
}

if (req.http.Host ~ "^(www\.)?onkel-thoms\.de(:\d+)?$" || req.http.Host ~ "^(www\.)?tbaer\.de(:\d+)?$")
{
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 ~ purge) {
error 405 "Not allowed.";
}
return (lookup);
}

set req.grace = 2m;

if ( req.url ~ "piwik" ) {
return( pass );
}

if ( req.http.cookie ~ "wordpress_logged_in" || req.url ~ "vaultpress=true" ) {
return( pass );
}

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.http.Host ~ "^(www\.)?onkel-thoms\.de(:\d+)?$" || req.http.Host ~ "^(www\.)?tbaer\.de(:\d+)?$")
{
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); } } sub vcl_deliver { if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
return (deliver);
}

Sinn der Sache sollte sein, dass ohne wp-admin oder einen Cookie die Seiten 96h gecached bleiben und nicht mehr mit PHP erzeugt werden müssen. Vielleicht nur ein Ansatz, ich beobachte das mal und optimiere. Wichtig ist, die Konfig oben ist auch keine IP-Adresse und meine Domain’s angepasst! Diese müssen auf jeden Fall geändert werden. Sonst passiert einfach nichts.

Wir haben nun eine Konfig und einen laufenden Varnish. Um sicher zu gehen das das so ist, starten wir ihn zur Sicherheit mal manuell und lassen die Konfig neu laden:

service varnish restart

Und fertig. Nun zum kniffligen Teil. Die Templates von Plesk-NGinx so anpassen, dass dieser die Daten durch den Varnish zum Apache schickt.