Var∙Nish: a Deceptively Attractive External Appearance; an Outward Show

Var∙Nish: a Deceptively Attractive External Appearance; an Outward Show

var∙nish: A deceptively attractive external appearance; an outward show. var∙nished, var∙nish∙ing: To give a smooth and glossy finish to. We will talk about... What is a Reverse Proxy Cache? Architecture of Varnish Installation & Basic Configuration VCL by example Tools Varnish & Rails Misc tips & tricks ehcaC yxorP esreveR A P P R A P P P C A P P What? = Reverse‐Proxy ... à la HAProxy, Pound, mod_proxy_balancer etc. + Cache ... only proxy to backend if necessary a.k.a.: „HTTP Accelerator“ (= BS Bingo) Other „HTTP Accelerators“: Web Cache 10g BIG‐IP Users search.twitter.com hulu.com wikia.com pcwelt.de creativecommons.org ... Architecture: Cache Store Squid Varnish Mem‐Store Disk‐Store VMM (OS) VMM (OS) RAM HDD RAM HDD • one file per object (pre 2.7) • one big file mapped to VM • book keeping (disk vs. memory) • VMM often „smarter“ http://varnish.projects.linpro.no/wiki/ArchitectNotes Architecture: VCL Varnish Configuration Language DSL, compiled to C code (srsly!) allows inline C code C{ syslog(LOG_INFO, “Just served the 1000000th page. Hooray!"); }C hooks into a requests lifecycle Backends, ACLs, LB‐strategies defined here can be hot‐loaded into a running varnishd hot‐switching between multiple versions/profiles Architecture: Logging Not your daddy‘s log file Logs straight to shared memory Enables all kinds of fancy tools: varnishtop varnishstat varnishhist (= geek pr0n) Use varnishlog/varnishncsa to generate old school logs Installation Debian/Ubuntu: apt-get –t unstable install varnish OS X via MacPorts: sudo port install varnish From source: ./configure && make && make install Interesting files: /etc/default/varnish /etc/varnish/*.vcl Configuration Zero configuration in a perfect world (= all origin servers perfect HTTP citizens, setting correct cache control headers, conservative use of cookies) Varnish won't cache anything "private" or carrying a cookie by default The real world sucks: Tracking cookies (Google Analytics) Session cookies although no data in session "Cache‐control: private" by default (Rails) * ... (* which is a sensible default, btw.) VCL: Backends & Probes backend default { .host = "10.0.0.12"; .port = "80"; } backend slow_j2ee_app { .host = "10.0.0.13"; .port = "8080"; .connect_timeout = 1s; .first_byte_timeout = 10s; .between_bytes_timeout = 5s; .probe = { .url = "/check.jsp"; .timeout = 1s; } } VCL: Directors for simple load‐balancing requirements director d1 random { .retries = 3; { .backend = "default"; .weight = 10; } { .backend = "other_host"; .weight = 5; } } director d2 round-robin { ... } VCL: ACLs customize behaviour for different clients acl admins { "localhost"; "10.0.0.0"/24; ! "10.0.0.3"; # intern's laptop } ... if (client.ip ~ admins) { set req.http.x-magic-auth = "1"; } else { unset req.http.x-magic-auth; } VCL: Hooks Most important: vcl_recv Request comes in, decide what to do vcl_fetch Fetched obj from backend, allows tweaking vcl_deliver Object is about to be delivered to client vcl_hash Calculate hash key for lookup, defaults to full URL Other hooks: vcl_miss, vcl_hit, vcl_error, vcl_discard, vcl_timeout, vcl_pipe, vcl_pass http://varnish.projects.linpro.no/wiki/VCL VCL: Functions & Variables regsub(), regsuball(), purge_hash(), purge_url() own subroutines (not functions) with sub foo { ... } include "other.vcl"; to split files into parts req.* Request resp.* Response bereq.* Backend Request obj.* requested Object client.*, server.* set / unset for variables, remove additionally for headers http://varnish.projects.linpro.no/wiki/VCL Example: Choose backend sub vcl_recv { if (req.host ~ "slowapp.com$") { set req.backend = slow_j2ee_app; } else { set req.backend = other_backend; } } Example: Serve static assets sub vcl_recv { if (req.url ~ "^/(images|javascripts|styles)/") { remove req.http.cookie; } } sub vcl_fetch { if (req.url ~ "^/(images|javascripts|styles)/") { remove obj.http.set-cookie; } } Example: Remove certain cookies sub vcl_recv { set req.http.cookie = regsuball( req.http.cookie, "__utm.=[^;]+(; )?", "" ); set req.http.cookie = regsub(req.http.cookie, "; $", ""); if (req.http.cookie ~ "^ *$") { remove req.http.cookie; } } Example: "Stale while revalidate" Serve slightly stale content while a fresh version is fetched => better user experience + no thread pileup sub vcl_recv { set req.grace = 2m; } sub vcl_fetch { set obj.grace = 2m; } http://www.rfc‐editor.org/internet‐drafts/draft‐nottingham‐http‐stale‐controls‐00.txt Example: Backend is down Serve cachable (outdated) content even when the backend is on fire sub_recv { if (req.backend.healthy) { set req.grace = 30s; } else { set req.grace = 1h; } } sub_fetch { set obj.grace = 1h; } Tools: varnishtop Most popular Browser / Agent: varnishtop -i RxHeader -I \^User-Agent 2667.43 RxHeader User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9 459.54 RxHeader User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9 372.66 RxHeader User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9 369.90 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) 353.06 RxHeader User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www 341.84 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 323.87 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 317.88 RxHeader User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9 250.55 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 231.82 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; 173.69 RxHeader User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Most popular URLs: varnishtop –i RxUrl Traffic sources: varnishtop –i RxHeader –I \^Referer Tools: varnishhist | | | Hits | | | | | | | | | | | | | || ||| ||| ||| ||| ||| ||| ||| ||| ||| |||| |||| Misses |||| ||||| ||||| |||||| ## # #| +-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------- |1e-6 |1e-5 |1e-4 |1e-3 |1e-2 |1e-1 |1e0 |1e1 |1e2 More Tools: varnishlog: Generate (customized) logs varnishncsa: Generate Apache compatible logs varnishadm: Manipulate a running varnishd varnishadm -T localhost:6082 purge.url "^/images/" varnishadm –T localhost:6082 vcl.load newconf /etc/my.vcl varnishreplay: Parses a log generated by varnishlog and replays the traffic! Varnish & Rails Proper use of expires_in instead of page caching Only use session if really necessary Purging of content possible with: `varnishadm –T #{hostport} purge.url #{url2purge}` net/telnet klarlack: http://github.com/schoefmax/klarlack !secure the connection to varnish's admin interface! (ssh tunnel, iptables etc.) Varnish & Rails: Sweepers # environment.rb config.gem "schoefmax-klarlack", :lib => 'klarlack', :source => 'http://gems.github.com' VARNISH = Varnish::Client.new('1.2.3.4:6082') # app/sweepers/blog_sweeper.rb class BlogSweeper < ActionController::Caching::Sweeper observe Post include ActionController::UrlWriter after_save(post) expire_post(post) end after_destroy(post) expire_post(post) end private def expire_post(post) VARNISH.purge :url, post_path(post) VARNISH.purge :url, latest_posts_path end end Misc: Edge Side Includes (ESI) Invented by Akamai & Co. <esi:include src="http://example.com/friend_feed"/> http://www.w3.org/TR/esi‐lang fragment_fu‐plugin for Rails (part of mongrel‐esi) Header, TTL: 15 min Activity‐ Nav, Article, Feed, TTL: TTL: 5 min TTL: 60 min 2 min Misc: Fine tuning your setup Use a non‐journaling file system (e.g. ext2) for storage file Pre‐create storage file (minimizes fragmentation). 4GB: dd if=/dev/zero of=storage.bin bs=4M count=1024 Tweak varnish's various startup settings – Twitters are: http://projects.linpro.no/pipermail/varnish‐dev/2009‐February/000968.html Misc: Monitoring with munin Thank you. • http://www.varnish‐cache.org • http://github.com/schoefmax/klarlack • http://varnish.projects.linpro.no/wiki/VCL • http://varnish.projects.linpro.no/wiki/ArchitectNotes • http://www.rfc‐editor.org/internet‐drafts/draft‐nottingham‐http‐stale‐controls‐00.txt • http://projects.linpro.no/pipermail/varnish‐dev/2009‐February/000968.html • http://www.w3.org/TR/esi‐lang .

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    29 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us