Apache: Apache 提示 mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
1. 问题概述:
Apache错误日志,提示:
(32)Broken pipe: [client 192.168.1.123:39246] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
2. 相关原因:
参考下方的文章,原因暂不确定。
3. 解决办法:
尝试将Apache主配置文件(通常为httpd.conf)中的KeepAliveTimeout
从默认的5改为60,暂未再出现问题:
KeepAliveTimeout 60
Apache官方文档:
https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
https://cwiki.apache.org/confluence/display/HTTPD/php-fcgid
参考:
mod_fastcgi - PHPとmod_fcgid:ap_pass_brigadeがhandle_request_ipc関数で失敗しました
https://code-examples.net/ja/q/203ec57
mod_fcgid是什么
(2)
在 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
因此,按照之前的答案和 Apache 文档中的建议,我的 FcgidMaxRequestsPerProcess 设置为 500,PHP_FCGI_MAX_REQUESTS 设置为 10x。但我仍然收到这些错误
[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
此警告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;
}
感谢tablix.org/~avian/blog/archives/2016/05/…我在那里了解到了这一点。
大约一年前我又遇到了同样的问题。然后我会尝试很多事情。最后,在阅读文档后,我让它运行起来并取得了一些成功,我的问题就消失了。首先,您需要配置重要的:
FcgidBusyTimeout 300 [default]
FcgidBusyScanInterval 120 [default]
该指令的目的是终止挂起的应用程序。如果您的应用程序需要很长时间来处理请求,您可能需要增加默认超时。检查按 定义的时间间隔执行,请求处理需要更长的时间FcgidBusyScanInterval
FcgidBusyScanInterval
FcgidProcessLifeTime 3600 [default]
如果某个类的进程数超过 FcgidMinProcessesPerClass,则存在时间超过此时间的空闲应用程序进程将被终止。
此进程生命周期检查按配置的频率FcgidIdleScanInterval
执行。
FcgidZombieScanInterval 3 [seconds default]
模块在此时间间隔检查已完成的 FastCGI 应用程序。在此期间,应用程序可能作为僵尸存在于进程表中(在 Unix 上)。
注意:以上所有选项都可以根据您的应用程序的处理时间和需求进行增加或减少,或者应用于特定的虚拟主机。
但我的问题通过这个选项解决了:
上面的选项正在微调我的服务器,但错误似乎在一段时间后又回来了,但这个错误实际上已经解决了:
FcgidOutputBufferSize 65536 [default]
我把它改为
FcgidOutputBufferSize 0
这是模块在将数据刷新到客户端之前将从 FastCGI 应用程序读取的最大响应数据量。这会立即刷新数据,而无需等待 64KB 字节,这有助于更快地刷新进程。
我遇到的其他问题
如果您收到 Nginx 超时的 500 错误。使固定:
/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_fastcgi
Apache 2.x
mod_fastcgi
根本不起作用。仅此一点我没有遇到任何问题(我在测试中遇到了许多其他问题)。问题的真正原因是 SuExec
mod_fcgid 为每个虚拟主机生成 5 个进程,在我启动 Apache 时就是如此。现在,当我使用简单的上传脚本并发送大于 4-8KB 的文件时,对于运行该脚本的特定虚拟主机,所有这些子进程都会立即终止。
您可以通过构建调试或使用 mod_fcgid 登录来获取提示。
与此同时,我已经尝试 mod_fastcgi 一年了,我可以和很多其他人交谈,但 SuExec 很麻烦,无论如何都不能顺利工作。