连接被对端重置:mod_fcgid:从FastCGI服务器读取数据时出错

58

我在PHP上遇到了问题,我的应用程序正在尝试运行一个PHP备份文件,突然出现HTTP错误500代码。我已经检查了日志,看到以下信息:

[Tue Aug 28 14:17:28 2012] [warn] [client x.x.x.x] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://example.com/backup/backup.php
[Tue Aug 28 14:17:28 2012] [error] [client x.x.x.x] Premature end of script headers: backup.php, referer: http://example.com/backup/backup.php

有人知道如何解决吗?我真的陷入了困境,无法在互联网上找到解决方案。

希望有人能分享他们的知识。

谢谢, 詹姆斯

18个回答

32

我成功解决了这个问题,通过添加FcgidBusyTimeout。以防万一如果有人和我遇到类似的问题。

这是我的apache.conf设置:

<VirtualHost *:80>
.......
<IfModule mod_fcgid.c>
FcgidBusyTimeout 3600
</IfModule>
</VirtualHost>

我正在使用 GoDaddy 的 Linux 服务器。我的背景是 Windows。你在哪里添加 FcgidBusyTimeout? - user1051505
@user1051505 - 我将其添加到特定域的vhost文件或Apache配置文件中。 - James Wise
7
如果您正在使用Plesk 12.5版本,您可以在Plesk控制面板的“您的域名”下找到“Apache & nginx设置”,并将该片段(不包括第一行和最后一行的VirtualHost部分)添加到“HTTP(S)的附加指令”中以实现修改。 - Marco Marsala
我在主配置文件中为每个虚拟主机添加了它。运行良好。 - Parapluie
我必须在 /etc/apache2/sites-available/000-default.conf 和/或 /etc/apache2/sites-available/default-ssl.conf 中添加这行代码才能正常工作。 - Alphacoder
谢谢!它起作用了。我将其添加到我的httpd服务器配置中。 - Prasad Kumarasinghe

17

Apache2 日志文件中出现了非常相似的错误:

