【问题标题】:Connection reset by peer: mod_fcgid: error reading data from FastCGI server对等方重置连接:mod_fcgid:从 FastCGI 服务器读取数据时出错
【发布时间】:2012-08-22 14:55:50
【问题描述】:

我在 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
[2012 年 8 月 28 日星期二 14:17:28] [错误] [客户端 x.x.x.x] 脚本头过早结束:backup.php,引用者:http://example.com/backup/backup.php

有人知道如何解决这个问题吗?我真的被困在这里,无法在互联网上找到解决方案。

希望任何人都可以分享他们的知识。

谢谢。 詹姆斯

【问题讨论】:

    标签: php apache mod-fcgid


    【解决方案1】:

    我设法通过添加 FcgidBusyTimeout 解决了这个问题。以防万一有人跟我有类似的问题。

    这是我在 apache.conf 上的设置:

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

    【讨论】:

    • 我正在使用 go daddy Linux 服务器。我来自windows背景。您究竟在哪里添加 FcgidBusyTimeout?
    • @user1051505 - 我在特定域的 vhost 文件或 apache 配置文件中添加了它。
    • 如果您使用的是 Plesk 12.5,您可以在 Plesk > 您的域 > Apache 和 nginx 设置 > HTTP 的附加指令下添加该 sn-p(没有第一行和最后一行,VirtualHost 部分)( S)。
    • 我在主 conf 文件中为每个虚拟主机添加了它。运行良好。
    • 我必须将此行添加到 /etc/apache2/sites-available/000-default.conf 和/或 /etc/apache2/sites-available/default-ssl.conf 才能工作跨度>
    【解决方案2】:

    我在 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 Wrapper 脚本。

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

    对于我的场景,chmod -o+rx /var/www 当然是必需的,因为使用的 SuExec 用户不是 www-data 用户组的成员 - 当然出于安全原因,他们不应该是成员。

    【讨论】:

    • 我检查了权限,还检查了FcgidBusyTimeout 3600,但又是 500
    • 嗨奥利弗,我想我有同样的问题。但我是 linux / ubuntu 的新手。您能否举例说明如何设置正确的权限?
    【解决方案3】:

    如果要安装PHP版本

    --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 模式。

      设置正确的模式是不可能的(可能是因为文件已打开或某事),所以我从另一个域目录复制了该文件,该目录已经设置了适当的权限并修复了所有问题。

      【讨论】:

        【解决方案5】:

        我用不同的简单解决方案遇到了同样的问题。

        问题

        我按照this question on Ask Ubuntu 接受的答案安装了 PHP 5.6。 在使用 Virtualmin 将特定虚拟服务器从 PHP 5.5 切换到 PHP 5.6 后,我收到 500 Internal Server Error 并且在 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解决了问题:

        • sudo apt-get install php5.6-cgi 如果您使用的是 PHP 5.6

        • sudo apt-get install php5-cgi 如果您使用的是不同的 PHP 5 版本

        • sudo apt-get install php7.0-cgi 如果您使用的是 PHP 7

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

        【讨论】:

          【解决方案6】:

          著名的 Moodle "replace.php" 脚本也可以产生这种情况。 对我来说,它需要很长时间才能运行,然后在浏览器中出现 500 条消息并且在我的 apache 错误日志文件中出现上述错误消息。

          我跟进了@james-wise 的回答: FcgidBusyApache documentation 中有可读的描述。我试过这个:通过在 /etc/apache2/mods-available/fcgid.conf 中插入以下行,将 apache 给我的脚本运行的时间加倍

          FcgidBusyTimeout 600
          

          然后我重新启动 Apache 并尝试再次运行我的 replace.php 脚本。

          幸运的是,这一次脚本实例运行完成,所以对于我来说,这是一个解决方案。

          【讨论】:

          • 我正在使用 go daddy Linux 服务器。我来自windows背景。您究竟在哪里添加 FcgidBusyTimeout?
          • 使用共享主机服务,您很可能无法访问特权目录,例如 /etc/apache2/。我认为,这限制了本次讨论对您的有用性。谷歌帮我找到GoDaddy guidancehth
          【解决方案7】:

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

          就我而言,我正在运行 virtualmin 并在我的虚拟机的 php.ini 中 安全模式=开启。

          在我的虚拟机的错误日志中,我的 fcgi 连接被对等方重置:mod_fcgid: error reading data from FastCGI server

          在我的主要 apache 错误日志中,我得到: PHP 致命错误:指令 'safe_mode' 在 PHP 中的 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

          【讨论】:

            【解决方案8】:

            不在this questions askers case,但经常:

            "premature end of script headers" 错误是什么意思?

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

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

            如何解决这个问题?

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

            【讨论】:

            • 我发现这个错误是连接超时。我的 vhost.conf (pastebin.com/qwbZ7wcv) 和 php 包装脚本 (pastebin.com/wUAeLu0u) 中有这一部分。也许我的配置有问题或遗漏?
            • 我建议您联系您的系统管理员并与她澄清这一点。如果您在 CLI 环境中执行脚本,您还应该了解该脚本需要多长时间。那不会有任何 PHP 超时配置。
            • 我设法通过添加“FcgidBusyTimeout ”解决了这个问题。以防万一有人跟我有类似的问题。
            • 您选择了&lt;time-in-seconds&gt; 的哪个值,出于什么原因?你也可以分享一下吗?请添加 to your answer,以便其他人更清楚您是如何以及为什么以这种方式进行故障排除的。
            • 在上面看到我的回答
            【解决方案9】:

            我在长时间运行的脚本中遇到了同样的问题,并带有错误消息 error_log 中的“脚本头过早结束:index.php”和“对等方重置连接:mod_fcgid:从 FastCGI 服务器读取数据时出错”。 经过数小时的测试,这对我有帮助(CentOS 6、PHP-FPM 7、Plesk 12.5.30):

            编辑配置文件:

            /etc/httpd/conf.d/fcgid.conf

            设置更长的运行时间。在我的情况下是 600 秒

            创建新条目:

            FcgidBusyTimeout 600

            调整以下条目:

            FcgidIOTimeout 600

            FcgidConnectTimeout 600

            重启httpd:

            服务 httpd 重启

            【讨论】:

              【解决方案10】:

              在 CentOS 发行版中,suexec 被编译为仅在 /var/www 中运行。如果您尝试在其他地方设置 DocumentRoot,则必须重新编译它 - apache 日志中的错误是: (104) Connection reset by peer: mod_fcgid: 从 FastCGI 服务器读取数据时出错 脚本头过早结束:php5.fcgi

              【讨论】:

                【解决方案11】:

                只需安装 php5-cgi 在Debian中

                sudo apt-get install php5-cgi

                在 Centos 中

                sudo yum install php5-cgi

                【讨论】:

                • 没有可用的 php5-cgi 包
                【解决方案12】:

                检查 /var/lib/php/session 及其权限。该目录应该是用户可写的,以便可以存储会话

                【讨论】:

                  【解决方案13】:

                  如前所述,这可能是由于 fcgi 处理程序权限问题而发生的。如果您使用的是 suexec - 不要忘记检查 apache 是否启用了此模块。

                  【讨论】:

                    【解决方案14】:

                    我将最大执行时间增加到 600 秒!

                    【讨论】:

                      【解决方案15】:

                      如果您在像我这样的共享服务器上,主机说这是达到内存限制的结果,因此他们会杀死脚本,从而导致在此错误中看到“脚本头过早结束”。他们向我推荐了这个:

                      https://help.dreamhost.com/hc/en-us/articles/216540488-Why-did-procwatch-kill-processes-on-my-Shared-serv

                      由于内存增加,问题就解决了。我认为 wordpress 上的备份插件 Updraft 可能在其职责/设置方面过于热情。

                      【讨论】:

                        【解决方案16】:

                        在我的例子中,我为我的 PHP 文件使用了自定义扩展,我必须编辑 /etc/apache2/conf-available/php7.2-fpm.conf 并添加以下代码:

                            <FilesMatch ".+\.YOUR_CUSTOM_EXTENSION$">
                                SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
                            </FilesMatch>
                        

                        【讨论】:

                          【解决方案17】:

                          我已经尝试了我在这个问题上找到的大多数答案。我的问题是 wp-cron.php 执行特定功能。

                          我正在开发 Plesk CentOS7,Apache 服务器。

                          我使用this related question and suggested answer 帮助我了解如何使用命令行调整 fcgid.conf 内存限制。

                          在尝试解决 fcgid.conf 文件 (/etc/httpd/conf.d/fcgid.conf) 的限制并优雅地重新启动 apache 时,我发现没有任何变化。

                          在看到其他 cron 作业运行正常后,我决定重新参考我在 functions.php 中声明的函数,发现声明的某些参数没有正确指定,因此发生了一个循环,最终会导致到超时。

                          修复此问题并再次运行 cron 后,它运行正常。

                          希望这对处于类似位置的其他人有所帮助!

                          【讨论】:

                            【解决方案18】:

                            我遇到了同样的问题(安装了 Plesk 12)。 但是,当我从将 PHP 作为 FastCGI 执行切换到 Apache 模块时,网站就可以正常工作了。

                            检查了我的 suexec 日志:

                            $ cd /var/log/apache2/
                            $ less suexec.log
                            

                            当你发现这样的事情时:

                            [2015-03-22 10:49:00]: directory is writable by others: (/var/www/cgi-bin/cgi_wrapper)
                            [2015-03-22 10:49:05]: uid: (10004/gb) gid: (1005/1005) cmd: cgi_wrapper
                            

                            试试这个命令

                            $ chown root:root /var/www/cgi-bin/cgi_wrapper
                            $ chmod 755 /var/www/cgi-bin/cgi_wrapper
                            $ shutdown -r now
                            

                            作为根用户。

                            希望对你有帮助。

                            【讨论】:

                            • CGI 包装脚本应该由 Web 服务器用来启动服务器进程的用户和组的正确组合拥有。除此之外,不需要完全重新启动服务器 - service apache2 restart 足以重新启动网络服务器..
                            猜你喜欢
                            • 2017-09-30
                            • 2014-10-27
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-07-13
                            • 1970-01-01
                            • 1970-01-01
                            • 2014-10-16
                            • 1970-01-01
                            相关资源
                            最近更新 更多