Architect Manager at NOOK Developer Prior MNPHP Organizer Open Source Contributor (Zend Framework and various others) Where you can find me: • Twitter: mwillbanks G+: Mike Willbanks • IRC (freenode): mwillbanks Blog: http://blog.digitalstruct.com • GitHub: https://github.com/mwillbanks Housekeeping…
memory and keeping in mind cookies, request headers and more… • It caches pages so that your web server can RELAX! What about my apache, tomcat, nginx and (mongrel|thin| goliath….) Generally caching by TTL + HTTP Headers (cookies too!) • A load banancer, proxy and more… What? …. Yes, it can do that! What The Hell? Tell me!
The system is down, or we want to be able to communicate a message to them about some subject… maybe a campaign. The apps and mobile site rely on an API • Trouble in paradise? Few and far in between. Let an API talk to a server… A story on crashing and burning before varnish. A General Use Case
yum install varnish • only 6.x otherwise you’ll be out of date! WOOT Compiling #git • git clone git://git.varnish-cache.org/varnish-cache • cd varnish-cache • sh autogen.sh • ./configure • make && make install Installment
address[:port] backend requests -T address[:port] administration http -s type[,options] storage type (malloc, file, persistence) -P /path/to/file PID file Many others; these are generally the most important. Generally the defaults will do with just modification of the default VCL (more on it later).
version of the reference manual https://www.varnish-cache.org/docs/3.0/tutorial/index.html • Knock yourselves out! There is a ton of documentation • Yes, this makes happy developers. Documentation is very accurate, read carefully. Focus heavily on VCL’s, that is generally what you need. I’m attempting to show you some of how this works but you will require the documentation to assist you. Documentation
wordpress and drupal! • https://www.varnish-cache.org/trac/wiki/VarnishAndWordpress • https://www.varnish-cache.org/trac/wiki/VarnishAndDrupal Examples of all sorts of crazy • https://www.varnish-cache.org/trac/wiki/VCLExamples Existing VCL’s – The truly lazy…
Independently States are Isolated but are Related Return statements exit one state and start another VCL defaults are ALWAYS appended below your own VCL • VCL can be complex, but… Two main subroutines; vcl_recv and vcl_fetch Common actions: pass, hit_for_pass, lookup, pipe, deliver Common variables: req, beresp and obj More subroutines, functions and complexity can arise dependent on condition. VCL – Varnish Configuration Language
initialization • vcl_recv – Beginning of request, req is in scope • vcl_pipe – Client & backend data passed unaltered • vcl_pass – Request goes to backend and not cached • vcl_hash – call hash_data to add to the hash • vcl_hit – called on request found in the cache • vcl_miss – called on request not found in the cache • vcl_fetch – called on document retrieved from backend • vcl_deliver – called prior to delivery of cached object • vcl_error – called on errors • vcl_fini – all requests have exited VCL, cleanup of VMOD’s VCL – Subroutines – breaking it down.
Request host and URL is default from the default vcl. • regsub(string, regex, sub) – substitution on first occurance sub can contain numbers 0-n to inject matches from the regex. • regsuball(string, regex, sub) – substitution on all occurances • ban(expression) – Ban all objects in cache that match • ban(regex) – Ban all objects in cache that have a URL match VCL - Functions
• Directors are a glorified reverse proxy Allows for certain types of load balancing Allows for talking to a cluster “A director is a logical group of backend servers clustered together for redundancy. The basic role of the director is to let Varnish choose a backend server amongst several so if one is down another can be used.” Directors
• Client Director – picks a backend by client identity • Hash Director – picks a backend by URL hash value • Round-Robin Director – picks a backend in order • DNS Director – picks a backend by means of DNS Random OR Round-Robin • Fallback – picks the first “healthy” backend Directors – The Types
It really sounds like a colonoscopy for servers; which it is. • Variables .url .request .window .threshold .intial .expected_response .interval .timeout Director - Probing
(server side includes) to include fragments (or dynamic content for that matter). • Think of it as replacing regions inside of a page as if you were using XHR (AJAX) but single threaded. • Three Statements can be utilized. esi:include – Include a page esi:remove – Remove content <!-- esi --> - ESI disabled, execute normally ESI – Edge Side Includes
set beresp.do_esi = true; By default, ESI will still cache, so add an exclusion if you need it • if (req.url == “/show_username.php”) { return (pass); } • This is a good thing, you may want to cache user information to the right people (aka by cookie value) so that you don’t reload it on every request. Varnish refuses to parse content for ESI if it does not look like XML • This is by default; so check varnishstat and varnishlog to ensure that it is functioning like normal. Using ESI
/> <!-- Don't do this as you'd lose the advantage of varnish --> <!--esi <?php include 'user_header.php'; ?> --> </header> <section id="main"></section <footer></footer> </body> </html> ESI – By Example
utility • It’s the ole finger in the back of the throat Sockets (port 6082) – everyone likes a good socket wrench • Sure, Ipecac is likely overkill. HTTP – now that is the sexiness • A few headers, nothing forced. Purging
queue (or gearman job server) Have a worker that knows about the varnish servers Submit the request to clear the cache in the asynchronously or synchronously depending on your use case. • Have enough workers to make this effective at purging the cache quickly. This will make it far easier to scale; you can either store the servers in a config file, database or anything else you think is relevant. Distributed Purging
embed C into the VCL for varnish? • Want to do something crazy fast or leverage a C library for pre or post processing? • I know… you’re thinking that’s useless.. On to the example; and a good one from the Varnish WIKI! Embedding C in VCL – you must be crazy
you to extend varnish and create new functions • Now, if you are writing modules for varnish you have a specialty use case! Go read up on it! https://www.varnish-cache.org/docs/trunk/reference/vmod.html VMOD – Varnish Modules / Extensions
a file By default Varnish only stores these in shared memory. Apache Style Logs • varnishncsa –D –a –w log.txt This will run as a daemon to log all of your requests on a separate thread. Logging
sever in the queue or load test an environment? varnishreplay –r log.txt • Replaying logs can allow you to do this. This is great for when you are going to be deploying code to check for performance issues. Although… be careful so that you don’t POST data or create data on peoples accounts. Maybe cat the file and remove anything that executes on data. Cache Warmup