为什么我的简单fastCGI Perl脚本失败了?

为什么我的简单fastCGI Perl脚本失败了?,perl,fastcgi,movabletype,mod-fcgid,Perl,Fastcgi,Movabletype,Mod Fcgid,我不是Perl世界的人,所以有些对我来说是新的。我正在运行安装了apache2和mod_fcgid软件包的Ubuntu Hardy LTS。我想让MT4在fcgid下运行,而不是在mod cgi下运行(在普通的旧cgi下似乎运行正常) 我似乎连一个简单的Perl脚本都无法在fcgid下运行。我创建了一个简单的“Hello World”应用程序,并包含了用于测试FCGI是否正在运行的代码 我将脚本命名为HelloWorld.fcgi(当前fcgid设置为仅处理.fcgi文件)。代码: 从命令行运行

我不是Perl世界的人,所以有些对我来说是新的。我正在运行安装了apache2和mod_fcgid软件包的Ubuntu Hardy LTS。我想让MT4在fcgid下运行,而不是在mod cgi下运行(在普通的旧cgi下似乎运行正常)

我似乎连一个简单的Perl脚本都无法在fcgid下运行。我创建了一个简单的“Hello World”应用程序,并包含了用于测试FCGI是否正在运行的代码

我将脚本命名为HelloWorld.fcgi(当前fcgid设置为仅处理.fcgi文件)。代码:

从命令行运行时,它会打印“纯旧无聊…”当通过对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 config是VirtualHost指令中的默认mod_fcgid config plus:

  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>
ServerName test1.example.com
DocumentRoot/www/example
不允许超限
AddHandler cgi script.cgi
AddHandler fcgid script.fcgi
选项+ExecCGI+包括+FollowSymLinks

我使用CGI::Fast比使用FCGI更多,但我认为想法是一样的。快速cgi的目标是加载程序一次,并对每个请求进行循环迭代

FCGI的手册页上说:

use FCGI;

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

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

这意味着,在能够将任何内容打印回浏览器之前,您必须
接受请求。

Movable Type使用CGI::Fast实现FastCGI。如前所述,典型的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和Movable Type的更多文档,请访问。

问题在于“内容类型”标题发送到请求循环之外。您必须为每个请求打印“内容类型”标题。如果你搬家

打印“内容类型:text/html\n\n”

在请求循环的顶部,它应该解决问题

此外,您需要循环处理请求,否则将得不到任何好处,因此请遵循第一张海报的示例:

my $request = FCGI::Request();
while($request->Accept() >= 0) {
  print("Content-type: text/html\n\n");
}

无论如何,根据服务器的错误日志,看起来FCGI正在工作,并且被正确调用,但是脚本没有在循环中运行,等待下一个请求出现。所以您的测试脚本完成了任务——报告是否配置了FastCGI。因此,现在您应该能够重新配置MT以使用FastCGI。

尝试过,结果类似。还尝试使用简单的CGI::Fast Hello World——也失败了。真奇怪。。。
my $request = FCGI::Request();
while($request->Accept() >= 0) {
  print("Content-type: text/html\n\n");
}