HTTP Cache + Varnish
Web sites performance optimization
@desarrolla2

               Desarrollador
                 PHP desde
               septiembre de
                   2007




                Buscando
                 curro!!!
¿Por qué?

GWT: Asegura que mi sitio es lento




On average, pages in your site take 2.2 seconds to load (updated on Mar
21, 2012). This is faster than 63% of sites.
HTTP Cache
Web sites performance optimization
¿Por qué?

"Es (posiblemente) el
sistema de cache que
más eficaz y fácil de
    implementar."
        - Daniel González
Objetivo

 "Nunca generar la
misma respuesta dos
     veces."
             - Alguien
HTTP Cache

  "Es un protocolo de cache que debería ser
 respetado por todas las capas intermedias y
            por los navegadores."
HTTP Cache: Freshness


    "En la mayoría de
   los casos es la mejor
   estrategia de cache."
HTTP Cache: Freshness

Cache-Control
  Public, Private
  No-Cache, No-store
  max-age, s-maxage
  must-revalidate
  // ..
      Cache-Control: Public, s-maxage:3600, must-
  revalidate
Expires
     Expires Tue, 20 Mar 2012 11:21:13 GMT
HTTP Cache: Freshness

Pragma
    Pragma: Private, max-age:3600
HTTP Cache: Freshness


$response->setMaxAge(15 * 60); $response->setExpires
(new DateTime('now + 15 minutes'));
// ..
HTTP Cache: Freshness

header("Cache-Control:...");
header("Pragma:...");
// ..
HTTP Cache: Freshness

<meta http-equiv="Cache-Control" content="max-
age=3600, private">
HTTP Cache: Freshness


<filesMatch ".(js|css)$">
    Header set Cache-Control "private, max-age=7200"
</filesMatch>
HTTP Cache: Validation


     "Cuando no puedes
    predecir la frecuencia
   con la que cambian tus
          recursos."
HTTP Cache: Validation

Last-Modified
  Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT


Etag
  ETag: "3e86-410-3596fbbc"
HTTP Cache: Validation


$response->setLastModified(new DateTime('2000-01-
01'));
$response->setEtag(md5($response->getContent()));
// ..

$response->setCache(array());
HTTP Cache: Validation


<filesMatch ".(gif|jpg|jpeg|png|mpg|avi)$">
    Header set Last-modified "Mon, 03 Jan 2011 13:02:54
GMT"
</filesMatch>
HTTP Cache



HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Cache-Control: public, s-maxage=3600
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
// ..
HTTP Cache: Friendly URL's


http://misite.com/es/home-user/welcome/



http://misite.com/welcome.php/?
country=es&usertype=home-user
ESI

      <esi:include src="
      http://misite.
      com/header.php" />



      ● include_partial()
      ● {% render %}


      http://www.w3.
      org/TR/esi-lang
ESI
Estandar no es claro


   Puede ser ignorado


Una cache en cada cliente


   Invalidar la cache
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
Varnish
HTTP Accelerator
¿Por que?

   "Varnish is a web
       application
accelerator. You install
it in front of your web
application and it will
       speed it up
     significantly."
¿Por que?




"Rápido, Flexible y
   Escalable"
Varnish: http cache
¿Que es?




           Reverse Proxy

           Proxy Cache
¿Que es?




           Fail Over System

            Load Balancer
Caracteristicas


       Obedece cabeceras HTTP Cache

         Cache de recursos estáticos

    Modifica las cabeceras y las cookies de
           peticiones y respuestas
¿Quien?
¿Cómo?
Instalación
sudo apt-get install varnish
sudo vim /etc/varnish/default.vcl
   backend default {
       .host = "127.0.0.1";
       .port = "8080";
   }




sudo vim /etc/apache2/ports.conf
Listen 8080
Instalación
sudo vim /etc/default/varnish
START=yes //
DAEMON_OPTS="-a :8080  // puerto
      -T localhost:6082 
      -f /etc/varnish/default.vcl  // vlc script
      -S /etc/varnish/secret  //cli autentication
         -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"
//storage, malloc mantendría los objetos en memoria




  https://www.varnish-cache.org/docs/2.
  1/installation/install.html
Varnish: assets
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$">
    Header set Cache-Control "max-age=2592000"
</FilesMatch>
<FilesMatch ".(css|js)$">
    Header set Cache-Control "max-age=604800"
</FilesMatch>




$ ab -n 2000 -c 100 http://sfm.desarrolla2.
com/bundles/sfmwebsite/images/titulo-symfony-madrid.png
Varnish Configuration Language

Subroutines
    vcl_recv / vcl_fetch / vcl_deliver / vcl_hash / vcl_miss
/ vcl_hit / vcl_error / ...
Actions
   pass / lookup / pipe / deliver
Objects
   req / beresp / obj
Varnish: cookies
sub vcl_recv {
   if (req.request == "GET" && req.url ~ ".(jpg|jpeg|gif|png)$") {
         unset req.http.Cookie;
         return(lookup);
    }
}

sub vcl_fetch {
    if (req.url ~ ".(jpg|jpeg|gif|png)$") {
          unset beresp.http.set-cookie;
    }
}
Varnish: Headers

sub vcl_fetch {
    if (!beresp.cacheable) {
    return (pass);
    }
    set beresp.http.Server = "SFM Server 1.0" ;
    return (deliver);
}
Varnish: Headers

sub vcl_deliver {
    if (obj.hits > 0) {
         set resp.http.X-Cache = "HIT " obj.hits;
    } else {
         set resp.http.X-Cache = "MISS";
    }
    return (deliver)
}




$ curl - I http://sfm.desarrolla2.com/bundles/sfmwebsite/images/titulo-
symfony-madrid.png
Varnish: invalidar la caché

acl purge{
    "localhost";
     "192.168.55.0"/24;
}

if (req.request == "PURGE") {
      if (!client.ip ~ purge) {
            error 405 "Not allowed.";
      }
}
Varnish: invalidar la caché
sub vcl_hit {
  if (req.request == "PURGE") {
     set obj.ttl = 0s;
     error 200 "Purged";
  }
}

sub vcl_miss {
  if (req.request == "PURGE") {
     error 404 "Not purged";
  }
}
Varnish vs Memcached
                       En el
                       momento en
                       el que el
                       recurso ha
                       caducado.




                       publico.es
Symfony2 Reverse Proxy
Varnish: invalidar la caché
<?php

require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';
//require_once __DIR__.'/../app/AppCache.php';

use SymfonyComponentHttpFoundationRequest;

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
$kernel->handle(Request::createFromGlobals())->send();
Conclusiónes


   "con HTTP Cache + Varnish el
  rendimiento de tu sitio mejorará
          notablemente"
Conclusiónes


 "HTTP Cache + Varnish por si solo
  son insuficiente, necesitas utilizar
otras técnicas, como carga asincrona
  de recursos, minimización, ect..."
Varnish http cache
Varnish http cache
Varnish http cache

Varnish http cache