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.

Jerome WAGNER
  • 193
  • 1
  • 1
  • 8

3 Answers3

12

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.

Mike Howsden
  • 381
  • 3
  • 6
7

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

Rich
  • 704
  • 14
  • 30
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/.

Alex
  • 168
  • 3