こんにちは。現場の最前線で「止まらないシステム」を追い求めているアーキテクトです。
開発者にとって、Node.jsのアプリケーションを `node server.js` で起動し、ターミナルを閉じるとプロセスが終了してしまう…というのは最初の洗礼ですが、ビジネスの現場ではそれが「致命的な停止」を意味します。
今回は、単なる「プロセスの維持」を超えて、「Zero Downtime(無停止)」をいかにして実現するか、PM2という強力な武器を使いこなすための核心を伝授します。
—
1. なぜ「PM2」なのか?:プロセス管理の哲学
Node.jsはシングルスレッドで動作するため、エラーが一つ発生するとプロセス全体がクラッシュします。PM2は単なる「自動再起動ツール」ではありません。
- 自動復旧: 予期せぬエラーでの終了をミリ秒単位で検知し、即座に復活させます。
- クラスターモード: CPUコアをフル活用し、マルチスレッドのように並列処理を実現します。
- Zero Downtime Reload: 既存の接続を維持したまま、メモリ上のプログラムを新バージョンへ差し替えます。
これらをマスターすれば、深夜のデプロイで冷や汗をかくことはもうありません。
—
2. 基礎セットアップ:まずはここから
まずはグローバル環境にPM2を導入します。
npm経由でPM2をインストール
npm install -g pm2
動作確認:HelloWorldの永続化
簡単なサーバーを用意しましょう。
// server.js
const http = require(‘http’);
http.createServer((req, res) => {
res.writeHead(200);
res.end(‘Hello, PM2 World!’);
}).listen(3000);
これを起動します。
pm2 start server.js –name “my-app”
これでプロセスがバックグラウンドに定着しました。`pm2 list` を叩いてみてください。ステータスが `online` になっていれば成功です。
—
3. 実践:ecosystem.config.js で運用をコード化する
コマンドラインでオプションを指定するのは卒業しましょう。「設定のコード化(Infrastructure as Code)」が運用を劇的に安定させます。
プロジェクトのルートに `ecosystem.config.js` を作成します。
module.exports = {
apps: [{
name: “my-production-app”,
script: “server.js”,
// 1. クラスターモード: CPUのコア数分だけプロセスを増やす
instances: “max”,
exec_mode: “cluster”,
// 2. メモリ上限による再起動: メモリリークを未然に防ぐ防波堤
max_memory_restart: “500M”,
// 3. 環境変数設定
env: {
NODE_ENV: “development”
},
env_production: {
NODE_ENV: “production”
},
// 4. ログの生存戦略
out_file: “./logs/out.log”,
error_file: “./logs/error.log”,
merge_logs: true
}]
};
なぜこの設定が必要なのか?
- `instances: “max”`: Node.jsが本来持っていない並列性をOSレベルで実現します。
- `max_memory_restart`: これが重要です。Node.jsにはメモリリークが付き物ですが、閾値を超えたら自動でリサイクルすることで、サーバーの「突然死」を防ぎます。
—
4. Zero Downtimeを実現する「究極の再起動」
コードを修正した際、普通に再起動すると接続が一瞬切れます。しかし、PM2の「リロード」機能を使えば、古いプロセスを維持したまま、新しいプロセスが準備完了した瞬間に切り替わるため、ユーザーは停止に気づきません。
設定ファイルを読み込んでデプロイ(無停止でリロード)
pm2 reload ecosystem.config.js –env production
—
5. ログローテーション:現場の「見えない危機」を管理する
PM2のログは放置すると肥大化し、ディスクを圧迫してサーバーを停止させます。これを防ぐには `pm2-logrotate` を追加してください。
ログ管理モジュールのインストール
pm2 install pm2-logrotate
毎日ローテーションし、10日分だけ保持する設定
pm2 set pm2-logrotate:rotateInterval ‘0 0 ‘
pm2 set pm2-logrotate:retain 10
—
最後に:アーキテクトからの助言
ツールを導入する際、最も大切なのは「何が起きたらツールがどう動くべきか」を自分で設計することです。
PM2は単なる管理ツールではなく、あなたのアプリケーションを守る「番人」です。`ecosystem.config.js` をリポジトリに含め、チーム全員で同じ設定を共有してください。開発効率が上がるだけでなく、運用における「運」の要素が排除され、技術的な信頼性が積み上がっていきます。
さあ、次はあなたのプロジェクトで、この「落ちない環境」を構築してみてください。きっと、朝まで安心して眠れるようになるはずですよ。応援しています!