🍣

[node.js][pm2][ts-node]PM2を使ってアプリケーションを永続化・ログローテーションでログを管理する

2023/07/16に公開

概要

node.js / expressで構築し、ts-nodeで起動しているアプリケーションのプロセス終了を感知して再起動してくれるPM2のインストールメモです。

ログの肥大化を防ぐために、ログローテーションも行うようにします。

メモリ不足などの場合、nginxやapacheのWebサーバーが反応しなくなる的なイメージを持っていましたが、nodeはプロセスがパタっと止まってしまうんですね。勉強になりました。

PM2のアプリケーションをOS自動起動設定にした場合、コアダンプ(core dump)ファイルを作成しないようにする設定はこちらの記事をご確認ください

公式サイト
https://pm2.keymetrics.io/

留意点

ホットリロードをするわけではなく、登録しているアプリケーションのプロセスが落ちたら、起動をしてくれるものになります。
そのため、プロセスが起動するまでの間はアプリケーションへ接続が出来なくなります。
(私の環境ではts-nodeで起動しているためか、20秒ほどかかる場合があります)

ホットリロード的なものを実現するにはPM2で複数プロセス起動が可能なクラスタ化を行い、どれかプロセスを残したまま他のプロセスを再起動的な感じになるのかなと思います(未検証)
https://pm2.keymetrics.io/docs/usage/cluster-mode/

環境

  • サーバー:amazon linux2
  • node.js:16.13.1

構築

特に難しいことはなく、コマンドを叩いていく感じです

PM2インストール

インストール

$ npm install pm2 -g

ログローテーションパッケージの追加

https://www.npmjs.com/package/pm2-logrotate
インストール

$ pm2 install pm2-logrotate

ログの設定
各環境に合った値を設定してください。
下記は1ファイル20MBでローテーションし、100ファイル残す想定です。
(2GB程度(他のファイルもあるので少し超えるかと)をログファイルで残す)

$ pm2 set pm2-logrotate:max_size 20M
$ pm2 set pm2-logrotate:retain 100

アプリケーションを登録・起動

登録と同時に起動してくれます
管理用のアプリケーション名は下記を指定しています(ない場合は登録されたIDでも管理可能?)
わかりやすいように、プロジェクト名やアプリ名など入れておくと良いかもです

  • アプリケーション名、testapp
$ pm2 start --time npm --name "testapp" -- run start

MEMO:
通常起動しているコマンドが $ npmr run start を想定しています。
package.json には "start": "ts-node -r tsconfig-paths/register src/index.ts" が記載されています。

確認

ログで起動しているか確認します

pm2 log

その他メモ

その他、よく使用するコマンドなど

登録されているアプリケーションの確認

$ pm2 list

停止・リスタート

停止

特定のアプリケーションのみ
$ pm2 stop testapp
すべてのアプリケーション
$ pm2 stop all

アプリケーションのリスタート

$ pm2 restart testapp

設定を保存・復元する

インストール等が終わったら保存しておくと、アプリケーションの登録が解除された場合(OS再起動で自動起動を行っていない場合など)に保存情報から復元が可能です

保存する

$ pm2 save

復元する

$ pm2 resurrect

アプリケーションを削除する

削除する

$ pm2 delete testapp

以上です

Discussion