Права при запуске перлового обработчика и еще кое что

Павел Круш pavel.krush at googlemail.com
Mon Apr 14 13:30:39 MSD 2008


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

package nginxhandler;
use strict;
use warnings;
use nginx;

`echo \`whoami\` >> /tmp/whoami `;

sub handler {
    my $r = shift;
    $r->send_http_header("text/html");
    $r->print(`whoami`);
    return HTTP_OK;
}

Это дает "root" в файле /tmp/whoami и "nobody" на выходе из nginx'a.
Это нормальное поведение? Можно как-нибудь сделать так, чтобы загрузка
была все-таки из под nobody?

И второе:
Стало интересно можно ли запинать HTML::Mason для работы с nginx.
Оказалось, что заводится с полпинка, но возник следующий вопрос.
по умолчанию модуль выводит все, что он нагенерил в STDOUT, откуда
nginx'ом отправляется то ли в /dev/null, то ли еще куда-то.
Но если задать мейсону праметр out_method, то он вместо print делает
вызов данной функции.

Есть у меня вот такой обработчик:

package nginxhandler;
use nginx;

...
our $r; # XXX !!! чтобы $r было видно в out_method
my $mason = new HTML::Mason::Interp(
                                        comp_root => $Config::html,
                                        data_dir => $Config::var .
'/mason_data/',
                                        use_strict => 1,
                                        out_method => sub {
                                                        $r->print(@_);
                                        },
);


sub handler {
        $r = shift;
        $mason->exec(....);
        return HTTP_OK;
}


Собственно вопрос. Может ли случиться такое: Мейсон надолго
задумается(во всех рабочих процессах) на exec'е, приходит еще один
запрос, его подхватывает какой-нибудь рабочий процесс, успевает
подменить $r своим объектом и, вдруг, первый процесс кончает работу и
выплевывает большую кучу контента. Уйдет ли контент нужному клиенту
или перемешается?


More information about the nginx-ru mailing list