Debian に daemontools をインストール
実は以前 Windows でも nginx + PHP の環境を作って PHP スクリプトを書いていたこともあったのだが、その時「いつの間にかプロセスが居なくなっている」というミステリーに遭遇した。
Windows 版がそんなに安定動作するとは思えないのでそれ自体は不思議ではないのだが、やはりサーバとして使うのであれば勝手に nginx とか PHP が居なくなってサイトが見れなくなっているのは寂しい(とはいえアクセスが少ないので実質的な問題はほとんどないが……)。
ServerMan@VPS の Entry プランはメモリも少なめで swap 領域も現状はないので、OOM Killer 様がやってきて殺戮していく可能性もあるし、でも自分が書いたスクリプトのバグなどで大量にメモリ食い潰したりした時は落として欲しいので OOM Killer 様も必要。
というわけで落ちた後に何食わぬ顔で立ち上がってくるようにしておきたいので、今回は daemontools をインストールしてみようと思う。
daemontools は apt-get でインストール。
daemontools でプロセスを監視させる場合、daemontools 側からサービス起動をしなければいけないようなので、nginx と php5-fpm を自動実行の対象から外しておく。sshd は OOM Killer の対象外だし失敗すると作業続行が出来なくなる可能性があるので取りあえず今回は除外。 まずは nginx から。
続いて php5-fpm。
こちらは foreground で動かすためには conf を触らないといけないらしい。
直接 php5-fpm.conf に書かなければ invoke-rc.d php5-fpm start した時にも問題なく動いてくれる。
同じように kill で頑張ってプロセスID全部入力して落としたけどすぐに起き上がってきたのでこれも成功した模様。
これで OOM Killer が物凄い勢いで頑張り出しても問題なく動きそうな感じになった。はず。
daemontools 自体がやばいことになった時には daemontools も落としてくれていいので、OOM Killer の対象外には特に何も指定していない。
2010-12-01 追記 ----
わかりやすい日本語ドキュメントを見つけた。
ここの説明を読んでみると、どうも daemontools にデーモンを登録する際は /etc/services/* にはシンボリックリンクを置く方針らしく、直接ファイルを作成したりはしていないようだ。
更にシンボリックリンクを配置したら自動的に起動すると書いているので、導入時手動で立ち上げる必要はなかったと思われる。
Windows 版がそんなに安定動作するとは思えないのでそれ自体は不思議ではないのだが、やはりサーバとして使うのであれば勝手に nginx とか PHP が居なくなってサイトが見れなくなっているのは寂しい(とはいえアクセスが少ないので実質的な問題はほとんどないが……)。
ServerMan@VPS の Entry プランはメモリも少なめで swap 領域も現状はないので、OOM Killer 様がやってきて殺戮していく可能性もあるし、でも自分が書いたスクリプトのバグなどで大量にメモリ食い潰したりした時は落として欲しいので OOM Killer 様も必要。
というわけで落ちた後に何食わぬ顔で立ち上がってくるようにしておきたいので、今回は daemontools をインストールしてみようと思う。
daemontools は apt-get でインストール。
apt-get install daemontools daemontools-run基本的にはこれだけで daemontools は起動する。
daemontools でプロセスを監視させる場合、daemontools 側からサービス起動をしなければいけないようなので、nginx と php5-fpm を自動実行の対象から外しておく。sshd は OOM Killer の対象外だし失敗すると作業続行が出来なくなる可能性があるので取りあえず今回は除外。 まずは nginx から。
invoke-rc.d nginx stop update-rc.d -f nginx remove pushd /etc/service mkdir nginx pushd nginx vim run
#!/bin/sh exec 2>&1 exec /usr/local/sbin/nginx -c /usr/local/nginx/nginx.conf -g 'daemon off;'
chmod 700 run svc -u /etc/service/nginxこれで daemontools 経由で起動することができたので、
ps ax | grep nginx\\:に現れたプロセスIDを全てkillしても違うプロセスIDで何度でも蘇るようならラピュタの完成。
続いて php5-fpm。
こちらは foreground で動かすためには conf を触らないといけないらしい。
vim /etc/php5/fpm/php5-fpm-daemontools.conf
daemonize = no include = /etc/php5/fpm/php5-fpm.confこれで恐らく php5-fpm-daemontools.conf を読んだあとに本来の php5-fpm.conf を読みに行ってくれるはず。
直接 php5-fpm.conf に書かなければ invoke-rc.d php5-fpm start した時にも問題なく動いてくれる。
invoke-rc.d php5-fpm stop update-rc.d -f php5-fpm remove popd mkdir php5-fpm pushd php5-fpm vim run
#!/bin/sh exec 2>&1 exec /usr/bin/php5-fpm --fpm-config /etc/php5/fpm/php5-fpm-daemontools.confスクリプトの準備もできたので実際に実行してみる。
chmod 700 run svc -u /etc/service/php5-fpm立ち上がる。が、php5-fpm はプロセスたくさん立ち上がるのね……。
同じように kill で頑張ってプロセスID全部入力して落としたけどすぐに起き上がってきたのでこれも成功した模様。
これで OOM Killer が物凄い勢いで頑張り出しても問題なく動きそうな感じになった。はず。
daemontools 自体がやばいことになった時には daemontools も落としてくれていいので、OOM Killer の対象外には特に何も指定していない。
2010-12-01 追記 ----
わかりやすい日本語ドキュメントを見つけた。
ここの説明を読んでみると、どうも daemontools にデーモンを登録する際は /etc/services/* にはシンボリックリンクを置く方針らしく、直接ファイルを作成したりはしていないようだ。
更にシンボリックリンクを配置したら自動的に起動すると書いているので、導入時手動で立ち上げる必要はなかったと思われる。