Nginx http proxy caching
Maxim Dounin
mdounin at mdounin.ru
Tue May 11 05:05:26 MSD 2010
Hello!
On Mon, May 10, 2010 at 04:55:03PM -0500, Ryan Malayter wrote:
> On Mon, May 10, 2010 at 2:15 PM, Igor Sysoev <igor at sysoev.ru> wrote:
> > On Mon, May 10, 2010 at 03:02:09PM -0400, Jim Ursetto wrote:
> >
> >> Vinay Y S Wrote:
> >> -------------------------------------------------------
> >> > Hi,
> >> > Is there developer documentation on how http
> >> > caching works in nginx? I'm
> >> > seeing weird caching behavior where it's caching
> >> > responses with Cache-Control: private headers.
> >>
> >> nginx completely ignores the `private` keyword and
> >> will cache your document regardless.
> >>
> >> > As I've asked in another thread, I'm also trying
> >> > to understand how I can
> >> > enable/disable caching per request based on a
> >> > cookie or a header set by
> >> > upstream server.
> >>
> >> You can send `Cache-control: max-age=0` or
> >> `Cache-control: no-cache` to disable nginx proxy cache.
> >>
> >> Note that because `private` is ignored, you cannot tell
> >> nginx to not use the proxy cache while still allowing
> >> the browser to cache (for example,
> >> `Cache-control: max-age=3600, private`). You can only
> >> disable the proxy cache in the configuration file based
> >> on the current Location. I don't really understand this
> >> behavior; I think private should be honored.
> >
> > You are right, "private" should be ignored.
> > However, you may say nginx "X-Accel-Expires: 0" to not cache such
> > responses. You may say different cache times for nginx and
> > browsers/transit proxies:
> >
> > X-Accel-Expires: 500
> > Cache-Control: max-age=100
>
> Ach... is this really true? It is a fundamental HTTP spec violation to
> ignore "private" cache-control directives in a proxy (even a reverse
> proxy I would think).
There are lots of situations where you have to cache private data
on reverse proxy. And you can do this safely by providing
appropriate proxy_cache_key.
I agree that private data shouldn't be cached by default, but I
don't see any "fundamental violation" here. In HTTP terms nginx
is origin server, and it's up to it's admin to configure it to do
whatever he want.
> It says in the documentation that it will obey cache-control headers here:
> http://wiki.nginx.org/NginxHttpProxyModule#proxy_cache
Wiki isn't documentation, it's user-contributed content.
> Is the documentation incorrect? Are "private", "no-transform",
> ,"proxy-revalidate", and other such headers are ignored by nginx? I
> just introduced caching into our QA environment for a whole site,
> expecting sane behavior on the part of nginx. I guess I better do some
> multi-user testing or roll it back out of caution...
The only cache-control directives currently honored are "no-cache"
and "max-age=".
And yes, using proxy_cache on some arbitrary backend which wasn't
designed to work with nginx isn't really good idea (at least right
now).
Maxim Dounin
More information about the nginx
mailing list