pm2の導入 〜Node.jsアプリの自動起動〜

pm2を利用して、Node.jsアプリをOSの起動時にバックグラウンド・プロセス(デーモン)として自動的に起動させるまでの個人的メモです。

環境

  • Ubuntu 18.04.4 LTS
  • Node.js v14.2.0
  • pm2 4.4.0

なお、pm2はグローバル・インストールしている。 即ち、

$ npm install pm2 -g

概要

pm2を利用したOS起動時のNode.jsアプリの自動起動は、

  1. OSの起動
  2. pm2の起動
  3. Node.jsアプリの起動

という流れで進む。

そのため、pm2を利用してOS起動時にNode.jsアプリを自動的に起動させるためには、

の設定が必要となる。

また、以下の手順によると、ログインしているユーザとしてpm2及びNode.jsアプリが自動起動するように設定される。 そのため、前提として、適切なユーザとしてログインしておくことが必要である。

pm2の自動起動設定

$ pm2 startup

これにより、pm2自動起動設定方法が示される。今回は、以下のメッセージが表示された。

[PM2] Init System found: systemd
ubuntu
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/home/ubuntu/.nodebrew/node/v14.2.0/bin /home/ubuntu/.nodebrew/node/v14.2.0/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

従って、

$ sudo env PATH=$PATH:/home/ubuntu/.nodebrew/node/v14.2.0/bin /home/ubuntu/.nodebrew/node/v14.2.0/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

なお、これにより以下のメッセージ(一部)が表示された。

Target path
/etc/systemd/system/pm2-ubuntu.service
Command list
[ 'systemctl enable pm2-ubuntu' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-ubuntu.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-ubuntu...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-ubuntu.service → /etc/systemd/system/pm2-ubuntu.service.
[PM2] [v] Command successfully executed.

どうやら、手動でsudo systemctl enable ...を実行する必要はないようである。

また、これにより以下のメッセージ(一部)も表示された。

[PM2] Remove init script via:
$ pm2 unstartup systemd

どうやら、これによりインストールされたファイルは、sudo pm2 unstartup systemdによりアンインストールできるようである(未確認)。

Node.jsアプリの自動起動設定

まずは、

$ cd ${pathToApp}
$ pm2 ecosystem

${pathToApp}はNode.jsアプリのベース・ディレクトリのパス。 これにより、${pathToApp}にpm2による起動用の設定ファイルecosystem.config.jsが作成されるので、適宜編集する。

次に、

$ pm2 start ecosystem.config.js

これにより、Node.jsアプリがバックグラウンドで起動する。

最後に、

$ pm2 save

これにより、現在起動しているNode.jsアプリが記憶される。

記憶されたNode.jsアプリは、次回のOS起動時のpm2の自動起動時に、自動的に起動する。