(104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
Premature end of script headers: phpinfo.php

在检查包装脚本和Apache2设置后,我意识到/var/www/没有相应的权限。因此,FCGId包装脚本根本无法读取。

ls -la /var/www
drwxrws---  5 www-data     www-data     4096 Oct  7 11:17 .

对于我的情况,当然需要执行chmod -o+rx /var/www,因为使用的SuExec用户不是www-data用户组的成员——出于安全原因,他们也不应该是成员。


4
我检查了权限和 FcgidBusyTimeout 3600,但还是遇到了500错误。 - Yuseferi
嗨,Oliver, 我想我遇到了同样的问题。但我是Linux / Ubuntu的新手。你能给我一个命令行的例子,告诉我如何设置正确的权限吗? - Jorge Mauricio

5

如果你想安装PHP版本小于5.3.0,你必须替换

--enable-cgi

使用:

--enable-fastcgi

在您的./configure语句中,从php.net文档中摘录:
--enable-fastcgi

如果启用此选项,CGI模块将支持FastCGI。自PHP 4.3.0版本以来已经可用。
自PHP 5.3.0版本开始,不再存在此参数,而是通过--enable-cgi启用。编译后,./php-cgi -v应该如下所示:
PHP 5.2.17 (cgi-fcgi) (built: Jul  9 2013 18:28:12)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies

注意 (cgi-fcgi)


4
我遇到了这个问题并意识到文件cgi-bin/php-fcgi没有执行权限。
它的模式为644,而应该是755模式。
设置正确的模式是不可能的(可能是因为文件被打开或其他原因),所以我从另一个域目录中复制了该文件,那里已经设置了正确的权限,这样问题就得到解决了。

3

我曾经遇到过同样的问题,但是采用了不同而简单的解决方案。

问题

我按照这个Ask Ubuntu上的问题中所接受的答案安装了PHP 5.6。在使用Virtualmin将特定虚拟服务器从PHP 5.5切换到PHP 5.6后,我收到了500内部服务器错误,并且在apache错误日志中有相同的条目:

[Tue Jul 03 16:15:22.131051 2018] [fcgid:warn] [pid 24262] (104)Connection reset by peer: [client 10.20.30.40:23700] mod_fcgid: error reading data from FastCGI server
[Tue Jul 03 16:15:22.131101 2018] [core:error] [pid 24262] [client 10.20.30.40:23700] End of script output before headers: index.php

原因

简单来说:我没有安装php5.6-cgi

解决方法

安装该软件包并重新加载apache即可解决问题:

  • 如果您使用PHP 5.6,请运行sudo apt-get install php5.6-cgi

  • 如果您使用其他PHP 5版本,请运行sudo apt-get install php5-cgi

  • 如果您使用PHP 7,请运行sudo apt-get install php7.0-cgi

然后使用service apache2 reload以应用配置。


2

在调试virtualmin/apache相关错误时,我遇到了这个问题。

在我的情况下,我正在运行virtualmin,并且在我的虚拟机的php.ini中设置了safe_mode=On。

在我的虚拟机错误日志中,我得到了以下错误信息:fcgi Connection reset by peer: mod_fcgid: error reading data from FastCGI server

在我的主要apache错误日志中,我得到了以下错误信息: PHP Fatal error: Directive 'safe_mode' is no longer available in PHP in Unknown on line 0

在我的情况下,我只需在php.ini中将safe_mode = Off设置为关闭,并重新启动apache即可。

stackoverflow.com/questions/18683177/where-to-start-with-deprecated-directive-safe-mode-on-line-0-in-apache-error


2
我曾遇到长时间运行脚本时出现错误信息“index.php: 未正常结束脚本头部”和“mod_fcgid: 错误的数据读取连接重置”,并在error_log中记录。 经过几个小时的测试,以下步骤对我很有帮助(CentOS 6,PHP-FPM 7,Plesk 12.5.30):
编辑配置文件:
/etc/httpd/conf.d/fcgid.conf
设置更长的运行时间。 在我的情况下是600秒。
创建新条目:
FcgidBusyTimeout 600
调整以下条目:
FcgidIOTimeout 600 FcgidConnectTimeout 600
重启httpd:
service httpd restart

2
在CentOS版本中,suexec只编译为在/var/www下运行。如果您尝试将DocumentRoot设置在其他地方,则需要重新编译它-在apache日志中的错误为: (104)连接被对等方重置:mod_fcgid:从FastCGI服务器读取数据时出错 脚本头部提前结束:php5.fcgi

2

虽然不是这个问题提问者的情况,但经常发生:

什么是“脚本标头的过早结束”错误?

该错误意味着FCGI调用意外退出。

在某些情况下,这意味着脚本“backup.php”已崩溃。

如何解决这个问题?

如果脚本崩溃是原因,请修复脚本以使其不会崩溃。然后,此错误也将被修复。要查找脚本是否崩溃以及为什么崩溃,您需要对其进行调试。例如,您可以检查PHP错误日志。通常记录到STDERR的错误会进入FCGI的错误处理程序。


1
我通过添加“FcgidBusyTimeout <time-in-seconds>”来解决了这个问题。以防有人跟我遇到类似的问题。 - James Wise
请查看我在上面的回答。 - James Wise
-1 这不一定是情况 - 并且错误地说必须有语法错误才能触发此消息。例如,当PHP从CGI切换到Fast-CGI模式时,这些错误可能会发生(并且通常会发生)。 - Jongosi
@Jongosi:没错,我改了答案,之前只是猜测,而给出的答案表明了那个猜测是错误的。我保留它作为参考,以防有人单独查找错误信息。 - hakre
我将我的max_execution_time设置为720,同时设置了FcgidBusyTimeout 3600,在index.php中我只是放置了die('debug'),但还是出现了500错误!!! - Yuseferi
显示剩余4条评论

2
著名的Moodle“replace.php”脚本也可能会出现这种情况。对我来说,它运行了很长时间,然后在浏览器中失败并且在我的Apache错误日志文件中也出现了上述错误信息。
我跟进了@james-wise的回答:FcgidBusyApache文档中有详细描述。我尝试了以下操作:通过在/etc/apache2/mods-available/fcgid.conf中插入以下行,将Apache给予我的脚本运行的时间加倍。
FcgidBusyTimeout 600

然后我重新启动了Apache,并尝试再次运行我的replace.php脚本。
幸运的是,这一次脚本实例已经成功执行完成,对于我的目的来说,这就是一个解决方案。

我正在使用GoDaddy的Linux服务器。我来自Windows背景。您在哪里添加FcgidBusyTimeout? - user1051505
使用共享托管服务,您很可能无法访问特权目录,例如 /etc/apache2/。所以我认为这限制了这个讨论对您的实用性。谷歌帮助我找到了 GoDaddy 指南 hth。 - owenmck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接