Docker + Node.jsのアプリにPM2を導入する

Docker + Node.jsのアプリにPM2を導入する

2021年11月11日
Node.js

サーバーがダウンを防ぐためDocker + Node.jsのアプリにPM2を導入してみました。

エラーが起きるとサーバーが落ちる

Node.jsでAPIを開発しているのですが、エラーが発生するとサーバーがダウンしてしまいます。一度サーバーがダウンしてしまうと、次リクエストから応答しなくなります。

try/catchでエラーハンドリングしていても、予期せぬところでエラーが発生する可能性があるため、さすがに運用していく上ではサーバーが落ちないようにしたいです。

なんとかサーバーが落ちないようにできないものかと調べてみると、PM2が良さそうな感じでした。

 

PM2とは

PM2はNode.jsアプリケーションのプロセス管理を行うためのオープンソースです。PM2を使うことで、Node.jsアプリケーションの起動やログ管理、モニタリングができます。

プロセスの状態を常に監視しているため、プロセスが停止した場合などに自動で再起動させる機能を持っています。

Advanced process manager for production Node.js applications. Load balancer, log…
pm2.keymetrics.io

 

PM2を導入する

PM2を導入してみます。まずpackage.jsonにpm2を追加します。

・package.json

次にPM2の設定ファイルを作成します。scriptの箇所などは適宜読み替える必要があります。watchをtrueにすることでコードが変更があった場合に自動で再起動してくれます。

・pm2.config.json

 

Dockerfileを修正する

Dockerfileを修正し、先ほど作成したpm2.config.jsonを読み込ませてpm2を使えるようにします。

–no-daemonオプションを指定することで、PM2を実行し続けることができます。

・Dockerfile

 

PM2で実際に動かしてみる

Dockerを再度ビルドして動かしみます。

無事動きました。

 

挙動の違いを確認する

nodemonの場合

従来のnodemonの場合は、以下のようにエラーが発生した場合「app crashed」になりコードの変更が検知されるまでは再起動されませんでした。

そのため、以降のリクエストはNo Responseとなってしまいます。

PM2の場合

今回導入したPM2の場合は、以下のようにエラーが発生した場合でもすぐにサーバーが再起動しました。

そのため、以降のリクエストも受け付けることができます。