Node.jsの実行環境やクラスタリングの他にもう一つ押さえとかなければならないことがあります.それはプロセスマネージャーです.Node.jsを起動するとフォアグラウンドプロセスとなり,プロセスが異常終了した場合,アプリケーションが落ちたままとなってしまいます.そこでプロセスマネージャーを使用して,プロセスの監視を常駐で行うバックグランドプロセスとして実行することで,異常終了時に再起動してくれます.これをNode.jsのデーモン化といいます.この記事ではnodeアプリのデーモン化を行うための2つの方法を解説します.
nodeのデーモン化には4つの利点があります.下記4つの利点は「Express アプリケーション用のプロセス・マネージャー」のサイトから引用しています.
- アプリケーションが異常終了した場合に自動的に再始動する
- ランタイム・パフォーマンスとリソース使用量に関するインサイトを得る
- パフォーマンスを向上させるために設定を動的に変更する
- クラスタリングを制御する
プロセスマネージャーを導入することで,アプリケーションを継続して運用することができます.ぜひ覚えておきましょう.nodeのプロセスマネージャーは代表的には4つあります.
- Forever
- PM2
- StrongLoop Process Manager
- systemd
本記事では比較的,容易に運用できる「Forever」と「PM2」の実装方法を紹介します.
Forever
「Forever」は比較的小規模なデプロイメントを実行するのに使われます.npmモジュールとしてインストールできる,単純なコマンドラインインターフェースツールです.
まずはnpmを使用して「Forever」をグローバル環境にインストールします.以下のコマンドでインストールできます.
$ npm install forever -g
Foreverでの起動コマンド
通常のNode.jsの起動方法は「node ファイル名.js」ですが,「Forever」では以下のコマンドで起動します.
$ forever start main.js
起動中のプロセスのリストを返すコマンド
$ forever list
上の図は2つのプロセス「cluster.js」と「main.js」を起動させてそのリストを返した結果になります.
プロセスを再起動するコマンド
$ forever restart main.js
プロセスを停止するコマンド
$ forever stop main.js
ログの保存先を確認するコマンド
$ forever logs
「Forever」の詳しい使い方はこちらのページから確認でます.
PM2
PM2 は、ロード・バランサーが組み込まれた、Node.js アプリケーション用の実動プロセス・マネージャーです。PM2 では、アプリケーションの稼働を永続的に維持して、ダウン時間を発生させずに再ロードすることができ、共通のシステム管理タスクを簡単に実行できます。PM2 では、アプリケーションのロギング、モニター、クラスタリングを管理することもできます。
「Forever」と同じく,npmを使用して「MP2」をグローバル環境にインストールします.以下のコマンドでインストールできます.
$ npm install pm2 -g
PM2でプロセスを起動するコマンド
$ pm2 start main.js
プロセスを再起動するコマンド
$ pm2 restart main.js
プロセスを停止するコマンド
$ pm2 stop main.js
起動中のプロセスのリストを返すコマンド
$ pm2 list
クラスターモードでプロセスを起動するコマンド
PM2にはクラスタリングによるロードバランサー機能があります.デフォルトではフォークモードなので,コマンドによってクラスターモードで起動します.コマンドは以下のようになります.
# pm2 start [スクリプトファイル名] --name [名前] -i [起動数]
# -i をつけると、クラスターモードになり、起動数=0にすると、マシンのコア数でインスタンスを起動してくれる.
$ pm2 start main.js --name nodeapp -i 0
前回の記事で「cluster.fork()」により,workerを生成してクラスタリングを行いましたが,PM2では起動時にクラスタリングを行うコマンドがあります.「cluster.fork()」によるクラスタリングの記事は下記になります.
このようにプロセスマネージャーはnodeプロセスをデーモン化することができ,起動しているクラスターも確認することができます.Nodeでアプリケーションを作成する場合はプロセスマネージャーも意識しましょう.
参考サイト
GitHub forever
https://github.com/foreversd/forever
Express アプリケーション用のプロセス・マネージャー
https://expressjs.com/ja/advanced/pm.html#forever
[Node.js] PM2を用いて本番環境でNodeJSアプリを動かす
https://www.yoheim.net/blog.php?q=20170706