Apache 2.4中的CGI脚本运行但返回空响应?

时间:2016-11-11 17:03:30

标签: apache perl cgi

在将网站从运行Apache 2.2的旧网络服务器迁移到运行Apache 2.4的新网络服务器时,我遇到了一个奇怪的CGI问题。基本上没有CGI脚本适用于新的Web服务器。他们返回500错误。但是在ScriptLog中没有“%error”部分,“%response”为空。脚本似乎正在运行,但绝对没有返回!由于没有任何意味着没有标题,结果是500错误。

加载mod_cgi模块(通过运行“apachectl -M”确认)。我们正在使用prefork MPM,所以这是正确的模块。

大多数CGI脚本都是Perl,但我们也有一个编译为C的脚本,它显示了完全相同的行为模式。即使像这样的基本测试脚本也不起作用:

#!/usr/bin/perl
print STDOUT "Content-type: text/html\n\n";
print STDOUT "Hello, World.";

我暂时为“apache”用户分配了一个shell,切换到该用户,并且能够运行其中的几个脚本。当以这种方式运行时,并非所有输出都产生有意义是的,/ usr / bin / perl确实存在,是系统上唯一的Perl副本,并且安装了perl-CGI。

所有这些脚本都在NFS共享上,新旧Web服务器都使用它。旧的Web服务器仍然可以像CGI一样提供这些脚本而没有任何问题。所以,如果还不清楚,这里的问题不在于CGI脚本本身。这是新的Web服务器的配置问题。

NFS共享在/ mnt / cgi /上安装,每个用户都有子目录。我们的Apache配置中包含的文件中有一些部分如下所示:

Alias /cgi-bin/usera /mnt/cgi/usera
<Directory /mnt/cgi/usera>
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    Require all granted
</Directory>

此目录中的脚本将在http://server.example.com/cgi-bin/usera/first.pl处访问。当我连接到此页面时,它将附加到ServerLog中指定的日志文件中(具有正确的IP地址......我xxx-ed那些):

%% [Fri Nov 11 12:00:00 2016] GET /cgi-bin/usera/first.pl HTTP/1.1
%% 500 /mnt/cgi/usera/first.pl
%request
Host: xxx.xxx.xxx.xxx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Via: 1.1 xxx.xxx.xxx.xxx:80
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-For-Port: 51380
%response

这些脚本的权限都是755,所以这不是问题。如果我从脚本目录的目录定义中删除AddHandler行,那么我可以下载脚本,因此Apache肯定能够访问它们。

新服务器是RHEL7。 SELinux处于Permissive模式,而不是Enforcing。无论如何,布尔值httpd_enable_cgi和httpd_use_nfs都是“开启”。

我尝试过的无用之处是:

  • 设置“ScriptAlias / cgi-bin / usera / mnt / cgi / usera”而不只是“Alias”。
  • 设置“ScriptAlias / cgi-bin / / mnt / cgi”。一般来说,我们不想使用ScriptAlias,因为其中一些目录中也有文本数据文件。
  • 制作脚本所有者:group apache:apache。
  • 将“AllowOverride None”添加到目录块。
  • 添加“使用CGI :: Carp'fatalsToBrowser';”到一个脚本。这什么都不返回。同样,我认为脚本运行正常,但Apache不会以某种方式接收输出。

我还应该补充一点,通常新的网络服务器工作正常。基于PHP的webapps运行得很好,当然静态内容也没问题。

所以这是很多细节,但最终的问题是:Apache如何执行CGI脚本,但根本没有输出?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在我问这个问题后,我找到了答案,确实不久。基本上,我们在此站点的配置文件中有这一行:

RLimitMEM 2000000 3000000

这会将进程内存限制为2MB(软)和3MB(硬)。它对于CGI脚本来说也太少了。 50MB / 80MB工作。为了以防万一,我们将它设置得更高。

以下是一些针对有类似问题的人的引用,以帮助那些通过Google找到此页面的人:

PHP out of memory error even though memory_limit not reached

http://www.wrensoft.com/forum/zoom-search-engine-v3-v4-v5-old-versions/29-php-cgi-script-returns-no-results-on-apache-rlimitmem-rlimitcpu

答案 1 :(得分:1)

如果你的perl脚本是

#!/usr/bin/perl
print STDOUT "Content-type: text/html\n\n";
print STDOUT "Hello, World.";

请尝试从中删除 &#34; STDOUT&#34;