我正在尝试运行一个 Apache 服务器,该服务器通过快速 CGI 执行一些脚本,但我一生都无法弄清楚如何让它真正工作。我的问题特别是“错误 500:标题之前的脚本输出结束”。
我已经阅读了很多有关此内容的文章,遵循了我能找到的所有建议,但仍然没有运气。有一些关于 IOTimeout 和 BusyTimeout 以及其他所有类型的 Fcgid 超时的信息,但这些没有任何作用,我认为我的问题与此无关。
从全新的 Linux 安装开始,这就是我所做的:
- 安装
apache
并mod_fcgid
。 /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";
我已将此附加到
/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
模块处理该额外层。
- 在您的问题中使用原始 Apache 配置。
- 确保您拥有该
perl
模块:CGI::Fast
像这样修改 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 代码所需的重要信息。
参考:
- https://httpd.apache.org/mod_fcgid/
perldoc CGI::Fast
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