4

私は Perl の世界に属していないので、これのいくつかは私にとって初めてのことです。apache2 および mod_fcgid パッケージがインストールされた Ubuntu Hardy LTS を実行しています。mod-cgi ではなく fcgid で MT4 を実行したいと考えています (従来の CGI で問題なく動作するようです)。

単純な Perl スクリプトを fcgid の下で実行することすらできないようです。シンプルな「Hello World」アプリを作成し、この前の質問のコードを含めて、 FCGI が実行されているかどうかをテストしました。

スクリプトに HelloWorld.fcgi という名前を付けました (現在、fcgid は .fcgi ファイルのみを処理するように設定されています)。コード:

#!/usr/bin/perl

use FCGI;

print "Content-type: text/html\n\n";
print "Hello world.\n\n";
my $request = FCGI::Request();
if ( $request->IsFastCGI ) { 
    print "we're running under FastCGI!\n";
} else { 
    print "plain old boring CGI\n";
}

コマンド ラインから実行すると、"plain old Boring..." が出力されます。Apache への http 要求を介して呼び出すと、500 内部サーバー エラーが発生し、スクリプトの出力が Apache エラー ログに出力されます。

Content-type: text/html

Hello world.

we're running under FastCGI!
[Wed Dec 03 22:26:19 2008] [warn] (104)Connection reset by peer: mod_fcgid: read data from fastcgi server error.
[Wed Dec 03 22:26:19 2008] [error] [client 70.23.221.171] Premature end of script headers: HelloWorld.fcgi
[Wed Dec 03 22:26:25 2008] [notice] mod_fcgid: process /www/mt/HelloWorld.fcgi(14189) exit(communication error), terminated by calling exit(), return code: 0

同じコードの .cgi バージョンを実行すると、正常に動作します。スクリプトの出力がエラー ログに記録される理由を教えてください。Apache 構成は、デフォルトの mod_fcgid 構成に加えて、VirtualHost ディレクティブにあります。

  ServerName test1.example.com
  DocumentRoot /www/example

  <Directory /www/example>
    AllowOverride None
    AddHandler cgi-script .cgi
    AddHandler fcgid-script .fcgi
    Options +ExecCGI +Includes +FollowSymLinks
  </Directory>
4

4 に答える 4

3

私は FCGI よりも CGI::Fast を使っていますが、考え方は同じだと思います。高速 cgi の目標は、プログラムを 1 回ロードし、要求ごとにループで反復することです。

FCGIのmanページには次のように書かれています:

use FCGI;

my $count = 0;
my $request = FCGI::Request();

while($request->Accept() >= 0) {
    print("Content-type: text/html\r\n\r\n", ++$count);
}

つまり、Acceptブラウザに何かを出力する前に、要求する必要があります。

于 2008-12-03T23:13:04.967 に答える
3

問題は、「Content-Type」ヘッダーが要求ループの外に送信されることです。リクエストごとに「Content-Type」ヘッダーを出力する必要があります。動けば

print "コンテンツタイプ: text/html\n\n";

リクエスト ループの先頭に移動すると、問題が解決するはずです。

また、リクエストをループする必要があります。そうしないと、何のメリットも得られないため、最初のポスターの例に従ってください。

my $request = FCGI::Request();
while($request->Accept() >= 0) {
  print("Content-type: text/html\n\n");
}
于 2008-12-24T22:16:13.727 に答える
2

MovableTypeはFastCGIにCGI::Fastを使用します。マットが説明したように、典型的なFastCGIスクリプトはループで実行されます。CGI :: Fastを使用するループは、次のようになります。

#!/usr/bin/perl

use strict;
use CGI::Fast;

my $count = 0;
while (my $q = CGI::Fast->new) {
    print("Content-Type: text/plain\n\n");
    print("Process ID: $$; Count is: " . ++$count);
}

FCGIおよびCGI::Fastモジュールがインストールされているサーバーでこのスクリプトをテストし、期待どおりに増分をカウントしました。プロセスIDが変更されると、カウントは1に戻り、そのプロセス内でインクリメントされます。もちろん、各プロセスには独自の可変スペースがあります。

MTの場合、FastCGIを有効にするには、cgiスクリプトの名前を「fcgi」に変更(またはシンボリックリンク)します(または「cgi」スクリプトのハンドラーをfcgidにしますが、FastCGIに対応していないmt-xmlrpc.cgiでは機能しません)まだ)。また、ファイルにいくつかのディレクティブを追加して、mt-config.cgiファイルが新しいスクリプト名を認識できるようにする必要があります。このような:

AdminScript mt.fcgi
CommentsScript mt-comments.fcgi

などなど。FastCGIおよびMovableTypeに固有の詳細なドキュメントは、movabletype.orgで入手できます。

于 2008-12-24T15:46:13.450 に答える
0

とにかく、サーバーのエラー ログに基づいて、FCGI が機能していて、適切に呼び出されているように見えますが、スクリプトはループで実行されておらず、次のリクエストが来るのを待っています。したがって、テスト スクリプトは、FastCGI が構成されているかどうかを報告するというタスクを完了しました。これで、FastCGI を使用するように MT を再構成できるはずです。

于 2008-12-25T00:45:01.787 に答える