Права при запуске перлового обработчика и еще кое что
Павел Круш
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