/* Amazon S3 Backend */ backend s3 { .host = "nombrebucket.s3.amazonaws.com"; .port = "80"; } /* vcl_recv es llamado cada vez que una petición es recibida */ sub vcl_recv { /* Solo servimos peticiones GET y HEAD */ if (req.request != "GET" && req.request != "HEAD") { return (pass); } /* Solo servimos archivos, asi que ni Cookies ni Autorizaciones */ if (req.http.Authorization || req.http.Cookie) { return (pass); } set req.grace = 120s; set req.http.X-Forwarded-For = client.ip; /* Establecer backend para la peticion */ set req.backend = s3; set req.http.host = "nombrebucket.s3.amazonaws.com"; /* Eliminar de la cabecera todos los campos que pueden afectar la cache */ unset req.http.Cache-Control; unset req.http.Pragma; unset req.http.Expires; /* Si el archivo es una imagen desactivamos compresion */ if (req.url ~ "\.(jpeg|jpg|png|ico|svg|gif)$") { unset req.http.Accept-Encoding; return (lookup); } else if (req.url ~ "\.(css|js|txt)$") { return (lookup); } /* Demas tipos no soportados */ return (pass); } /* Llamado cuando hay un hit en cache */ sub vcl_hit { return (deliver); } /* Llamado cuando hay un miss en cache */ sub vcl_miss { return (fetch); } /* Llamado cuando un documento se ha descargado exitosamente del backend */ sub vcl_fetch { /* Se eliminan cookies antes de que el objeto sea introducido en cache */ unset beresp.http.Set-Cookie; /* Si es una imagen se desactiva compresion (Solo precaucion) */ if (req.url ~ "\.(jpg|jpeg|png|ico|svg|gif)$") { set beresp.do_gzip = false; } /* Establecer fecha de caducidad para los datos en cache */ set beresp.ttl = 1w; /* Una semana */ set beresp.grace = 120s; /* Forzar cacheado por el cliente */ set beresp.http.Expires = beresp.ttl; set beresp.http.Cache-Control = "max-age=604800"; /* 7 dias */ /* Ocultar información añadida por amazon antes de almacenar */ unset beresp.http.Server; unset beresp.http.x-amz-id-2; unset beresp.http.x-amz-request-id; unset beresp.http.x-amz-version-id; unset beresp.http.ETag; return (deliver); } sub vcl_deliver { /* Eliminar informacion superflua antes de enviar respuesta */ unset resp.http.Via; unset resp.http.X-Varnish; /* DEBUG: Util para comprobar el correcto funcionamiento de la cache */ /* unset resp.http.Age; */ if (obj.hits > 0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } return (deliver); }