http_push_module

pyromaniac - kinwizard на gmail.com
Ср Янв 27 18:19:39 MSK 2010


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

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

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

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

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

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

> 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 на mail.ru>написал:
> >
> > >
> > > > Господа, тут такая оказия приключилась:
> > > >
> > > > 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 = ngx_palloc(ngx_http_push_pool, 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=%d , len\n" ,url->data, url_variable->data,
> len);
> > > должно помочь
> > > если валится на этом логе, значить либо url=NULL либо url_variable =
> NULL,
> > > по этому я делаю так:
> > > if ( url )
> > >  ngx_log_error( ... выводим данные)
> > > else
> > >  ngx_log_error( ... выводим сообщение url=NULL)
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > nginx-ru mailing list
> > > nginx-ru на nginx.org
> > > http://nginx.org/mailman/listinfo/nginx-ru
> > >
>
> > _______________________________________________
> > nginx-ru mailing list
> > nginx-ru на nginx.org
> > http://nginx.org/mailman/listinfo/nginx-ru
>
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено&hellip;
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20100127/4aa89b18/attachment-0001.html>


Подробная информация о списке рассылки nginx-ru