Apache-2.2

Apache:孤立的 fcgi php 程序

  • September 2, 2016

我們有一個帶有 apache 2.2.14、PHP 5.3.2 的網路伺服器。

PHP 使用 mod_fcgid 執行(見底部)。一切正常,但有時,我們仍然必須弄清楚是什麼觸發了這種情況,當 php 程序“旋轉”時,它們仍然處於活動狀態和孤立狀態:apache 產生新的 php 程序,而舊的程序仍保留在系統上。殺死他們並不總是將他們踢走。更有可能是“apache2ctl graceful”將系統從這個陳舊的程序中解放出來。我們在錯誤日誌中發現了這一點:

$$ Tue Jun 18 20:49:54 2013 $$ $$ warn $$mod_fcgid:程序 2009 優雅終止失敗,從我發現的搜尋中發送 SIGKILL 是很正常的,但這就是我在其中一個程序洩漏期間在 apache 日誌中發現的全部內容。 幸好這個事件很少發生,通常apache和php執行正常,在fcgid兒童更新期間沒有問題。我們如何理解在這些情況下出了什麼問題?

站點中的 mod_fcgid 配置:

<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

我們目前找到了一種解決方法來避免伺服器填滿孤立的程序。您可以通過以下方式擺脫陳舊的流程:

apache2ctl graceful

並使用以下命令終止這些程序:

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

編寫和調度這兩個命令(通過適當的檢查)將避免伺服器託管大量無用的過程,但問題仍然存在。

我有一個類似的問題,即 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: ...

這是由於鎖定不當引起的。就我而言,Apache 使用 fcntl() 鎖定(預設情況下在 debian 上),所以我將其更改為flock() in apache2.conf

Mutex flock:${APACHE_LOCK_DIR} default

導致我找到解決方案的參考: https ://bz.apache.org/bugzilla/show_bug.cgi?id=53999

關於各種鎖定選項的文件(fcgid 有一個警告建議,反對使用任何涉及執行緒的東西): https ://httpd.apache.org/docs/2.4/mod/core.html#mutex

引用自:https://serverfault.com/questions/557569