node.js のアプリを永続化(デーモン化)させる
夏の暑さに負けて自宅でエアコンフル稼働な私です。
最近は node.js のお仕事が出てきたのですが、通常通り動いてOKとなっても、サーバーのSSHが終了するとプログラムも停止してしまいます。
そこで今回は node.js を永続化させる方法をご紹介します。
デーモン化モジュール : PM2
今回は pm2 というモジュールを使い、node.js をデーモン化していきます。
これは通常のデーモン化ではなく、pm2のサービスとして起動させるものです。
まずはインストールしていきましょう。
1 2 3 |
npm install pm2 -g |
この時、プロジェクトに追加するのではなく、システムとして稼働させるため 「-g」 をつけることを忘れないでください。
また、インストールは必ず node.js のファイルを実行させるユーザーで行ってください。
さらに、このままでも機能するのですが、実運用を考えてログファイルをローテートさせる機能もインストールします。
1 2 3 |
pm2 install pm2-logrotate |
続いて、デーモン化させるための設定ファイル(service.json)をnode.jsのプロジェクト内に作成します。
(内容は適宜読み替えてください)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "name" : "SampleProject", "script" : "/usr/src/SampleProject/index.js", "log-date-format": "YYYY-MM-DD HH:mm:ss Z", "env" : { "NODE_ENV" : "production" }, "env_development" : { "NODE_ENV" : "development" } } |
起動ファイルが作成できたら、サービスを起動するコマンドを実行します。
1 2 3 4 5 6 7 |
# 本番用 pm2 start /usr/src/SampleProject/service.json # 開発用 pm2 start /usr/src/SampleProject/service.json --env development |
下記のようになれば成功です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[PM2][WARN] Applications SampleProject not running, starting... [PM2] App [SampleProject] launched (1 instances) ┌─────┬──────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ ├─────┼──────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ │ 1 │ SampleProject │ default │ 1.0.0 │ fork │ 1769 │ 0s │ 0 │ online │ 0% │ 19.2mb │ root │ disabled │ └─────┴──────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ Module ┌────┬──────────────────────────────┬───────────────┬──────────┬──────────┬──────┬──────────┬──────────┬──────────┐ │ id │ module │ version │ pid │ status │ ↺ │ cpu │ mem │ user │ ├────┼──────────────────────────────┼───────────────┼──────────┼──────────┼──────┼──────────┼──────────┼──────────┤ │ 0 │ pm2-logrotate │ 2.7.0 │ 1627 │ online │ 0 │ 0% │ 49.4mb │ root │ └────┴──────────────────────────────┴───────────────┴──────────┴──────────┴──────┴──────────┴──────────┴──────────┘ |
自動再起動
このままではサーバーが再起動した場合、デーモンが復旧しません。
そこで、サーバー起動と同時に起動する設定も行います。
起動スクリプトをコマンドで生成します。
1 2 3 |
pm2 startup [ubuntu | ubuntu14 | ubuntu12 | centos | centos6 | arch | oracle | amazon | macos | darwin | freebsd | systemd | systemv | upstart | launchd | rcd | openrc] |
画面にコマンドが表示されますので、それをそのままコピーして、内容を読み替えて実行します。
そして、再起動時に復元する設定を保存します。
1 2 3 |
pm2 save |
こちらについては各自の環境によって異なりますので、詳しくは下記公式ドキュメントを確認してみてください。
- 公式ドキュメント
- PM2 – Startup Script
ログローテート設定
ログファイルをローテーションさせる設定を行います。
ログの設定は様々ありますが、下記のコマンドは必ずやっておいたほうがいいでしょう。
1 2 3 |
pm2 set pm2-logrotate:compress true |
ほかにも日付フォーマットやファイル最大サイズなどが設定できますので、環境に合わせて設定したほうが良いと思います。
- 公式ドキュメント
- npm / pm2-logrotate
pm2を使用する
一覧表示
pm2 のサービス一覧を見るには、下記のコマンドを実行します。
1 2 3 |
pm2 ls |
画面にインストール時と同じような情報が表示されます。
表示内容のポイントは id、name、namespace です。
このどちらかを使用してコマンドを実行します。
再起動する・停止する
pm2 のサービスを再起動するには、下記のコマンドを実行します。
1 2 3 |
pm2 restart [id または name または namespace] |
そして pm2 のサービスを停止するには、下記のコマンドを実行します。
1 2 3 |
pm2 stop [id または name または namespace] |
サービスを再起動/停止するには、そのサービスを指定する必要があります。
ログを確認する
pm2 で利用しているプログラムのログを確認するには、下記のコマンドを実行します。
1 2 3 |
pm2 logs (id または name または namespace) |
また、pm2自体のログを確認する場合は、idなどをつけずに使用することで確認できます。
さいごに
node.js のプログラムやモジュールに関する情報は溢れていますが、実際のデーモン化に伴う情報はあまり見られませんでしたので記載してみました。
ちなみに、HTMLなどと異なり、実行しているファイルを更新しても自動で変更されたりはしません。
そのため、pm2コマンドで再起動をする必要があり、その際 node.js 内の変数はもちろん揮発します。
なのでデータを復元する方法は別途用意する必要があります。
その話はまた機会があれば。
- おすすめ記事
POPULAR
のえる
Full-stack Developer