PHP 和 mod_fcgid : ap_pass_brigade failed in handle_request_ipc function

标签 php linux apache mod-fcgid

这在 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

最佳答案

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

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_fastcgiApache 2.x 上的 SuExec 下根本不起作用。我只遇到了麻烦(在我们的测试中它还有许多其他问题)。问题的真正原因是 SuExec

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

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

在此期间,我尝试了 mod_fastcgi 一年,我也可以和许多其他人一起说,SuExec 在任何情况下都非常麻烦,运行起来一点也不流畅。

关于PHP 和 mod_fcgid : ap_pass_brigade failed in handle_request_ipc function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33811543/

相关文章:

php - Laravel 动态 Controller 路由

PHP:从另一个文件调用父类

python - 找出我的 sqlite 版本

linux - 在 ubuntu 服务器 17.04 上安装 gitlab-ce

php - 如何在 PHP 7.0.14 中安装 mbstring?

php - laravel 5 中应用程序 URL 的意义是什么

php - 无法在 Laravel 4 中设置缓存控制

c - 使用 C 用户空间代码从 Linux/proc 接口(interface)读取的最佳方法是什么?

Apache mod_rewrite 继承中的疯狂

Java Web 应用程序事件