Motivace: na mojesmrt.cz průměrně 10× zrychlení požadavků. Na homepage dokonce z 120 ms na 5ms. Za hodinu práce a bez zásahu do kódu aplikace.

Zjednodušeně je Varnish black box, který dáte mezi klienta a váš http server, nastavíte jaké stránky se mají cachovat jak dlouho a máte hotovo.

Diagram

Trochu složitěji je to takhle: varnish přijme http požadavek a rozhodne se (hlavně na základě url) jestli chce načíst nacachovanou odpověď. Každý http request má tzv. hash, kde je v základu jenom doména (nebo ip). Dá se to nastavit na libovolnou kombinaci (i upravených) proměnných z http požadavku. Pokud varnish požadavek cachovat nemá nebo ho cachovat má ale zatím tomu hashi žádný záznam neodpovídá, tak to pošle na backend. Pro zajímavost, backendů může být víc, dokonce to umí i fail-over.

Nejde to samozřejmě nasadit na všechny aplikace všude, takové jméno přihlášeného uživatele v hlavičce je typický neřešitelný problém. Na rozdíl od cachování v aplikaci samozřejmě nejde cachovat jenom část odpovědi. Všimněte si že spousta služeb má veřejný frontend kde se stav přihlášení nezobrazuje a samotná aplikace pro přihlášeného uživatele je jinde – tohle dělá třeba New Relic.

Dobré použití je Wiki (resp. MediaWiki). 95 % requestů mají od nepřihlášených uživatelů (Ori Livneh, Senior Performance Engineer at the Wikimedia Foundation, September 15, youtu.be/vgXgDVrb-BU?t=13:13). Doporučuju celý talk, pro ty co nemají čas vypíchnu nejlepší část:

This comes with a price. The price is that the use of a web accelerator masks the problems of the underlying application. If you know that the wast majority of requests are never going to hit php […] then you fret less about the performance characteristics of the code.

Nevýhody Varnish cache: špatná dokumentace a staré návody na webu. A pak nepodporuje tls, což ale lze vyřešit tím, že se použije tohle schéma:

Diagram s tls

Přidání podpory pro tls se ani nechystá, odůvodněné to mají takto:

First, I have yet to see a SSL library where the source code is not a nightmare. […] Second, it is not exactly the best source-code in the world. Even if I have no idea what it does, there are many aspect of it that scares me. (varnish-cache.org/docs/…/ssl.html)

Nejsou to zrovna povzbuzující slova která by přesvědčovala o kvalitě Varnish, ale tls je drobnost a není potřeba, stačí že to podporuje http server. Když už se ale člověk prokouše dokumentací a nastavením, je to luxusní zrychlení.

PS: Jako všechny služby umí i varnish načítat konfiguraci ze všech souborů v určitě složce. Verzujte prosím tu konfiguraci v repozitáři, mějte symlink a deploy nástroj ať udělá varnish reload.

PPS: Kdyby vás zajímalo detailněji jak používá WikiMedia Varnish, mrkněte sem: http://www.mediawiki.org/wiki/Manual:Varnish_caching