Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev ][Date Next ][Thread Prev ][Thread Next ][Date Index ][Thread Index ]
Проблемы с fastcgi
День добрый,
Вот тут столкнулся с какими-то неясными проблемами в fastcgi.
Пытаюсь мигрировать с lighttpd на ngnix, соответственно собираем nginx
0.3.18 и имеем установленный lighttpd 1.4.8
Есть куски конфигов:
nginx:
...
server {
listen 80;
charset off;
location / {
fastcgi_pass 127.0.0.1:8801;
fastcgi_index /;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param PATH_TRANSLATED $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
}
...
Есть lighttpd.conf:
...
fastcgi.server = ( "/" => ( (
"host" => "127.0.0.1",
"port" => 8801,
"check-local" => "disable",
"docroot" => "/"
) )
)
...
Есть два скрипта, один использует стандартный CGI::Fast, и не
наблюдается ни каких проблем:
use strict;
use CGI::Fast;
my $COUNTER = 0;
while( my $cgi = CGI::Fast->new ) {
my $content = join( '',
$cgi->start_html(
-title => "Fast CGI Rocks",
-encoding=> 'windows-1251',
),
$cgi->h1("Fast CGI Rocks"), "Invocation number ",
$cgi->b($COUNTER++), " PID ", $cgi->b($$),".",
$cgi->hr,"\n",
$cgi->end_html,
"\n",
);
print
$cgi->header(
-charset => 'windows-1251',
-content_type => 'text/html',
-content_length => length( $content )
),
$content;
}
Есть то-же самое, но использующее POE:
use strict;
use lib qw(.);
use HTTP::Request;
use HTTP::Response;
use POE::Component::FastCGI;
$| = 1;
my $COUNTER = 0;
POE::Component::FastCGI->new(
Address => '127.0.0.1',
Port => 8801,
Handlers => [
[ '/' => \&default ],
[ '' => \&default ],
],
);
POE::Kernel->run();
print "\nAll done\n";
exit 0;
sub default {
my ( $request ) = @_;
my $response = $request->make_response;
my $content = join( "\n",
qq{<!DOCTYPE html\n\tPUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"\n\t
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" ;>},
qq{<html xmlns="http://www.w3.org/1999/xhtml" ; lang="en-US"
xml:lang="en-US">},
qq{<head>},
qq{<title>Fast CGI Rocks</title>},
qq{<meta http-equiv="Content-Type" content="text/html;
charset=windows-1251" />},
qq{</head>},
qq{<body>},
qq{<h1>Fast CGI Rocks</h1>Invocation number <b>$COUNTER</b>
PID <b>$$</b>.<hr />},
'',
qq{</body>},
qq{</html>},
''
);
print STDERR "Accept request accept\n";
$response->header(
"Content-type" => "text/html; charset=windows-1251",
"Content-Length" => length( $content ),
);
$response->content( $content );
$response->send;
$COUNTER++;
print STDERR "Response sent\n";
}
Из под lighttpd все нормально, а вот в случае nginx приходит запрос,
скрипт выдает ответ, но на строну клиента ничего не выводится... Хотя
если убить скрипт - то выводится то, что должно вывестись. То есть
какая-то проблема с буферизацией.
Может быть кто-нибудь сталкивлася с подобной проблемой ?
P.S.
На всякий случай прилагаю все скрипты и трафик снятый tcpdump-ом в
случае с nginx и lighttpd в виде tar.gz.
По tcpdump-логам:
lighttpd.dat - Это нормальная сессия по fastcgi протоколу между
скриптом и lighttpd
nginx.dat - Сессия между скриптом и nginx причем запись прекращена
спустя 5 секунд после запроса
nginx2.dat - то же самое, но после запроса ~ 10 сек скрипту был послан
сигнал SIGINT (^C)
Система debian unstable.
--
Andrey Chernomyrdin
Attachment:
fastcgi.tar.gz
Description: application/gzip