Masteries

技術的なことや仕事に関することを書いていきます.

Node.jsのWebアプリケーションでGraceful Restart

いろいろあって, Expressを使って開発されたNode.jsのWebアプリケーションでGraceful Restartする必要が出てきました. Perlであれば, 単純にServer::Starterなどを使って素直に構築できるのですが, Node.jsでGraceful Restartは今回が始めての経験.

Googleでさっくり調べてみた感じ, PerlでのServer::Starterのような「王道!」という構成やツールが見つからず苦労していました. 藁にもすがる思いでGotanda.jsのSlackで質問してみたところ, 「pm2というパッケージを使ってみてはどうですか?」という提案を受けたので, 今回はこれを使ってGraceful Restartしてみました.

インストール

まずはpm2をインストールします.

$ npm install -g pm2

簡単ですね!

設定ファイルの用意

[{
  "name":      "myapp",
  "instances": 0,
  "script":    "myapp.js",
  "exec_mode": "cluster_mode",
  "env": {
    "NODE_ENV": "production"
  }
}]

今回は, こんな感じで設定ファイルを用意してみました. scriptで起動するスクリプト(今回はmyapp.js)を, envで環境変数を設定できます. また, instancesは起動するプロセス数ですが, 0にした場合, コア数分のインスタンスを起動するようにしてくれます.

プロセスの起動

あとは, 先ほど用意したJSONをこのように読み込むと, myapp.jsのWebアプリケーションが立ち上がります.

$ pm2 start processes.json

このとき, Graceful Restartをするのであれば,

$ pm2 gracefulReload processes.json

でOK.

更に, 「プロセスが起動していない場合start, 既に起動している場合はgracefulReloadしたい」という場合は, 次のようにすればOKです.

$ pm2 startOrGracefulReload processes.json

これで, Node.jsで書かれたWebアプリケーションをうまくGraceful Restartできそうです.

まとめ

pm2を使って, Node.jsのWebアプリケーションをGraceful Restart出来るようにしてみました. この辺り, より良いベストプラクティスがあれば非常に興味があるので, ご存知の方は教えて頂けると嬉しいです.