Apache:孤立的 fcgi php 程序
我們有一個帶有 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