PHP和mod_fcgid:ap_pass_brigade在handle_request_ipc函数中失败

时间:2015-11-19 18:22:46

标签: php linux apache mod-fcgid

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

mod_fcgid config

<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设置为10x,如前面的答案和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

3 个答案:

答案 0 :(得分:14)

我也在一年前遇到同样的问题然后我尝试了很多东西,最后我在文档阅读后完成了一些命中和运行的事情,我的问题就消失了。首先需要设置的重要事项为:

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_fastcgi SuExec下的Apache 2.x下{p> Private Sub cir(ByVal x1 As Integer, ByVal y1 As Integer, ByVal r1 As Integer, ByVal r2 As Integer, ByVal c As Color) Dim pic As Bitmap = New System.Drawing.Bitmap(1000, 1000) Dim th As Double Dim nx, ny As Integer For th = 0 To 360 Step 0.5 nx = x1 + r1 * Cos(th * 22 / 7 / 180) ny = x1 + r2 * Sin(th * 22 / 7 / 180) pic.SetPixel(nx, ny, c) PictureBox1.Image = pic Next th End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click cir(100, 100, 50, 50, Color.Blue) End Sub 根本不起作用。我只有麻烦(它在我们的测试中还有许多其他问题)。问题的真正原因是SuExec

在我的情况下,这是一个初创公司,我启动Apache,mod_fcgid为每个vhost产生了5个进程。现在,当使用简单的上载脚本并提交大于4-8KB的文件时,对于执行脚本的特定vhost,所有这些子进程都会被立即终止。

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

我在此期间尝试了mod_fastcgi 1年,我也可以和其他许多人说SuExec只是麻烦而且根本不会顺利运行。

答案 1 :(得分:4)

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

从实际来源:

Fcgidxxx

归功于发现它的Avian's Blog

答案 2 :(得分:0)

网站使用异步请求时,可能会发生此错误。这些不会直接显示为网页上的错误结果,但是会触发PHP脚本的执行。如果此类脚本在执行期间失败,并且未返回结果,则会记录此或类似的奇怪错误。您需要做的是识别对PHP脚本的JavaScript(AJAX)调用,并找出为什么这些脚本执行失败的原因。

在等待服务器响应之前关闭连接的客户端。客户端确实确实在关闭它,但它正在这样做,因为它没有收到来自AJAX调用的响应,而这又是由网站的脚本错误引起的。