s-maxage not being honored with proxy_cache

Maxim Dounin mdounin at mdounin.ru
Wed Apr 24 11:41:59 UTC 2013


On Tue, Apr 23, 2013 at 11:05:58AM -0400, Ryan Parrish wrote:

> I have a slow backend application that I'm using nginx to provide
> the authentication and caching for.  It's been working great however there
> is one nagging issue that I cannot seem to resolve, when the backend app
> sets a s-maxage and a maxage Cache-Control, nginx only seems to honor the
> maxage and expires the cache with its value.
> An example response from the backend is like this...
> Cache-Control: max-age=60, s-maxage=3600, public, must-revalidate
> My idea here is I only want the client to cache this data for a short
> amount of time before checking in with me it see if it's still valid.  The
> data usually wont be changing that often so I want nginx to cache it for an
> hour, but in the event it does I use the excellent nginx-cache-purge script
> in my backend app to invalidate the cache and the next time a client checks
> in (after 60 seconds) they will get the new data.

Note: you will not be able to purge shared chaches outside of your 
control, so this might not work as you expect.

> However in all my testing and usage I will only get a cache HIT for 60
> seconds after the first request to a resource, after 60 seconds it will be
> EXPIRED then it will go to the backend again.  Am I missing something in
> the Cache-Control that is causing this behavior?

As of now nginx doesn't handle s-maxage.

Trivial solution is to use X-Accel-Expires to specifi expiration 
time for your nginx cache.  This should also better match a use 
case you've described (as it will only ask your nginx cache to 
cache longer, not all shared caches in the world).

Maxim Dounin

More information about the nginx mailing list