Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: memcached upstream: exited on signal 11
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
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,
|