[Moscow.pm] Зависание FastCGI. Как отладить?

Гришаев Анатолий 0body0 на rambler.ru
Чт Ноя 21 01:25:45 PST 2013


У нас используется немного другая фигня, поскольку с CGI::Fast были 
какие-то проблемы (не спрашивайте, может не умеем готовить)
=============================
use CGI ();
use FCGI ();

local *CGI::save_request;
*CGI::save_request = sub {};
my $request = FCGI::Request();

while($request->Accept() >= 0) {
     my $q = CGI->new;

}
=============================

По твоим симптомам проблема где-то в CGI, но возможно в fcgi-spawn, я 
иногда вместо его использую такой перловый код

==================================
use IO::Socket::INET;
use Getopt::Long;

our $PORT = 8888;
Getopt::Long::GetOptions( "port|p=s", \$PORT ) or exit 1;

my $s = IO::Socket::INET->new( Listen => 100, Reuse => 1, LocalPort => 
$PORT ) or die "$!";
open STDIN, "<&", $s;
exec "perl", "your fcgi.pl";

========================

20.11.2013 21:21, Grigory Batalov пишет:
> Всем привет!
>
> Моё FastCGI-приложение недавно начало странно зависать.
> Выражается это в отказе принимать соединения некоторыми
> из запущенных (идентичных) процессов, а потом и остальных.
> При этом они реагируют на SIGHUP, сбрасывая в журнал статистику.
>
> Как бы мне научиться его отлаживать и найти проблемное место?
>
> В скрипте используется цикл
>
> while ($loop) {
>
>      my $q = CGI::Fast->new;
> ...
> }
> Примитивное журналирование показывает, что дальше этого места
> в цикле не идёт. (Но и процесс не завершается, как если бы
> $loop стал 0 .)
>
> Несколько процессов запускаются с помощью
> spawn-fcgi -p <port> /path/to/script
> и разными портами.
>
> В качестве фронтенда - nginx, настройка:
>
>    upstream mine {
>         server localhost:8082;
>         server localhost:8083;
>         server localhost:8084;
>    }
>    location /mine/ {
>      fastcgi_pass  mine;
>      fastcgi_index index.cgi;
>
>      fastcgi_param SCRIPT_FILENAME mine.pl;
>      fastcgi_param QUERY_STRING    $query_string;
>      fastcgi_param REQUEST_METHOD  $request_method;
>      fastcgi_param CONTENT_TYPE    $content_type;
>      fastcgi_param CONTENT_LENGTH  $content_length;
>      fastcgi_param REMOTE_ADDR     $remote_addr;
>    }
>
> В логах вижу
> 2013/11/20 12:24:02 [error] 12753#0: *22971445 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: x.x.x.x, server: localhost, request: "POST /mine/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:8082", host: "mine:8080"
>
> После чего, не найдя ничего лучше, перезапускаю скрипты.
> Куда копать?


-- 
С уважением Анатолий.


Подробная информация о списке рассылки Moscow-pm