nginxとspawn-fcgi/php-cgiで運営していて以前から悩んでいる事が一つあった。なぜか2時間毎ぐらいにphp-cgiがハングしてしまうという問題が…。仕方ないのでハングする度に死活監視で復活させていた。
致命的な問題でもなかったが、死活監視から頻繁にメール届いてウザいなー、そのうち手を打たないと、と思いつつ今日まで来た。
で、Ubuntu 10.04 LTSに移行するついでにいろいろ調べていると、How to Stop Crashing / Hanging of php-cgi / spawn-fcgi with nginx / lighttpdという記事を見つけた。
同じ問題で悩んでいる人いるんだね。という事で読み進めてみるとヒントが書いてあった。
We found out an important, but less advertised environment variable php-cgi recognizes: PHP_FCGI_MAX_REQUESTS
という事らしい。
対策
spawn-fcgiを使わずphp-cgiをデーモン化する事にした。
以下、php-cgiの起動スクリプト(/etc/init.d/php-fastcgi)
#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=1000
NAME=php-fastcgi
PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PH
P_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0
start() {
echo -n "Starting PHP FastCGI: "
start-stop-daemon --start --quiet --make-pidfile --pidfile /var/run/$NAME.
pid --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
RETVAL=$?
echo "$PHP_CGI_NAME."
}
stop() {
echo -n "Stopping PHP FastCGI: "
killall -q -w -u $USER $PHP_CGI
RETVAL=$?
echo "$PHP_CGI_NAME."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
ここでのキモは、
を設定した事。このスクリプトでうちのサーバーでは安定して動いている。どうやら解決したようだ。
[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ) | |
![]() | 技術評論社 2008-08-07 売り上げランキング : 2139 おすすめ平均 ![]() ![]() ![]() ![]() Amazonで詳しく見る by G-Tools |