nginx cache exceeded, cache manager busy

zls nginx-forum at nginx.us
Sat Jun 25 18:57:58 MSD 2011


We've found the problem and sent email to "igor at sysoev.ru", but got no
answers.

It's caused in ngx_http_upstream_process_header. If 
r->cache->header_start is bigger than u->conf->buffer_size,
u->buffer.last will be bigger than u->buffer.end, and the response
header will be written to invalid memory for this buffer. But the
written memory may be valid for this process, so core dump usually
happens some time later, and backstrace shows somewhere else.

a patch based on nginx-1.0.4:

diff -ruNp nginx-1.0.4/src/http/ngx_http_upstream.c
nginx-1.0.4_zls/src/http/ngx_http_upstream.c
--- nginx-1.0.4/src/http/ngx_http_upstream.c    2011-06-01
16:02:34.000000000 +0800
+++ nginx-1.0.4_zls/src/http/ngx_http_upstream.c        2011-06-22
00:41:32.282201935 +0800
@@ -661,6 +661,16 @@ ngx_http_upstream_cache(ngx_http_request
 
         ngx_http_file_cache_create_key(r);
 
+        if (r->cache->header_start >= u->conf->buffer_size){
+          ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+              "cache disabled because of too big cache_key (%uz vs
%uz)",
+              r->cache->header_start, u->conf->buffer_size
+              );
+
+          r->cache = NULL;
+          return NGX_DECLINED;
+        }
+
         switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {
 
         case NGX_ERROR:

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,182995,209970#msg-209970




More information about the nginx mailing list