memcached upstream: exited on signal 11

Igor Sysoev is at rambler-co.ru
Wed Dec 26 00:47:19 MSK 2007


On Mon, Dec 24, 2007 at 03:39:45PM +0300, Andrey Ignatov wrote:

> On Mon, Dec 24, 2007 at 11:48:57AM +0300, Andrey Ignatov wrote:
> > On Thu, Dec 20, 2007 at 08:02:18PM +0300, Andrey Ignatov wrote:
> > > Использую memcached бекенд в nginx. В результате воркер, на который
> > > приходит запрос падает в корку от первого же запроса.
> > 
> > Игорь, можете прокомментировать ситуацию ?
> 
> Вот минимальный конфиг, с которым у меня стабильно падает (пробовал на
> двух разных серверах - freebsd 5.4 и 6.2):
> 
> 
> config #1
> ------------------------------------------------------------------------
> user			www www;
> worker_processes	2;
> error_log  		/var/log/nginx-error.log info;
> 
> events {
> 	worker_connections	8192;
> 	use			kqueue;
> 	debug_connection	192.168.18.14;
> }
> 
> http {
> 	include       		mime.types;
> 	default_type  		application/octet-stream;
> 
> 	server {
> 		listen		192.168.18.250;
> 		server_name	domain.tdl;
> 
> 		location / {
> 			if ($request_uri ~ "\/(\d+)\/blogs\.(rss|rss2|atom)\.xml$") {
> 				set	$user_id	"$1";
> 				set	$type		"$2";
> 			}
> 
> 			#set	$user_id	"788";
> 			#set	$type		"rss2";
> 
> 			set	$memcached_key	"blogfeed::$user_id::$type";
> 
> 			memcached_pass	192.168.0.205:11211;
> 		}
> 	}
> }
> ------------------------------------------------------------------------
> 
> Причем, если закомментировать блок if и раскомментировать set'ы, где
> переменные задаются явно, то падать перестает (пусть это будет config #2).
> 
> Запрос делается такой: http://domain.tdl/788/788/blogs.rss2.xml
> 
> 
> Еще заметил, что при работе с config #1, в дебаг-логе получаем:
> 
> http memcached request: "/788/788/blogs.rss2.xml"
> 
> Т.е. $memcached_key почему то стал равен $uri.
> 
> При работе же с config #2, получаем как задумано:
> 
> http memcached request: "blogfeed::788::rss2"
> 
> Однажды вообще получил:
> 
> http memcached request: "192.168.18.14"
> 
> Т.е. переменной $memcached_key был присвое IP заданный в
> debug_connection. Но эту ситуацию у меня воспроизвести не получилось
> пока.

Проблема в том, что memcached_pass и "set $memcached_key ..." не наследуются
в конфигурацию внутри блока if. Прилагаемый патч разрешает использовать
memcached_pass внутри if. Конфигурация должна выглядеть так:

       	location / {
             if (...) {
                 set        $user_id        "$1";
                 set        $type           "$2";
                 set        $memcached_key  "blogfeed::$user_id::$type";
                 memcached_pass        192.168.0.205:11211;
             }

             set  ...

             set        $memcached_key        "blogfeed::$user_id::$type";
             memcached_pass        192.168.0.205:11211;
        }

Более корректного решения до нового ngx_http_script_module не будет.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/modules/ngx_http_memcached_module.c
===================================================================
--- src/http/modules/ngx_http_memcached_module.c	(revision 1096)
+++ src/http/modules/ngx_http_memcached_module.c	(working copy)
@@ -58,7 +58,7 @@
 static ngx_command_t  ngx_http_memcached_commands[] = {
 
     { ngx_string("memcached_pass"),
-      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
       ngx_http_memcached_pass,
       NGX_HTTP_LOC_CONF_OFFSET,
       0,


More information about the nginx-ru mailing list