Service stall pages in case backends are sick

Guillaume Quintard guillaume at varnish-software.com
Sun Sep 24 08:55:12 UTC 2017


Have you changed the default grace (10s)?

-- 
Guillaume Quintard

On Sun, Sep 17, 2017 at 8:36 PM, Vassilis Aretakis <vassilis at onlab.xyz>
wrote:

> I have a setup which was working on Varnish 3.0 but not with 4.1
>
> The stale pages where servered in case the backends where sick. But I
> cannot make this work with varnish 4.
> Can you help me to make it serve the cached pages in case backends are
> gone?
> also session-cookies can be removed/ignored
>
> My config is:
>
>
> vcl 4.0;
> import directors;
> import std;
>
> backend b1 {
>   .host =
>   .port = "80";
>   .first_byte_timeout = 180s;
>   .between_bytes_timeout = 120s;
>   .probe = {
>       .url = "/healthy_check/d.php";
>       .interval = 10s;
>       .timeout = 2 s;
>       .window = 7;
>       .threshold = 1;
>   }
> }
>
>
> backend b2 {
>   .host =
>   .port = "80";
>   .first_byte_timeout = 180s;
>   .between_bytes_timeout = 120s;
>   .probe = {
>       .url = "/healthy_check/d.php";
>       .interval = 10s;
>       .timeout = 2 s;
>       .window = 7;
>       .threshold = 1;
>   }
> }
>
>
> sub vcl_init {
>   new vdir = directors.round_robin();
>   vdir.add_backend(b1);
>   vdir.add_backend(b2);
> }
>
> sub vcl_recv {
>
>   set req.backend_hint = vdir.backend();
>
>   #Ignore adminpanel
>   if (req.url == "^/adminpanel/.*" ||
>       req.url == "^/adminApplication/.*" ||
>       req.url ~ "^/adminApplication/" ||
>       req.url ~ "^/adminpanel/" ||
>       req.url ~ "^/newsfeed.php" ||
>       req.url ~ "^/comment") {
>     return (pass);   # unset req.http.Cookie;
>   }
>
>   if (req.method != "GET" &&
>       req.method != "HEAD" &&
>       req.method != "PUT" &&
>       req.method != "POST" &&
>       req.method != "TRACE" &&
>       req.method != "OPTIONS" &&
>       req.method != "DELETE") {
>     /* Non-RFC2616 or CONNECT which is weird. */
>     return (pipe);
>   }
>   if (req.method != "GET" && req.method != "HEAD") {
>       /* We only deal with GET and HEAD by default */
>       return (pass);
>   }
>   #set req.http.grace = "none";
>
>   return (hash);
>  }
>
> sub vcl_pipe {
>
>   return (pipe);
> }
>
> sub vcl_pass {
>   return (fetch);
> }
>
> sub vcl_hit {
>   if (obj.ttl >= 0s) {
>     # normal hit
>     return (deliver);
>   }
>   # We have no fresh fish. Lets look at the stale ones.
>   if (std.healthy(req.backend_hint)) {
>     # Backend is healthy. Limit age to 10s.
>     if (obj.ttl + 10s > 0s) {
>       set req.http.grace = "normal(limited)";
>       return (deliver);
>     } else {
>       # No candidate for grace. Fetch a fresh object.
>       return(fetch);
>     }
>   } else {
>     # backend is sick - use full grace
>     if (obj.ttl + obj.grace > 0s) {
>       set req.http.grace = "full";
>       return (deliver);
>     } else {
>       # no graced object.
>       return (fetch);
>     }
>   }
> }
>
> sub vcl_miss {
>   return (fetch);
> }
>
> sub vcl_backend_fetch {
>   set bereq.backend = vdir.backend();
> }
>
> sub vcl_backend_response {
>   # Happens after we have read the response headers from the backend.
>   #
>   # Here you clean the response headers, removing silly Set-Cookie headers
>   # and other mistakes your backend does.
>   unset beresp.http.set-cookie;  set beresp.grace = 1h;
>   if (beresp.status > 500) {
>    return (retry);
>   }
>   if (bereq.url == "^/") {
>     set beresp.ttl = 60s;
>   }
>
>   #jpeg caching (forced)
>   if (bereq.url ~ "\.(png|gif|PNG|JPG|JPEG|jpg|jpeg|swf|css|js)$" ||
>       bereq.url ~ "\.(png|gif|PNG|JPG|JPEG|jpg|jpeg)&width.*" ||
>       bereq.url ~ "\.(png|gif|PNG|JPG|JPEG|jpg|jpeg)?.*") {
>     set beresp.http.cache-control = "max-age = 2592000";
>   }
>   return (deliver);
> }
>
> sub vcl_hash {
>    hash_data(req.url);
>    if (req.http.host) {
>        hash_data(req.http.host);
>    } else {
>        hash_data(server.ip);
>    }
>    return (lookup);
> }
>
> sub vcl_deliver {
>   set resp.http.grace = req.http.grace;
> }
> _______________________________________________
> varnish-misc mailing list
> varnish-misc at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20170924/91120594/attachment.html>


More information about the varnish-misc mailing list