はじめに
Node.jsでサーバーを運用していて、こんな経験はありませんか。
- 予期しないエラーでプロセスが落ち、気づいたときにはサービスが長時間停止していた
- サーバーを再起動すると、アプリの起動コマンドを打ち忘れて復旧が遅れた
- CPUをフル活用したいのに、Node.jsはシングルスレッドだからと諦めていた
こうした悩みを一気に解決してくれるのが、Node.js(およびBun)向けのプロセスマネージャー「PM2」です。プロセスの監視・自動再起動・クラスタリングを標準機能として備えており、pm2 start の一行でアプリケーションを本番運用レベルの堅牢さで動かせます。この記事では、PM2の特徴からインストール、実践的な使い方までをまとめて紹介します。
PM2とは
PM2は、Node.js/Bunアプリケーション向けの本番環境向けプロセスマネージャーです。ロードバランサーを内蔵しており、アプリケーションを永続的に稼働させながら、ダウンタイムなしでのリロードを実現します。単純にプロセスを立ち上げるだけでなく、クラッシュ時の自動復旧やログ管理、サーバー再起動後の自動起動まで、運用に必要な機能をひとつのCLIツールにまとめている点が魅力です。
主な特徴
- 自動再起動 - アプリがクラッシュしたりメモリ上限を超えたりした際に、自動的にプロセスを再起動して稼働を継続します
- クラスターモード -
-iオプションでマルチコアを活用し、複数プロセスにリクエストを分散してスループットを向上させます - ゼロダウンタイムリロード - サービスを止めずにアプリケーションのコードを更新できるため、デプロイ時の中断がありません
- ログ管理と監視 -
pm2 logsやpm2 monitで標準出力・エラーログをリアルタイムに確認できます - 起動スクリプトの自動生成 - systemdやupstartなど各種initシステムに対応し、サーバー再起動後もPM2とプロセスを自動復旧します
インストール
npmまたはyarnからグローバルにインストールします。
# npmの場合
npm install pm2@latest -g
# yarnの場合
yarn global add pm2
インストール後、バージョンを確認しておきましょう。
pm2 --version
基本的な使い方
まずは簡単なNode.jsアプリを用意して、PM2で起動してみます。
// app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from PM2!\n');
});
server.listen(3000, () => {
console.log('Server running on port 3000');
});
PM2でこのアプリを起動します。
pm2 start app.js --name "my-app"
主なコマンドは以下の通りです。
# 実行中のプロセス一覧を確認
pm2 list
# ログをリアルタイムで表示
pm2 logs my-app
# アプリの再起動
pm2 restart my-app
# アプリの停止
pm2 stop my-app
# アプリの削除(管理対象から外す)
pm2 delete my-app
# ターミナルベースの監視ダッシュボード
pm2 monit
クラッシュしてもPM2が自動で再起動してくれるため、node app.js で直接起動していたときのような「気づいたら落ちていた」という事態を防げます。
実践的なユースケース
クラスターモードでマルチコアを活用する
Node.jsは本来シングルスレッドですが、PM2のクラスターモードを使えばCPUコア数に応じて複数プロセスを立ち上げ、リクエストを自動的に分散できます。
# CPUコア数を自動検出して最大数のプロセスを起動
pm2 start app.js -i max --name "my-app"
ecosystem.config.jsで設定を一元管理する
複数のオプションを毎回コマンドラインで指定するのは煩雑です。設定ファイルにまとめておくと、チームでの運用や環境ごとの切り替えがしやすくなります。
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'my-app',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '300M',
env: {
NODE_ENV: 'development',
},
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
},
],
};
設定ファイルを使った起動は次のように行います。
# 通常起動
pm2 start ecosystem.config.js
# 本番環境向けの環境変数を使って起動
pm2 start ecosystem.config.js --env production
サーバー再起動後も自動復旧させる
サーバーの再起動時にPM2とその配下のプロセスを自動復旧させるには、起動スクリプトを登録します。
# 現在のプロセス一覧を保存
pm2 save
# OSに応じたスタートアップスクリプトを生成・登録
pm2 startup
pm2 startup を実行すると、環境に応じたコマンドが表示されるので、それを実行するだけで設定が完了します。以降はサーバーを再起動しても、保存済みのプロセスが自動的に立ち上がります。
まとめ
PM2を導入することで、Node.jsアプリケーションの運用は大きく変わります。クラッシュ時の自動再起動、マルチコアを活かしたクラスターモード、ゼロダウンタイムリロード、サーバー再起動後の自動復旧といった機能が、コマンド一つ・設定ファイル一つで手に入るのは大きな安心材料です。
「とりあえず node app.js で動かしている」という状態から一歩進みたい方は、まず pm2 start から試してみてください。本番運用の心強い味方になってくれるはずです。