Nginx post response doesn't get cached

I’m using an old version of nginx (0.8) on centos as reverse proxy for
caching POST requests in front of two upstream servers.
The servers are built for receiving post requests and returning media,
sometimes 10 MB in size.

When the responses are small, nginx caches work fine. When I get a 2 MB
response, nginx doesn’t cache the POST response.

I tried increasing proxy buffer size and busy buffer size but it had no
effect, how do I cache large POST responses in nginx?

Posted at Nginx Forum:

Hello!

On Sat, Dec 29, 2012 at 12:46:21PM -0500, nurettin wrote:

I’m using an old version of nginx (0.8) on centos as reverse proxy for
caching POST requests in front of two upstream servers.
The servers are built for receiving post requests and returning media,
sometimes 10 MB in size.

When the responses are small, nginx caches work fine. When I get a 2 MB
response, nginx doesn’t cache the POST response.

I tried increasing proxy buffer size and busy buffer size but it had no
effect, how do I cache large POST responses in nginx?

Normally responses for POST requests are not cached (even if
response indicates it is cacheable) as there is no good generic
way to construct a cache key.

If you want nginx to cache responses to POST requests, you should
instruct it to do so explicitly using the “proxy_cache_methods”
directive, e.g.

proxy_cache_methods GET HEAD POST;

See Module ngx_http_proxy_module.


Maxim D.

Hi Maxim D.!

The proxy already caches small post responses. My cache key is request
uri
and body. I just don’t know how to increase the buffer.

Posted at Nginx Forum:

Hello!

On Fri, Jan 04, 2013 at 01:53:39AM -0500, nurettin wrote:

Hi Maxim D.!

The proxy already caches small post responses. My cache key is request uri
and body. I just don’t know how to increase the buffer.

There are no buffers which influence request cacheability.
Responses are either cached or not regardless of their size.

I would recommend you to check if max_size= configured in
proxy_cache_path (if any) is big enough to store responses you
want to cache. If it is, you may want to produce debug log to
investigate what goes on, see here for details

http://nginx.org/en/docs/debugging_log.html

You may also want to upgrade to make sure you are not hitting some
old bug. The 0.8.x branch is way too old.


Maxim D.

Hello!

On Tue, Jan 08, 2013 at 06:57:08AM -0500, nurettin wrote:

I have debug on error.log, here’s the output:
code 0
2013/01/08 13:51:20 [notice] 32764#0: signal 29 (SIGIO) received

I’m not sure what to do here.

Ah, ok, the error message logged suggests that you need to
increase upstream buffer - it’s used to store cache header and
it’s too small to hold your cache key with request body included.

The “increase upstream buffer size” wording is indeed not very
helpful, it was made more specific in nginx 1.1.0+. In case of
proxy, you have to increase proxy_buffer_size, see
Module ngx_http_proxy_module.


Maxim D.

Thanks a lot

    proxy_buffers 8 2m;
    proxy_buffer_size 10m;
    proxy_busy_buffers_size 10m;

Now the response gets cached properly.

Posted at Nginx Forum:

Here’s the related configuration:

proxy_cache_path /var/www/cache levels=1:2 keys_zone=kendi-cache:1000m
max_size=10000m;
proxy_cache_key “$request_uri|$request_body”;

When I send small requests, nginx works great.
When I send a large post request (long uri) I get these logs:

I have debug on error.log, here’s the output:

2013/01/08 13:50:25 [error] 32765#0: *1 cache key too large, increase
upstream buffer size 4096, client:…
2013/01/08 13:51:01 [warn] 32765#0: *1 an upstream response is buffered
to a
temporary file /var/www/cache/tmp/0000000001 while reading upstream,
client:…
2013/01/08 13:51:20 [notice] 300#0: http file cache: /var/www/cache
0.000M,
bsize: 4096
2013/01/08 13:51:20 [notice] 32764#0: signal 17 (SIGCHLD) received
2013/01/08 13:51:20 [notice] 32764#0: cache loader process 300 exited
with
code 0
2013/01/08 13:51:20 [notice] 32764#0: signal 29 (SIGIO) received

I’m not sure what to do here.

Posted at Nginx Forum: