nginx と Perl FCGI モジュールに少し問題があります。FCGI プログラムで、FCGI の通信に使用している Unix ソケットの反対側のサーバー (またはサーバー上のユーザー) よりも長生きする可能性のある長い操作があります。FCGI リクエストが閉じられた場合に中断するには、プログラム内の FCGI accept() ループが必要です。INT、TERMなどのシグナルハンドラーをインストールしようとしましたが、nginxと私のプログラムの間の通信はFCGIソケット、AFAIKを介してのみ行われるため、何もしません。
私もこれを試しましたが、Perl で FCGI モジュールを使用して、FCGI ソケットを介して nginx との間で生データを送受信する方法はありません。FCGIモジュールを変更せずに「ping」機能を持たせる方法はありますか?
基本的な問題は、nginx が FCGI 要求を終了したかどうかをプログラムが認識できないことです。
例:
#!/usr/bin/perl -w
use strict;
use FCGI;
my $fcgi_socket = FCGI::OpenSocket( '/tmp/test.socket', 100000 );
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $fcgi_socket);
REQUEST: while($request->Accept() >= 0) {
#begin handling request
my $result = '';
while (1) { #or select(), etc
if (somehow check whether the fcgi $request is still live) {
next REQUEST;
}
#check for results, set $result if done
}
print $result;
}