10

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.

2
  • 1
    Please update your answer. Since April 2016 it is updated (see Richs answer) Commented Sep 7, 2017 at 12:31
  • I don't this does work, I'm facing issues same as: serverfault.com/questions/956301/… Commented Sep 16, 2024 at 15:21
8

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

2
5

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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.