ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Проблемы с fastcgi



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




 




Copyright © Lexa Software, 1996-2009.