NodeJSロゴ

フロントエンドでJavaScriptやTypeScriptを使っていると、バックエンドもJavaScriptで書きたいなと思うことが多く、私が担当するWeb系のプロジェクトではお客さんから指定がない限りはWebアプリケーションサーバーはNodeJSを使っています。

NodeJSでExpressとかを使ってWebサーバーを立てると、エラーが生じると

node main.jsCode language: DOS .bat (dos)

のプロセスが落ちてしまうんですよね。

私の場合、最初の概念実証(PoC)のときは、NodeJSのプログラムも正常処理ぐらいしか書いていなくて、PoCがうまくいき実際にWebアプリケーションを実装する段階になってエラーハンドルを追加していくのですが、お客さんのほうも土日とか夜間にWebサーバーが止まっても対応できないので、NodeJSのプロセスが落ちることだけは回避するようにしたいと依頼します。

なので、ファイルアップロードとか、ファイル名変更とか、エラーが発生する可能性があるところには、極力try/catchでエラーハンドルを入れて、エラーが起きてもNodeJSのプロセスが落ちないようにプログラム側で工夫するのですが、どうしてもそれをくぐり抜けてしまうことがあり、そうすると

node main.jsCode language: DOS .bat (dos)

のプロセスが落ちてしまいます。NodeJSのプログラムだけで対応することに難しさを感じていました。

そこで調べてみると、プロセス管理ツールのpm2(npm)が使えそうということに行き着きました。

NodeJSをプロセス管理できるpm2
NodeJSをプロセス管理できるpm2

npmを使ったインストール

NodeJSのパッケージ管理npmを使ってpm2をインストールすることができます。後にpm2コマンドをどのフォルダにいても使用できるようにするため、グローバルオプション(-g)を付けてインストールします。

npm install pm2 -gCode language: DOS .bat (dos)

すると、ターミナルやコマンドプロンプトから

pm2Code language: DOS .bat (dos)

コマンドが使用できるようになります。

pm2でNodeJSのWebサーバーを起動

pm2でnode main.jsを実行するには

pm2 start main.jsCode language: DOS .bat (dos)

と実行します。これにより、NodeJSはデーモンとしてバックエンドで実行されるので、ターミナルやコマンドプロンプトのリターンも返ってきます。

この状態でNodeJSのプロセスが落ちるようなテストを実行しても、pm2では処理が継続されます。これです、求めていたのは。

pm2でNodeJSのWebサーバーを停止

一方で、pm2からだとデーモンでNodeJSのプロセスが実行されるので、Ctrl+Cで止めることができなくなります。

pm2では任意のフォルダからデーモンを終了させることができます。例えば、pm2 start main.jsを実行すると、「main」というアプリ名で実行されますので、「pm2 stop アプリ名」で以下のようなコマンドで終了できます。

pm2 stop mainCode language: DOS .bat (dos)

pm2を使い始めてから、NodeJSがダウンすることが無くなったので一安心しましたが、ただ、pm2に任せていると処理がどこで失敗しているのかが分かりづらくなります。やはりプログラム側で処理のレスポンスやエラーメッセージを定義するところは必要なんだなと思います。

Categories:

Tags:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です