Varnish


Varnish is my favourite cache server, here I list bits and pieces on that I've picked up when working with this very fast and sparsely documented cache server.

Find the least cached URIs

To improve your cache hit ratio, the best thing to do is to usevarnishtop to see the URIs that are the most often fetched from the back end server:

varnishtop -i TxURL

Conditional removal of headers

A lot of J2EE applications need the Session object, which is identified in the CGI world by the HTTP header jsessionid or JSESSIONID.

However, what we often want to do, is to remove it alltogehter (and caching the request) and only keep it for requests that really need it (i.e. applications that make use of the Session object```

sub vcl_fetch() {
// keep it
if (req.url ~ "^/forum/" || req.url ~ "^/shop/") {
  pass;
}
// remove the rest
  elsif (obj.http.Set-Cookie ~ "JSESSION") {
    remove obj.http.Set-Cookie;
  }
}

Varnish doesn't start

Assert error in main(), varnishd.c line 632: Condition((daemon(1,
d_flag)) == 0) not true.  errno = 19 (No such device

The reason was that/dev/null wasn't a character device. To fix this, I did:

# rm /dev/null
# mknod -m 666 /dev/null c 1 3

Varnish doesn't start on SLES

I had problems starting a self compiled varnish 2.0.2 running on SLES 10SP2. It configured, was built and installed just fine, but din't start. Running varnishdwith -F I saw an error containing

socket(): Address family not supported by protocol, Assert error in mgt_cli_telnet(), mgt_cli.c line 478:

Runningstrace on varnishd give me a hunch that this has something to do with IPv6 (believe it or not). SLES has turned off IPv6 support per default and Varnish can therefore not understand command line parameters defining ports and hosts for running the cache server and admin interface on the form "localhost:80". Installing theipv6 kernel module with insmod didn't remedy the situation.

The solution was to use a different format when entering hosts in thevarnishd parameters. On the SLES system, I set replaced the parameters in /etc/sysconfig/varnish from

DAEMON_OPTS="-a :81 \
-T localhost:6082 \
-f /etc/varnish/geronimo.vcl \
-s file,/usr/local/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

to:

DAEMON_OPTS="-a :81 \
-T 0.0.0.0:6082 \
-f /etc/varnish/geronimo.vcl \
-s file,/usr/local/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

A big thanks goes to mithrandir at #varnish on irc.linpro.no!


Licensed under CC BY Creative Commons License ~ ✉ torstein.k.johansen @ gmail ~ 🐘 @skybert@hachyderm.io ~ 🐦 @torsteinkrause