不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

pm2でNode.jsのプロセスを永続化する

■はじめに

遅くなりましたが2020年あけましておめでとうございます。今年もよろしくお願いします。
久々に投稿はNode.jsに関するものとなりました。
Expressを使用したアプリで予期せぬエラーが発生するたびにプロセスが停止してしまい、対応工数が膨らんでしまっているため、プロセスの永続化方法を調べました。

node.jsのプロセスをデーモン化するツール

「node デーモン」で検索するとforeverとpm2という2つのツールがヒットしました。npmのサイトを見るとpm2の方が週間ダウンロード数が多いのと、管理画面がかっこよかったのでpm2を試してみることにします。
Expressのサイトにもプロセスマネージャーのページがあったため、こちらを参考にしていただけるといいと思います。Express アプリケーション用のプロセス・マネージャー

早速実機で起動確認をしていきます。

■テスト環境

  • OS: Windows Server 2016 Standard
  • Node: v12.15.0
  • npm: 6.13.4
  • express-generator: 4.16.1
  • pm2: 4.2.3

■アウトライン

  1. Nodeアプリケーションの準備
  2. pm2のインストール
  3. pm2の実行

1. Nodeアプリケーションの準備

Nodeアプリケーションはexpress-generatorで作成したものを使用していきます。
以前の下記記事と同じように実行します。
テスト環境ではまっさらなOSにNode.jsをインストールしています。
npm startを行い画面が表示されたのでアプリケーションの準備はOKです。

hiyo-ac.hatenablog.com

2. pm2のインストール

pm2については下記コマンドを実行することでインストールできます。
プロセスマネージャーはNodeをインストールしたマシンで共通で利用するべき機能だと思うため、globalインストールしています。

# npm install -g pm2

Windows環境だと一部のモジュールのOSが対応していないみたいでSKIPされましたが、無視して進みます。

3. pm2の実行

pm2でexpress-generatorで作成したアプリを起動してみます。 pm2の基本的な実行方法は、

# pm2 start app.js

となっています。筆者のサンプルはexpress-generatorで作成したアプリなので、このアプリの起動方法を検討します。いくつか方法があるようですがそのうち一つだけ紹介します。
簡単にググってみると下記コマンドで起動できるという記事を目にしましたが、Windows環境からなのか正常に起動しませんでした。

# pm2 start npm -- start

※pm2コマンドは成功したように見えますが、pm2 startしてもstatusがonlineにならずerrorとなりました。

解決策npmの起動スクリプトを直接実行する

「npm start」コマンドを実行したときの起動コマンドはpackage.jsonに記載されています。 デフォルトだと

"start": "node ./bin/www"

と記載されているので、その通りに実行します。

# pm2 start ./bin/www

下記ログが表示されました。

f:id:hiyo-ac:20200208210620p:plain
pm2起動ログ
idが0で名前がwwwで起動されています。http://localhost:3000にアクセスするとページが表示されるので起動できているようです。 またプロセス停止も試してみます。下記のようにid指定で停止します。

# pm2 stop 0

下記ログが表示され、statusがstoppedとなっており停止されています。またhttp://localhost:3000にアクセスするとページが表示されなくなりました。

f:id:hiyo-ac:20200208211456p:plain
pm2停止ログ

■おわりに

Windows環境で今回テストを行いましたが、CentOSなどのLinux環境だとpm2がそのまますんなり起動できるのか気になるところです。
どちらにせよ起動はできましたが、内部処理の挙動がわかっていないのでプロダクション環境にデプロイするのはまだ先になりそうです。
それまでは古典的ですがwindowsタスクスケジュールからプロセス監視の処理を流し続けます…