いろいろあって, 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出来るようにしてみました. この辺り, より良いベストプラクティスがあれば非常に興味があるので, ご存知の方は教えて頂けると嬉しいです.