Happy My Life

日常とか技術とか

php-cgiがよくハングしてお困りの方へ

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シリーズ)
[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
技術評論社 2008-08-07
売り上げランキング : 2139

おすすめ平均 star
star“負荷”という仕組みを体系的に理解できる良書
star現場の著者が執筆
starネットワークを気にしたことのないサーバエンジニアに捧ぐ

Amazonで詳しく見る
by G-Tools