CGI脚本(Perl)在带有fastcgi_module的Apache下永远运行

时间:2014-02-07 16:24:19

标签: apache perl apache2 cgi fastcgi

我正在尝试使用fastcgi_module在Apache2(Apache / 2.4.6(Ubuntu))中运行cgi脚本。这是我设置的虚拟主机

<VirtualHost *:8080>
        ServerName cgi.local
        DocumentRoot /home/noobeana/CGI
        <Directory /home/noobeana/CGI>
                AllowOverride All
                Order allow,deny
                Allow from all
                Require all granted
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                SetHandler fastcgi-script
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

这是我为运行测试而创建的Perl脚本(正确 775'ed ):{/ 1}}:

/home/noobeana/CGI/test.pl

Perl可执行文件的路径确实是#!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello there!<br />\n"; ,其他一切看起来都不错,但是当我在浏览器中打开http://cgi.local:8080/test.pl脚本永远运行时 - 我必须停止Apache强制退出。此外,/usr/bin/perl正在输出到Apache的错误日志(而不是浏览器),只要脚本正在运行,它就会显示以下多行:

print

我不确定这两个问题(浏览器中没有输出[Fri Feb 07 10:24:54.059738 2014] [:warn] [pid 4708:tid 140365322880896] FastCGI: (dynamic) server "/home/noobeana/CGI/test.pl" started (pid 4771) Content-type: text/html Hello there!<br /> [Fri Feb 07 10:24:54.078938 2014] [:warn] [pid 4708:tid 140365322880896] FastCGI: (dynamic) server "/home/noobeana/CGI/test.pl" (pid 4771) terminated by calling exit with status '0' [Fri Feb 07 10:24:59.663494 2014] [:warn] [pid 4708:tid 140365322880896] FastCGI: (dynamic) server "/home/noobeana/CGI/test.pl" restarted (pid 4773) Content-type: text/html Hello there!<br /> [Fri Feb 07 10:24:59.665855 2014] [:warn] [pid 4708:tid 140365322880896] FastCGI: (dynamic) server "/home/noobeana/CGI/test.pl" (pid 4773) terminated by calling exit with status '0' 和脚本没有终止)是否相关。

1 个答案:

答案 0 :(得分:5)

你想要做的是不可能的。 fastcgi_module只能运行实现FastCGI接口的脚本,而您编写的脚本不支持该脚本。相反,fastcgi_module一再尝试启动你的“FastCGI”脚本,看到它打印出一些内容并立即退出 - 哪些FastCGI脚本不应该这样做 - 并且不知道它在做错了什么。

实现正确接口的简单脚本可以使用CGI::Fast模块实现:

#!/usr/bin/perl
use strict;
use CGI::Fast;
while (my $CGI = CGI::Fast->new) {
    print $CGI->header();
    print "Hello there\n";
}

(FastCGI协议有点复杂,所以没有使用模块就没有合理的方法来实现它。)