8

In nginx I am using the

proxy_cache_use_stale updating

directive (http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale) so that concurrent request to an invalidated cached content only send 1 request to the upstream (the non-first request respond with stale content while the first request is updating the content).

this works well.

Now is there a way to also have the first request respond immediately with stale content, while at the same time triggering the update ?

right now, the response time is very good for non-first invalidating request, but the first one needs to wait until the backend responds. I would prefer serving stale content until the cache is updated.

3 Answers 3

13

What you're looking for is called stale-while-revalidate (RFC 5861) and it's implemented in nginx as a directive called proxy_cache_background_update. Similar functionality can be found in Varnish 4 and in Squid this is called Collapsed Forwarding.

1
  • 1
    Please update your answer. Since April 2016 it is updated (see Richs answer) Sep 7, 2017 at 12:31
8

This feature was added in nginx 1.11 (April 2016) as proxy_cache_background_update

2
4

If you want to guarantee that only one request can hit the proxied server at a time (e.g. server is fragile to high load induced by the request), you need all three of these:

proxy_cache_use_stale updating;
proxy_cache_background_update on;
proxy_cache_lock on;

There's an excellent explanation here in the nginx blog of why these three are needed and what they do: https://www.nginx.com/blog/nginx-caching-guide/.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .