Varnish is my faviourite 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 use varnishtop
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
orJSESSIONID
.
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 varnishd
with -F I saw an error containing socket(): Address family not supported by protocol, Assert error in mgt_cli_telnet(), mgt_cli.c line 478:
Running strace
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 the ipv6
kernel module withinsmod
didn’t remedy the situation.
The solution was to use a different format when entering hosts in the varnishd
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!
Source: http://tkj.freeshell.org/unix/varnish/