Nginx http proxy caching

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.
Does nginx obey all caching headers correctly? Also, is there a way to
override the caching headers for certain requests only?

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. I’ve not found an answer to it yet. Any help is much
appreciated.

Thanks,

On Mon, May 10, 2010 at 03:02:09PM -0400, Jim Ursetto wrote:

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


Igor S.
http://sysoev.ru/en/

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.

Posted at Nginx Forum:

Igor S. Wrote:

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:

Oh, thank you. That is very useful.
Jim

Posted at Nginx Forum:

On Mon, May 10, 2010 at 2:15 PM, Igor S. [email protected] wrote:

nginx completely ignores the private keyword and

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).

It says in the documentation that it will obey cache-control headers
here:
http://wiki.nginx.org/NginxHttpProxyModule#proxy_cache

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…


RPM

Igor S. Wrote:

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:

Oh, thank you. It didn’t occur to me to use X-Accel-Expires.

Jim

Posted at Nginx Forum:

Hello!

On Mon, May 10, 2010 at 04:55:03PM -0500, Ryan M. wrote:

Cache-control: no-cache to disable nginx proxy cache.
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:
Module ngx_http_proxy_module

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 D.

2010/5/10 Maxim D. [email protected]:

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.

Only if you’re able to create separate nginx locations or different
proxy_cache_key definitions for public items versus potentially
private dynamic pages based on URI alone. This isn’t possible with
quite a few content management and collaboration systems, especially
those which dynamically return images or other content from a
database. In such systems, the URLs are usually something like
http://myserver.com/content/id354325435ed434, with Cache-Control and
Content-Type headers being set dynamically. You can’t add a cookie or
anything else to the proxy_cache_key without giving up caching of
public items.

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.

Nginx with the HTTP proxy module certainly doesn’t meet the definition
of “origin” in RFC 2616. I agree the flexibility to go against the
specification is desirable, but as you say, the default behavior
should conform to the RFC.

Wiki isn’t documentation, it’s user-contributed content.

Is the Russian version at nginx: документация the only
official documentation? I wish I understood Russian and was able to
help keep an up-to-date English version. Google translate does a
decent job, but with technical content that’s not always good enough.

It would probably be best to distribute revision-controlled HTML
documentation which correspond to source code releases. I am willing
to help the project in this area.

The only cache-control directives currently honored are “no-cache”
and “max-age=”.

I started looking at the source, but was thoroughly confused because
there are so few comments. It seems that a simple patch to
ngx_http_upstream.c which sets “u->cacheable = 0;” if a “private”
keyword (or for that matter other Cache-Control headers than nginx
does not yet understand) wold be a workable first step…

RPM

2010/5/10 Maxim D. [email protected]:

Wiki isn’t documentation, it’s user-contributed content.

I updated the English Wiki at
Module ngx_http_proxy_module to provide a
better description of the current behavior.

RPM