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

这已经被问及在https://stackoverflow.com/a/12686252/219116之前回答,但是,解决scheme没有为我工作。

mod_fcgidconfiguration

<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文档中所build议的。 但我仍然得到这些错误

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

Solutions Collecting From Web of "PHP和mod_fcgid:ap_pass_brigade在handle_request_ipc函数中失败"

大约一年之后,我也遇到了同样的问题,那时候我已经尝试了很多东西,最后我在文档阅读之后完成了一些命中和运行的事情,并且我的问题消失了。 首先要把重要的事情设置为:

 FcgidBusyTimeout 300 [default] FcgidBusyScanInterval 120 [default] 

这个指令的目的是终止挂起的应用程序 。 对于需要更长时间处理请求的应用程序,可能需要增加默认的超时时间。 由于检查是按照FcgidBusyScanInterval定义的间隔执行的,因此请求处理可能允许进行较长时间

 FcgidProcessLifeTime 3600 [default] 

如果该类的FcgidMinProcessesPerClass数超过了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 

然后,只是为了funsies,我继续增加我的PHP内存限制,以防万一: /etc/php.ini

 memory_limit = 256M 

使用SuExec

Apache 2.x SuExecmod_fastcgi完全不起作用。 除此之外我没有什么麻烦(在我们的测试中也有很多其他的问题)。 您的问题的真正原因是SuExec

在我的情况下,这是我的一个启动,我启动Apache,mod_fcgid每个虚拟主机精确产生5个进程。 现在,当使用一个简单的上传脚本并提交一个大于4-8KB的文件时,所有这些子进程都立即被杀死,这个脚本就被执行了。

在mod_fcgid中进行调试编译或启动日志可能会给出一些线索。

我在同一时间尝试了mod_fastcgi一年,我也可以和其他许多人说,SuExec不过是麻烦,而且在任何情况下都运行得不顺利。