nginx-0.3.21

Igor Sysoev is at rambler-co.ru
Tue Jan 17 23:23:04 MSK 2006


On Tue, 17 Jan 2006, Alex Sergeyev wrote:

> Можно сделать что нибудь чтоб из перла можно было бы перестартовать
> nginx? А сделать релоад модуля из перла без рестарта?
>
> Можно ли сделать не content-handler а что-либо иное на perl? Например
> аналог апачного init, child-init-handler и других из mod_perl?
>
> Тогда можно было бы сделать модуль аналогичный Apache::StatINC
> который отлавливал бы изменение исходника и вызывал бы релоад
> модуля.

По поводу рестарта можно что-то придумать, но не так, как сделано в
Apache::StatINC - куча stat(2) на каждый запрос, включая
запросы, которые никогда не попадут в mod_perl. Причём, как минимум
7 файлов в perl5.8 вообще никогда не изменятся за время работы сервера:

  XSLoader.pm = /usr/local/lib/perl5/5.8.7/mach/XSLoader.pm
  warnings/register.pm = /usr/local/lib/perl5/5.8.7/warnings/register.pm
  Carp.pm = /usr/local/lib/perl5/5.8.7/Carp.pm
  Exporter.pm = /usr/local/lib/perl5/5.8.7/Exporter.pm
  strict.pm = /usr/local/lib/perl5/5.8.7/strict.pm
  constant.pm = /usr/local/lib/perl5/5.8.7/constant.pm
  warnings.pm = /usr/local/lib/perl5/5.8.7/warnings.pm

> Ну и вообще на будущее интересно - что будет примерно из этого модуля

Будут обработчики фаз - perl_worker_init, perl_worker_exit,
perl_rewrite, perl_access, etc.
Будет обработчик ответа, полученного от upstream'а.
Будет обработчик выбора upstream'а.

Возможно, можно будет писать сложные обработчики, работающие с другими
серверами, примерно так, как это сделано внутри nginx'а:

sub handler1 {
     $r->handler = handler2;
     rc = start_long_operation1;
     if (rc != OK) {
         return rc;
     }
     handler2;
}

sub handler2 {
     $r->handler = handler3;
     rc = start_long_operation2;
     if (rc != OK) {
         return rc;
     }
     handler3;
}

...


В принципе, можно даже ходить таким способом в базы данных, например,
postgres'овская libpq поддерживает неблокирующиеся соединения. А вот
с mysql - опаньки - там только блокирующиеся, нужно писать свою библиотеку.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list