Apache 2.4中的CGI脚本运行但返回空响应?
将网站从运行Apache 2.2的较早的Web服务器移动到运行Apache 2.4的较新的Web服务器时,我遇到了一个奇怪的CGI问题。基本上没有CGI脚本在新的web服务器上工作。他们返回500错误。但是在ScriptLog中没有“%error”部分,“%response”为空。脚本似乎正在运行,但完全没有返回!由于没有意味着没有头,结果是500错误。Apache 2.4中的CGI脚本运行但返回空响应?
加载mod_cgi模块(通过运行“apachectl -M”确认)。我们正在使用prefork MPM,因此这是正确的模块。
大多数CGI脚本都是Perl,但我们也有一个编译C的脚本,它显示了完全相同的行为模式。即使是这样一个基本的测试脚本不起作用:
#!/usr/bin/perl
print STDOUT "Content-type: text/html\n\n";
print STDOUT "Hello, World.";
我临时分配一个壳了“阿帕奇”的用户,切换到该用户,并能够运行多个这些脚本。当这种方式运行时,并不是所有产生有意义的输出,但它们都运行。是的,/ usr/bin/perl确实存在,是系统上唯一的Perl副本,并且安装了perl-CGI。
所有这些脚本都位于旧的和新的Web服务器使用的NFS共享上。旧的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处于许可模式,不是强制执行。无论如何,布尔值httpd_enable_cgi和httpd_use_nfs都是“on”。
其中我试图不利于事情是:
- 设置 “的ScriptAlias/cgi-bin目录/用户A的/ mnt/CGI /用户A”,而不仅仅是 “别名”。
- 设置“ScriptAlias/cgi-bin// mnt/cgi”。一般来说,我们不希望使用ScriptAlias,因为在这些目录中还有文本数据文件。
- 制作脚本所有者:group apache:apache。
- 将“AllowOverride None”添加到目录块。
- 添加“使用CGI :: Carp'fatalsToBrowser';”到脚本。这不会返回。再次,我认为脚本运行正常,但输出结果不被Apache以某种方式接收。
我还应该补充说,一般来说新的网络服务器工作正常。基于PHP的webapps运行得很好,当然静态内容也没有问题。
所以这是很多细节,但最终的问题是这样的:Apache如何执行CGI脚本,但根本没有输出?有什么想法吗?
果然不会太长时间后,我问这个问题,我找到了答案。基本上,我们在配置文件中这一行这个网站:
RLimitMEM 2000000 3000000
这限制了流程为2MB(软)和3MB(硬)的内存。对于CGI脚本来说也太少了。 50MB/80MB的工作。为了以防万一,我们将其设置得更高。
这里是具有用于那些你的利益谁通过谷歌找到了这个网页类似问题的人一些参考:
PHP out of memory error even though memory_limit not reached
如果你的Perl脚本是
#!/usr/bin/perl
print STDOUT "Content-type: text/html\n\n";
print STDOUT "Hello, World.";
请尝试删除“STDOUT”从它。
谢谢。我尝试过,但没有帮助。 无论哪种方式,这是一个基本的测试脚本,应该很容易成功。真正的问题更复杂。 –