ウェブ制作
バックエンド
pm2をサクッと使う。
お刺身@プログラマー
2026.01.13
#Oookey_blog_023
こんにちは。おさしみです。
今回はPM2を触ってみたので、PM2についてご紹介していきます
PM2とは?
PM2は Node.jsアプリ用のプロセスマネージャです。 役割は主に3つ。
- Nodeプロセスを落ちにくくする(常駐・自動再起動)
- 複数プロセスを管理する(名前・状態・ログ)
- サーバー再起動後に復元する
ざっくり説明すると、単発でしか動かないnpm script を「サーバー常駐」に昇格させる道具です。
使用場面としては、初期開発やローカルなどでとにかく速度を重視する時になります。
多くのプロセスを作っては消すを繰り返すような時は、場合によってはDockerよりも有効です。
導入方法
インストール 必ずインストール前に現在のバージョンを確認しておきましょう*1
Copied!
npm install -g pm2
pm2 -v # 確認
※1 = NVM等のNodeバージョン管理ツールを使用している場合、Nodeのバージョンごとに 「グローバルnpm環境」 が別物になるので、npm install -g pm2を実行したそのとき有効だったNodeにだけpm2 が入ります。
pm2最小構成
まずは、簡単に動くものを作ってみましょう!
Copied!
pm2 start app.js --name processName
npm scriptをそのまま起動することもできます。
Copied!
pm2 start npm --name processName -- run start
例ではpackage.jsonを想定していますが、pm2は任意のコマンドをプロセスとして管理できます。
便利だったコマンド
Copied!
# プロセス名を付ける
pm2 start app.js --name my-api
# ファイル変更を監視して、変更があれば再起動する
--watch
# メモリ使用量が閾値を超えたらアプリを再起動(リロード)する
--max-memory-restart <200MB>
# スクリプトに追加の引数を渡す(`--` 以降はスクリプト側に渡る)
-- arg1 arg2 arg3
# ログに時刻を付けて出力する
--time
# 表示
pm2 list # 全プロセスの状態を表示
pm2 prettylist # プロセス一覧を整形済みJSONで出力
pm2 describe 0 # 指定したプロセスの詳細情報をすべて表示
pm2 monit # 全プロセスをモニタリングする
# ログ
pm2 logs [--raw] # 全プロセスのログをストリーミング表示する(--rawで生ログ)
pm2 flush # 全ログファイルを空にする
pm2 reloadLogs # ログを再読み込みする
# Actions
pm2 stop <process> # 指定したプロセスIDを停止する(allで全プロセスに)
pm2 restart <process> # 指定したプロセスIDを再起動する(allで全プロセスに)
pm2 reload <process> # ダウンタイム0秒でリロードする(allで全プロセスに)
pm2 delete <process> # pm2の一覧から指定プロセスを削除する(allで全プロセスに) *管理対象から外れる
設定ファイルについて
複数のアプリケーションを管理するための「エコシステムファイル」と呼ばれる設定ファイルを作成することもできます。
Copied!
pm2 init simple
ecosystem.config.js ファイルが生成されます。
Copied!
module.exports = {
apps : [{
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}, {
name: 'worker',
script: 'worker.js'
}]
}
上記ファイルの起動方法は下記コマンドです。
Copied!
pm2 start ecosystem.config.js
正直なところ、設定ファイル作成までやるならばDockerを作った方がよいと個人的には思います。
もっと詳細を知りたい方は、公式サイトで丁寧に説明されていますのでご確認ください。
まとめ
最近はプロセスマネージャーならDockerを使用する機会が多いですが、
サクッと検証したい時や、とにかくプロセスを多く立ち上げては閉じるようなケースでは、
個人的にはPM2の方が効率的に進めることができると考えています。
みなさんもぜひ、ローカル環境等の手軽な環境で試していただけると嬉しいです。