-
-
Save perbu/93803707dbcdbc345da0 to your computer and use it in GitHub Desktop.
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_backend_response { | |
set beresp.ttl = 10s; | |
set beresp.grace = 1h; | |
} | |
sub vcl_recv { | |
# intial state | |
set req.http.grace = "none"; | |
} | |
sub vcl_deliver { | |
# copy to resp so we can tell from the outside. | |
set resp.http.grace = req.http.grace; | |
} | |
@cletustboone I think you should remove the set beresp.ttl
line to honor the origin's Cache-Control
max-age/s-maxage headers.
Disclaimer: Newbie to Varnish.
Question: Shouldn't vcl_recv
finish with a return(hash);
?
return (fetch);
should be replaced with return (miss);
if using Varnish 5.0
@arikogan return(hash)
is called at the end of the default vcl_recv function and is not needed in this vcl, unless you want to prevent the default vcl_recv behavior for some reason
@dancriel I'm running Varnish 5.0.0 and without return (hash)
at the end of my altered vcl_recv
, Varnish won't return cached results. When calling /etc/init.d/varnish configtest
varnish returns the built-in configuration as well which includes this note:
NB! You do NOT need to copy & paste all of these functions into your"
" * own vcl code, if you do not provide a definition of one of these"
" * functions, the compiler will automatically fall back to the default"
" * code from this file."
This sounds like "as long as you don't define vcl_recv
the built-in version will be used but if you redefine it, you should copy 'n paste it and add your custom code".
@ureimers My understanding is that the default behavior will run after your custom behavior, unless you return somewhere in your vcl_recv function, which will prevent the default behavior (not recommended). Hopefully someone can correct me if this is wrong.
Is this working on Varnish 6? I never hit the req.http.grace = "full";
line. After 10 seconds of the backend going offline, I get a 503 Backend fetch failed
Does this configuration still honor TTLs sent from backend responses with a
Cache-Control
header for something other than 10 seconds?