无法让 Perl FastCGI 脚本在 Apache 服务器上运行:错误 500

无法让 Perl FastCGI 脚本在 Apache 服务器上运行:错误 500

我正在尝试运行一个 Apache 服务器,该服务器通过快速 CGI 执行一些脚本,但我一生都无法弄清楚如何让它真正工作。我的问题特别是“错误 500:标题之前的脚本输出结束”。

我已经阅读了很多有关此内容的文章,遵循了我能找到的所有建议,但仍然没有运气。有一些关于 IOTimeout 和 BusyTimeout 以及其他所有类型的 Fcgid 超时的信息,但这些没有任何作用,我认为我的问题与此无关。

从全新的 Linux 安装开始,这就是我所做的:

  1. 安装apachemod_fcgid
  2. /var/www/test使用一些空文件和脚本创建了一个新的空网站。我已经相应地设置了权限,只是为了确保将所有者和组更改为 http。

    $ ls -l /var/www
    drwxrwxr-x 1 http http 122 Nov  8 16:08 test/
    
    $ ls -l /var/www/test
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file01.txt
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file02.txt
    -rw-rw-r-- 1 http http   0 Nov  8 15:29 file03.txt
    -rwxr-xr-x 1 http http 107 Nov  8 16:08 run.fcgi*
    
    $ cat /var/www/test/run.fcgi 
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    print "Content-type: text/html\n\n";
    print "Hello world.\n";
    
  3. 我已将此附加到/etc/httpd/conf/httpd.conf

    LoadModule fcgid_module modules/mod_fcgid.so
    <IfModule fcgid_module>
      AddHandler fcgid-script .fcgi
    </IfModule>
    
    <VirtualHost *:80>
      DocumentRoot /var/www/test
      <Directory /var/www/test>
        Options +Indexes +ExecCGI
        Require all granted
      </Directory>
    </VirtualHost>
    

现在,我可以从终端完美运行该脚本。然后,当我转到 时,http://localhost我会按预期获得目录文件列表,但是当我打开脚本时,我会收到上面提到的错误 500。 apache 的错误日志显示了这一点(剪掉了不必要的部分):

Content-type: text/html

Hello world.
(...) Connection reset by peer (...) mod_fcgid: error reading data from FastCGI server, referer: (...)                                                                                  
(...) End of script output before headers: run.fcgi, referer: (...)

为什么脚本的输出被记录到错误日志中?我认为这与权限和所有权有关,但我不知道如何,我想我已经相应地设置了所有这些。你知道我能做些什么来让它运行吗?

我正在尝试在 64 位 Arch linux 机器上运行所有这些。

谢谢你们!

答案1

Apache 配置是设置 FastCGI 的多种不同方法之一。此特定配置可能不适用于所有发行版和 Apache 配置风格。这个配置对你有用。

因为 500 错误表明 apache 认为您的脚本正在执行,并且由于您的代码位于日志中,我们知道 apache 找到了该文件。然而,FastCGI服务器需要与 apache 进行额外的通信,而不是 CGI脚本。您的 FastCGI 代码必须等待来自 apache 的请求。在 中perl,该CGI::Fast模块处理该额外层。

  1. 在您的问题中使用原始 Apache 配置。
  2. 确保您拥有该perl模块:CGI::Fast
  3. 像这样修改 FastCGI 服务器脚本:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use CGI::Fast;
    
    while (my $q = CGI::Fast->new) {
        print "Content-type: text/html\n\n";
        print "Hello world.\n";
    }
    

这段代码构成了一个FastCGI服务器。等待CGI::Fast->new并接收请求和环境,apache并设置perl运行时环境以轻松充当 FastCGI 服务器。该环境包含 CGI 代码所需的重要信息。

参考:

  1. https://httpd.apache.org/mod_fcgid/
  2. perldoc CGI::Fast
  3. perldoc CGI

答案2

您可能需要一个 FCGI 包装器,通过 php-cgi 命令执行整个内容。在您的虚拟主机中指定:

AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch AddHandler fcgid-script .php AddHandler fcgid-script .php5 FCGIWrapper /home/.../fcgi-bin/php5.fcgi .php FCGIWrapper /home/.../fcgi-bin/php5.fcgi .php5

然后准备脚本/home/.../fcgi-bin/php5.fcgi

#!/bin/bash PHPRC=$PWD/../etc/php5 export PHPRC umask 022 export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=99999 export PHP_FCGI_MAX_REQUESTS SCRIPT_FILENAME=$PATH_TRANSLATED export SCRIPT_FILENAME exec /usr/bin/php5-cgi

相关内容