2013年7月2日

【Node.js】foreverより高機能なpm2でデーモン化



ちょっと前からですが、Node.jsで運用しているサービスのデーモン化ツールを
node-foreverから、node-pm2へ変更いたしました。

foreverと比較して高機能なpm2をお伝えいたします。



クラスタリング



foreverコマンドは、基本的にプロセスが生きている事を管理するのみでした。
pm2では、それはもちろんの事、使っているCPUに合わせてクラスタリングする機能が付いています。


Node.js v0.6で追加されたクラスタリング機能はソケットをネットワーク化されたNode.jsのアプリケーション間でシェアする事が出来ました。
pm2では基本機能として、追加コードなしにそれらを実装しています。pm2本体がマスタープロセスの役割をし、アプリケーションコードをクラスタリング化された子プロセスとして扱います。


すべてのCPUを使ってクラスタリングするには、

pm2 start app.js -i max

と実行するだけで簡単にクラスタリングする事が出来ます。

また、

pm2 list

と実行すれば、下の写真のような感じで一覧を見る事が出来ます。


モニタリング

pm2には、CPU使用率とメモリ使用率を表示してくれる機能もあります。

pm2 monit

と実行すると、


ただし、Macではnode-usageが使えない為にpm2のmonitコマンドが使えません。誰か修正して下さい(´・ω・`)


ログ収集

pm2では、クラスタリング化された複数のプロセスを見る必要があります。今までの方法では、

tail -f /path/to/log1 /path/to/log2 ...

と、複数のファイルを指定していましたが、pm2では、

pm2 logs

と入力するだけで、すべてのログを管理出来ます。

もちろん、1つ1つのプロセスは別のログファイルに分けられているので、tailコマンドで1つを追うことも出来ます。


JSONでの設定

複数のNode.jsアプリケーションを実行するのに、1つ1つ実行する必要はありません。
プロセス管理用のJSONファイルを設定すれば、それ1つですべてのNode.jsアプリケーションの実行が可能です。

[{
    "name"      : "echo",
    "script"    : "./examples/echo.js",
    "max"       : "10",
    "instances" : "max",
    "args"      : "-d 1"
},{
    "name"      : "api",
    "script"    : "./examples/child.js",
    "instances" : "4"
},{
    "name"      : "bus",
    "script"    : "./examples/echokill.js"
}]

と、設定ファイルを書き、

pm2 start processes.json

と実行すると、設定したすべてのアプリケーションを実行してくれます。

最後に

foreverからpm2への切り替えに30秒ほどアクセス出来ませんでしたが、
アプリケーション側の変更は特に無く切り替える事が出来ました。

あとはログローテートが出来れば・・・。そのうちやります。

node-foreverの記事はこちら:【AWS】EC2のCentOS6.0にNode.jsでproxy serverを立ててapacheと共存させる
ログローテートはこちら:【Node.js】expressでaccess log + log rotate

(なぜか人気記事になったので、湘南社中をよろしくお願いします。と言っておきます。)