Varnish Cache 2.0: reverse proxy HTTP ad alte prestazioni open source

Varnish Cache 2.0 (2008-2009) di Poul-Henning Kamp: reverse proxy HTTP scritto su misura per la cache, VCL come DSL di configurazione, architettura shared-memory. Il tassello che trasforma la pila LAMP in grado di scalare.

Open SourceWebR&D VarnishHTTPCacheReverse ProxyVCLCloudOpen SourceFull-Stack

Il problema che Varnish risolve

Alla fine degli anni 2000 il traffico web cresce esponenzialmente e la pila tipica — Apache HTTP Server + PHP + MySQL — mostra i suoi limiti di scalabilità. I reverse proxy con caching (Squid, primariamente) sono stati pensati per il forward proxy e si adattano con attrito al caso inverso. Poul-Henning Kamp, committer storico di FreeBSD, ha avviato nel 2006 Varnish Cache per il quotidiano norvegese Verdens Gang (VG), con un obiettivo specifico: un reverse proxy HTTP progettato nativamente per il caching web moderno.

Varnish 2.0 è stato rilasciato a novembre 2008; la serie 2.0.x culminante con 2.0.5 in ottobre 2009 consolida la maturità del progetto. Licenza BSD 2-Clause.

Le idee tecniche

Varnish introduce scelte architetturali distintive:

  • Shared memory e mmap — l’intera cache è mappata in memoria condivisa, delegando il kernel la gestione del paging. Il design è esplicitamente “laissons faire au kernel”: Varnish non gestisce esplicitamente la cache in RAM vs. disco, ma si affida al virtual memory subsystem
  • Worker thread pool — ogni connessione è gestita da un thread dedicato; scelta differente dall’event-loop single-threaded (Nginx) ma efficace su kernel Linux/FreeBSD moderni con scheduler efficienti
  • VCL — Varnish Configuration Language — DSL compilata in C dal varnishd al caricamento; rule set per decidere cosa cacheare, come, per quanto tempo, con quali variazioni
  • Sticky backends e directors — bilanciamento verso multipli backend con politiche (round-robin, random, client hash, DNS)
  • HTTP/1.1 compliance — gestione conforme di Vary, Cache-Control, Age, If-Modified-Since, conditional GET, ESI (Edge Side Includes)

Un esempio VCL

sub vcl_recv {
    if (req.http.host ~ "^(www\.)?example\.com$") {
        set req.http.host = "example.com";
    }
    if (req.url ~ "\.(png|jpg|css|js)$") {
        unset req.http.cookie;
    }
}

sub vcl_backend_response {
    if (bereq.url ~ "\.(png|jpg|css|js)$") {
        set beresp.ttl = 1d;
    }
}

Il potere espressivo è sufficiente a gestire scenari complessi: autenticazione, A/B testing, rewrite, compressione, ESI. La compilazione a C garantisce prestazioni paragonabili al codice scritto a mano.

Performance

Varnish 2.x su hardware commodity del 2009 gestisce decine di migliaia di richieste al secondo con latenze sotto il millisecondo per HIT. Il throughput è tipicamente limitato dalla rete o dal kernel, non dal processo Varnish.

Il comando varnishlog espone un log dettagliato circolare in shared memory, consumabile da tool come varnishstat, varnishtop, varnishhist per monitoring real-time. Questo modello — circular log in shared memory — è un’altra innovazione tecnica.

Adozione

A fine 2009 Varnish è in produzione in:

  • Verdens Gang (quotidiano norvegese che ha commissionato il progetto)
  • The New York Times, The Guardian, The Times — editoria internazionale
  • Wikipedia (WMF) — layer di cache davanti a Squid e MediaWiki
  • Twitter, Flickr, LinkedIn — traffico sociale elevato
  • Drupal, WordPress VIP — ecosistemi CMS

L’adozione italiana segue tra 2010-2012 nei portali a traffico elevato, testate online, piattaforme e-commerce.

Varnish Plus / Enterprise

Varnish Software (azienda fondata 2010 per sostenere il progetto) introdurrà progressivamente una versione Enterprise con funzionalità aggiuntive (SSL support nativo — il 2.x pubblico non ha TLS, che va gestito esternamente; PSU persistent storage; supporto commerciale). Il core rimane open source BSD.

Lo stack cloud emergente

Il pattern architetturale tipico alla fine del 2009 per un sito web ad alta scalabilità include Varnish:

[Client] → [Load Balancer] → [Varnish] → [Web Server] → [Application] → [Database]

                            [Static assets]

Con Varnish davanti, il web server e l’applicazione sono sollevati dalla maggior parte delle richieste: HIT rate tipici del 80-95% per siti content-heavy. Questo pattern si sposterà naturalmente nel decennio successivo verso CDN distribuiti (Akamai, Cloudflare, Fastly — quest’ultimo basato proprio su Varnish) e infine verso architetture serverless con caching integrato.


Riferimenti: Varnish Cache 2.0.5 (ottobre 2009). Poul-Henning Kamp (FreeBSD committer, autore originale). Verdens Gang come commissionario. Licenza BSD 2-Clause. VCL — Varnish Configuration Language. HTTP/1.1 RFC 2616.

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi