Fick en förfrågan från John Angelmo (@veidit) att skriva lite om den supergrymma front-end cachen Varnish. Varnish utvecklas till stor del av företaget Linpro från Norge med hjälp av den danske FreeBSD-utvecklaren Poul-Henning Kamp.
I Sverige är Varnish populärt och används av exempelvis Aftonbladet och SvD. Varnish har en mängd intressanta features och ett mycket kraftfullt konfigurationsspråk som påminner om C.
Använder du Ubuntu som jag gör så är det bara att installera via APT:
$ sudo apt-get install varnish
Standard så lyssnar varnish på TCP port 6081 och skickar vidare förfrågningarna till port 8080 där du förväntas ha din webbserver såsom Apache eller nginx.
Konfigurationsfilen för varnish återhittas i katalogen /etc/varnish/ med filnamnet default.vcl. VCL är också benämningen på det konfigurationsspråk som används som stödjer bla inline C. Se denna PDf-presentation av PHK för mer info.
Det viktiga vi behöver känna till är hur vi pekar ut vårat backend och vilka filer vi vill lagra i cachen. I mitt fall så valde jag Varnish för att Apache drog på tok för mycket minne då exempelvis bara bilder, css och annan statisk information skulle visas.
Nedan konfigurationsfil pekar först ut backend, sedan så sätter den X-Forwarded-For http-headern för att underlägga loggningen i Apache.
Sen så defineras vad som skall chachas.
backend default { .host = "127.0.0.1"; .port = "8080"; } sub vcl_recv { remove req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; if (req.url ~ "^/css" || req.url ~ "^/images" || req.url ~ "^/facebox" || req.url ~ "^/avatars") { return(lookup); } if (req.request != "GET" && req.request != "HEAD") { return(pipe); } if (req.url ~ "^/feedlist.php" || req.url ~ "^/removefeed.php" || req.url ~ "^/feeds.php" || req.url ~ "^/addfeeds" || req.url ~ "^/42it" || req.url ~ "^/login.php" || req.url ~ "^/admin" || req.url ~ "^/settings" || req.url ~ "^/js/tinymce/" ) { return(pipe); } if (req.url ~ "\.(jpg|jpeg|gif|png|tiff|tif|svg|swf|ico|css|vsd|doc|ppt|pps|xls|pdf|mp3|mp4|m4a|ogg|mov|avi|wmv|sxw|zip|gz|bz2|tgz|tar|rar|odc|odb|odf|odg|odi|odp|o ds|odt|sxc|sxd|sxi|sxw|dmg|torrent|deb|msi|iso|rpm)$") { return(lookup); } } sub vcl_hash { set req.hash += req.http.cookie; }
Uppdatering: Varför jag ibland måste använda Varnish tillsammans med Apache istället för mitt förstahandsval Nginx är pga de invecklade .htacess-filer jag skapat.