Проблемы с fastcgi
Igor Sysoev
is at rambler-co.ru
Wed Dec 28 14:48:13 MSK 2005
On Wed, 28 Dec 2005, Andrey Chernomyrdin wrote:
> Вот тут столкнулся с какими-то неясными проблемами в 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.
nginx буферизирует вывод FastCGI. Насколько я понимаю, FastCGI в данном
случае не закрывает соединение и поэтому клиенту ничего не передаётся.
Аналога "proxy_buffering off" для FastCGI пока нет.
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list