20

在https://stackoverflow.com/a/12686252/219116之前已经询问并回答了这个问题,但是那里的解决方案对我不起作用。

mod_fcgid 配置

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidIPCDir /var/run/mod_fcgid/
  FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm

  FcgidIdleTimeout 60
  FcgidProcessLifeTime 120
  FcgidMaxRequestsPerProcess 500
  FcgidMaxProcesses 150
  FcgidMaxProcessesPerClass 144
  FcgidMinProcessesPerClass 0
  FcgidConnectTimeout 30
  FcgidIOTimeout 600
  FcgidIdleScanInterval 10
  FcgidMaxRequestLen 269484032

</IfModule>

php-cgi 脚本

#!/bin/bassh
export PHPRC=/var/www/vhosts/example.com/etc/
export PHP_FCGI_MAX_REQUESTS=5000
exec /usr/bin/php-cgi

系统详情

  • CentOS Linux 版本 7.1.1503(核心)
  • httpd-2.4.6-31.el7.centos.x86_64
  • mod_fcgid-2.3.9-4.el7.x86_64
  • php56u-cli-5.6.12-1.ius.centos7.x86_64

所以我的 FcgidMaxRequestsPerProcess 设置为 500,我的 PHP_FCGI_MAX_REQUESTS 设置为 10 倍,如前面的答案和 Apache 文档中所建议的那样。然而我仍然得到这些错误

[Thu Nov 19 18:16:48.197238 2015] [fcgid:warn] [pid 6468:tid 139726677858048]
(32)Broken pipe: [client X.X.X.X:41098] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
4

3 回答 3

22

大约一年前我也遇到了同样的问题,然后我尝试了很多事情,最后我在阅读文档后做了一些即时运行的事情,我的问题就消失了。首先需要设置的重要事项为:

FcgidBusyTimeout     300 [default]
FcgidBusyScanInterval    120 [default]

该指令的目的是终止挂起的应用程序。对于可能需要更长时间来处理请求的应用程序,可能需要增加默认超时。因为检查是在定义的时间间隔内执行的FcgidBusyScanInterval,所以请求处理可能会被允许进行更长的时间。

FcgidProcessLifeTime     3600 [default]

如果该类的进程数超过 ,则存在超过此时间的空闲应用程序进程将被终止FcgidMinProcessesPerClass

此进程生命周期检查以配置的频率执行FcgidIdleScanInterval

FcgidZombieScanInterval   3 [seconds default]

该模块在此时间间隔检查退出的 FastCGI 应用程序。在这段时间内,应用程序可能作为僵尸(在 Unix 上)存在于进程表中。

注意:以上所有选项根据您的应用程序处理时间或需要减少或增加或适用于特定的虚拟主机。

但我的问题通过这个选项解决:

上面的选项已经调整了我的服务器,但过了一段时间,错误似乎又出现了,但这个错误确实可以解决:

 FcgidOutputBufferSize   65536 [default]

我已将其更改为

 FcgidOutputBufferSize   0

这是模块在将数据刷新到客户端之前从 FastCGI 应用程序读取的最大响应数据量。这将立即刷新数据,而不是等待 64KB 的字节,这确实有助于我更快地刷新进程。

我遇到的其他问题

如果 500 错误来自 Nginx 超时。修复:

/etc/nginx/nginx.conf

keepalive_timeout  125;
proxy_read_timeout 125;
proxy_connect_timeout 125;
fastcgi_read_timeout 125;

我会间歇性地收到 MySQL“MySQL 服务器已消失”错误,这需要再进行一次调整: /etc/my.conf

wait_timeout = 120

然后,为了好玩,我继续提高了我的 PHP 内存限制,以防万一: /etc/php.ini

memory_limit = 256M

使用 SuExec

mod_fastcgiSuExec在on下根本不起作用Apache 2.x。我只遇到了麻烦(它在我们的测试中还有许多其他问题)。问题的真正原因是 SuExec

就我而言,这对我来说是一个初创公司,我启动了 Apache,mod_fcgid 为每个虚拟主机生成了 5 个进程。现在,当使用一个简单的上传脚本并提交一个大于 4-8KB 的文件时,所有这些子进程都会为执行该脚本的特定 vhost 立即终止。

可以在 mod_fcgid 中进行调试构建或加速日志记录,这可能会提供线索。

在此期间,我尝试了 mod_fastcgi 1 年,我也可以和其他许多人说,SuExec 在任何情况下都只是麻烦且运行不顺畅。

于 2015-12-03T20:19:24.173 回答
10

该警告与任何选项无关,Fcgidxxx只是由于客户端在服务器有机会响应之前关闭了他们的连接端。

从实际来源:

/* Now pass any remaining response body data to output filters */
if ((rv = ap_pass_brigade(r->output_filters, brigade_stdout)) != APR_SUCCESS) {
    if (!APR_STATUS_IS_ECONNABORTED(rv)) {
        ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
                      "mod_fcgid: ap_pass_brigade failed in "
                      "handle_request_ipc function");
    }

    return HTTP_INTERNAL_SERVER_ERROR;
}

归功于发现它的Avian博客。

于 2018-01-26T19:30:56.857 回答
0

This error can occur when asynchronous requests are used by a website. These do not directly show up as an erroneous result on a web page, but they trigger the execution of PHP scripts. If such scripts fail during their execution and do not return a result, this or similar strange errors are logged. What you need to do is to identify the JavaScript (AJAX) calls to your PHP scripts and find out why the execution of these scripts is failing.

Clients that close the connection before waiting for the server to respond. The client is indeed closing it, but it is doing so, because it does not receive a response from the AJAX call, and that again is caused by a faulty script of the website.

于 2019-12-04T12:29:43.993 回答