Apache:孤立的fcgi php进程

我们有一个web服务器与Apache 2.2.14,PHP 5.3.2。

PHP是使用mod_fcgid执行的(请参见下方)。 一切工作正常,但有时,我们仍然要弄清楚是什么触发了这一点,当PHP进程是“旋转”,他们仍然活跃和孤儿:Apache衍生新的PHP进程和旧的仍然在系统上。 杀他们并不总是把他们踢走。 更可能的是“apache2ctl优雅”从这个陈旧的过程中释放系统。 我们发现这在错误日志中:[Tue Jun 18 20:49:54 2013] [警告] mod_fcgid:进程2009优雅杀死失败,发送SIGKILL从我发现search这是非常正常的,但这是我在apache日志在这个过程之一泄漏。

幸运的是,这个事件很less发生,通常apache和php运行正常,在fcgid儿童更新期间没有问题。 我们怎样才能了解这些情况出了什么问题?

站点中的mod_fcgidconfiguration:

<IfModule mod_fcgid.c> SuexecUserGroup domain domain <Directory /var/www/fomain.it/htdocs/> AddHandler fcgid-script .php FCGIWrapper /var/www/fcgi/domain.it/fcgi-starter-php .php Options +ExecCGI -Indexes AllowOverride FileInfo Options Order allow,deny Allow from all </Directory> <Directory /var/www/fcgi/domain.it/> AllowOverride None Options +ExecCGI MultiViews -Indexes Order allow,deny Allow from all </Directory> </IfModule> 

/var/www/fcgi/domain.it/fcgi-starter-php:

 #!/bin/sh PHPRC=/var/www/fcgi/domain.it/php/ export PHPRC PHP_FCGI_CHILDREN=8 export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_MAX_REQUESTS exec /usr/lib/cgi-bin/php $1 

我们目前发现了一种避免服务器填满孤立进程的解决方法。 您可以通过以下方式摆脱陈旧的stream程:

 apache2ctl graceful 

并杀死这些进程:

 pkill -f -x /usr/lib/cgi-bin/php -P 1 

脚本和调度这两个命令(通过适当的检查)将避免服务器托pipe大量无用的特效,但问题仍然存在。

我有一个类似的问题,fcgid在经过一段时间的活动之后用完了可用的进程槽。

日志消息大致是:

 [fcgid:warn] mod_fcgid: can't apply process slot for /var/www/cgi-bin/xxx/php-cgi, referer: ... 

我跟踪了这​​个问题:

 [fcgid:emerg] (35)Resource deadlock avoided: [client ....] mod_fcgid: can't get pipe mutex, referer: ... 

这是由不正确的locking造成的。 在我的情况下,Apache使用fcntl()locking(默认情况下在debian上),所以我把它改成apache2.conf flock():

 Mutex flock:${APACHE_LOCK_DIR} default 

引用我的解决scheme: https : //bz.apache.org/bugzilla/show_bug.cgi?id = 53999

有关各种locking选项的文档(fcgid提供了一个警告通知,用于涉及线程的任何事情): https ://httpd.apache.org/docs/2.4/mod/core.html#mutex

我没有一个真正的答案,但也许更多的信息可以帮助解决这个问题。 我想告诉,我有一个与PHP 5.3.5的Windows服务器相同的问题。

一些cgi进程在完成它们的实际执行之后仍然是一种僵尸任务。 他们甚至忽略像max_execution时间这样的设置。

目前我有一个预定的脚本是什么杀死这些旧的进程。 这个解决scheme的问题在于,即使是“正常”的cgi进程,在那里死了,也许这将是有用的检测进程的运行时间,只有当他们已经过了max_execution时间杀死他们。

更改为“sem”,如托马斯在https://bz.apache.org/bugzilla/show_bug.cgi?id=53999中的build议为我工作&#x3002;

所以我会build议任何人编辑他的apache2.conf,评论互斥线,并把:

 # Mutex file:${APACHE_LOCK_DIR} default # Original debian config Mutex sem # Solves orphaned PHP processes.