ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Re[2]: http_push_module



Спасибо, разобрался. Теперь оно работает немного. Проблема в сабреквестах. Прежде, чем использовать сторонние решения, хотелось бы разобраться в возможностях самого энджи.

Есть ngx_http_internal_redirect. Она не очень подходит, поскольку идёт возврат ответа пользователю.
У емиллера нашёл ngx_http_subrequest. Оно тоже, по идее, возвращает результат пользователю, но один из параметров этой функции - коллбэк. Мне хотелось бы обрабатывать ответ приложения прямо на сервере, замораживая отсылку ответа. Думаю, коллбэк поможет это сделать. Но пока не представляю как. Этого даже Емиллер, по его признанию, не знает. Хотелось бы услышать мнение знающих или Самого.

Вообще - обработка запроса идёт в один поток. Самый простой вариант, который я вижу - в форке system("curl ...") - но это вообще хардкор :)

Напомню, что сейчас мой патч для пуш-модуля перехватывает момент подключения или отключения пользователя и должен отсылать запрос приложению. После того, как это заработает, буду хранить отдельный список подключённых пользователей и буду слать запросы приложению из нгинкса только когда это нужно, учитывая тайм-ауты дисконнекта.

Заранее спасибо.

27 января 2010 г. 14:58 пользователь Maxim Dounin <mdounin@xxxxxxxxxx> написал:
Hello!

On Wed, Jan 27, 2010 at 01:36:01PM +0300, pyromaniac - wrote:

> В общем, url->data = 0 Из-за этого и падает. Не понятно, почему ngx_palloc
> не срабатывает. Использование r->pool вместо ngx_http_push_pool даёт
> возможность 1 раз вывести информацию, на второй раз падает с теми же
> симптомами.

Потому что вы выделяете память под стуктуру ngx_str_t, а не под собственно
данные.  А в структуре ngx_str_t data - это указатель на данные,
который вы используете неинициализировав.

Вообще говоря - вам повезло что он 0.  Мог бы показывать
куда-нибудь на реальную память процесса, и вы бы её своим кодом
переписали.  Последствия дальше могут быть любые.

Maxim Dounin

> Александре, а где можно почитать про ngx_shmtx_lock? Что это за зверь такой?
> Он лочит тред, насколько я понимаю?
>
> 27 января 2010 г. 12:34 пользователь Alexandre Kalendarev
> <akalend@xxxxxxx>написал:
>
> >
> > > Господа, тут такая оказия приключилась:
> > >
> > > static void ngx_http_push_send_request(ngx_http_request_t *r,
> > > ngx_http_variable_value_t *url_variable) {
> > >     if (url_variable != NULL && url_variable->not_found != 1 &&
> > > url_variable->len != 0) {
> > >         ngx_str_t   *url;
> > >         ngx_int_t   len = url_variable->len;
> > >         if ((url = "" sizeof(*url) + len)) !=
> > > NULL) {
> > >             url->len = len;
> > >             ngx_memcpy(url->data, url_variable->data, len);
> > >
> > >             ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, "переход
> > на
> > > %s", (char *) url->data);
> > >         } else {
> > >             ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "push
> > module:
> > > unable to allocate memory for $subscribe_url or $unsubscribe_url
> > string");
> > >         }
> > >         ngx_pfree(ngx_http_push_pool, url);
> > >     }
> > > }
> > >
> > > Падает это всё дело на ngx_memcpy(url->data, url_variable->data, len); с
> > > worker process exited on signal 11 и я понять не могу, почему. Может,
> > > кто-нибудь подскажет?
> >
> > [quote]
> > On POSIX-compliant platforms, SIGSEGV is the signal sent to a process when
> > it makes an invalid memory reference, or segmentation fault. The symbolic
> > constant for SIGSEGV is defined in the header file signal.h. Symbolic signal
> > names are used because signal numbers can vary across platforms; in practice
> > it is usually signal #11.[1]
> > [/quote]
> >
> > 1) включаешь опцию --debug
> > 2) запускаешь в конфигурации
> > worker_process 1;
> > master_process off;
> > daemon_off;
> > 3) запускаешь  dbg nginx
> > и ловишь segmentation fault далее backtrace определяешь, где валится
> >
> > сделай лог:  ngx_log_error( NGX_LOG_DEBUG, r->connection->log, "url->data
> > =%d url_variable->data="" , len\n" ,url->data, url_variable->data, len);
> > должно помочь
> > если валится на этом логе, значить либо url="" либо url_variable = NULL,
> > по этому я делаю так:
> > if ( url )
> >  ngx_log_error( ... выводим данные)
> > else
> >  ngx_log_error( ... выводим сообщение url=""> > >
> >
> >
> >
> >
> >
> >
> >
> >
> > _______________________________________________
> > nginx-ru mailing list
> > nginx-ru@xxxxxxxxx
> > http://nginx.org/mailman/listinfo/nginx-ru
> >

> _______________________________________________
> nginx-ru mailing list
> nginx-ru@xxxxxxxxx
> http://nginx.org/mailman/listinfo/nginx-ru


_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.