
シリーズ:Bun × PM2 サーバー運用入門 ( 1 / 3 )
1
基礎:プロセス管理の必要性
2
導入:PM2の基本操作
3
運用:ログ・自動起動・デプロイ
「Bunでサーバーを作ってみた。でも、どうやって本番で動かし続ければいいんだろう?」
このシリーズは、そんな疑問をお持ちの方に向けたものです。Bunを使って簡単なサーバーを作ること自体は難しくありません。ところが、 ターミナルを閉じたらサーバーも止まってしまった、アプリがクラッシュして誰も気づかなかった という問題は、本番環境に出た途端に必ず直面します。
第1回では「Bunだけでは何が足りないのか」を手を動かしながら体感し、プロセス管理ツールの必要性とPM2を選ぶ理由を理解します。
Bunとは何か
BunはJavaScript/TypeScriptのランタイムで、 「速さ」と「オールインワン」 を売りにしています。2022年の初リリースから急速に成長を続け、2025年にはv1.2・v1.3と立て続けにメジャーアップデートを重ね、PostgreSQL・MySQL・Redisの組み込みクライアントまで備えるようになりました。
| 比較項目 | Node.js | Bun |
|---|---|---|
| JavaScriptエンジン | V8(Google製) | JavaScriptCore(Apple製・Safari採用) |
| 実装言語 | C++ | Zig |
| TypeScript実行 | 別途設定が必要 | ✓ 設定なしでそのまま動く |
| パッケージ管理 | npm / yarn / pnpm | bun(組み込み済み) |
| HTTP速度 | 標準的 | ベンチマーク上は5〜6倍速いケースも |
| Node.js互換性 | — | Node.js APIの90%以上をカバー |
💡 ポイント
BunはNode.jsとの高い互換性を持つため、既存のコードがほぼそのまま動きます。「新しいランタイムだからゼロから学び直し」にはなりません。
手を動かす前の準備:Bunをインストールする
macOS・Linux・Windows(WSL2)は共通のコマンド1行で動きます。
curl -fsSL https://bun.sh/install | bashインストール後はターミナルを一度閉じて開き直し、バージョンを確認します。
bun --version
# 1.3.x ← このようなバージョン番号が出れば成功Windowsネイティブ環境の場合は、PowerShellで以下を実行します。
powershell -c "irm bun.sh/install.ps1 | iex"⚠️ Windowsの方へ
Windowsネイティブ版は対応が進んでいますが、本番サーバーはLinuxで動かすことがほとんどです。このシリーズでは WSL2(Windows上でLinuxを動かす仕組み) の使用を推奨します。
Bun単体でサーバーを動かしてみる
まず「普通に動かした状態」を確認するため、シンプルなHTTPサーバーを作ります。
mkdir bun-server-demo
cd bun-server-democonst server = Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/") {
return new Response("Hello, Bun! 🎉");
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`起動しました → http://localhost:${server.port}`);bun run server.ts
# 起動しました → http://localhost:3000 ブラウザでhttp://localhost:3000 を開くとHello, Bun! 🎉 と表示されます。ここまでは順調です。 でも、本番で使うにはこれだけでは足りません。
Bun単体の問題点
「ちょっと意地悪な実験」をして、本番環境で必ず起きることを手元で再現してみましょう。
問題1:ターミナルを閉じるとサーバーも止まる
▶️ 実験
起動中のターミナルウィンドウを閉じてから、別のターミナルでアクセスを試みます。
curl http://localhost:3000
# curl: (7) Failed to connect to localhost port 3000プロセスはターミナルのセッションと紐づいているため、セッションが切れると同時に終了します。リモートサーバーにSSHしてアプリを起動していた場合、 回線が切れただけでサーバーが落ちます。
問題2:クラッシュしても誰も気づかない
▶️ 実験
わざとクラッシュするエンドポイントを追加して確認します。
const server = Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/") {
return new Response("Hello, Bun! 🎉");
}
// ← ここを追加
if (url.pathname === "/crash") {
throw new Error("意図的なクラッシュ");
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`起動しました → http://localhost:${server.port}`);# ターミナル①:起動
bun run server.ts
起動しました → http://localhost:3000
# ターミナル②:クラッシュを起こす
curl http://localhost:3000/crash
# ターミナル①に戻るとエラーが出てプロセスが終了している
error: 意図的なクラッシュ
at fetch (server.ts:10:13)
# もうアクセスできない
curl http://localhost:3000
curl: (7) Failed to connect to localhost port 3000誰かが手動で bun run server.ts を実行し直すまで、サービスはダウンしたままです。 深夜であれば翌朝まで誰も気づかないかもしれません。
問題3:ログが消える
bun run server.ts のログはそのターミナルウィンドウにしか出力されません。ウィンドウを閉じたらログも消えます。クラッシュの原因を後から調べようとしても、 記録が残っていない 状態になります。
Bun単体の限界:まとめ
💥自動再起動なし
クラッシュしたら人が気づくまでサービスはダウンしたまま。深夜のインシデントが怖い。
📡バックグラウンド実行なし
ターミナルを閉じる・SSH接続が切れるだけで即停止。サーバーに常駐できない。
🔄OS再起動後の自動起動なし
サーバーのOSを再起動したら手動で立ち上げ直しが必要。セキュリティアップデートのたびに要対応。
📋ログ管理なし
ターミナルを閉じたら記録が消える。障害の原因調査ができない。
プロセス管理ツールを比較する
こうした問題を解決するのが「プロセスマネージャー」です。代表的なツールを見てみましょう。
nodemon
開発者にはおなじみのツールです。ファイルの変更を検知して自動再起動してくれます。 ローカル開発専用 で、クラッシュ時の自動再起動・バックグラウンド実行には対応していません。
nodemon server.ts
# [nodemon] starting `server.ts`
# [nodemon] watching path(s): *.* ← ファイル変更を監視
# [nodemon] restarting due to changes... forever
「プロセスをずっと動かし続ける」というシンプルな目的に特化したツールで、2010年代に広く使われていました。ただし開発が落ち着いており、 foreverのREADME自身も「PM2やnodemonへの移行を推奨する」と記載しています。 クラスター管理やモニタリングなど、本番で必要な機能が不足しています。
PM2(Process Manager 2)
本番環境での実績が最も豊富なプロセスマネージャーです。週間ダウンロード数は 約240万回 (npmtrends調べ)、GitHubスター数は42,000を超えています。
| ツール | クラッシュ時 自動再起動 | バックグラウンド実行 | ログ管理 | クラスターモード | 向いている環境 |
|---|---|---|---|---|---|
| nodemon | △ ファイル変更時のみ | ✗ | ✗ | ✗ | 開発のみ |
| forever | ✓ | ✓ | 最低限 | ✗ | 小規模・レガシー |
| PM2 | ✓ | ✓ | ✓ | ✓ | 本番環境 |
| systemd | ✓ | ✓ | ✓ | 手動設定が必要 | Linux限定 |
PM2を選ぶ理由
では、なぜPM2なのか。4つの理由を整理します。
Reason 01
Bun公式ドキュメントで言及されている
Bunのドキュメントでは、本番での実行方法としてPM2との組み合わせが紹介されています。公式のお墨付きがある安心感は大きい。
Reason 02
Bunをそのまま使える
PM2はもともとNode.js向けですが、 --interpreter bun オプションを指定するだけで動きます。設定ファイルの形式もそのまま。
Reason 03
実績と情報量が圧倒的
週間240万ダウンロード。トラブルシュートの情報が豊富なので、初心者がつまずいても検索すれば答えが見つかります。
Reason 04
必要な機能がすべて揃っている
自動再起動・バックグラウンド実行・ログ管理・クラスターモード・OS起動時の自動起動、すべてPM2一つで賄えます。
🔍 余談:systemdという選択肢
Linux組み込みの仕組みなので追加インストール不要ですが、設定ファイルの書き方がやや複雑で、Windowsでは使えません。本シリーズでは「OS問わず使える・コマンドが覚えやすい」PM2を採用します。
📌 第1回のまとめ
Bun単体では「クラッシュ時の自動再起動・バックグラウンド実行・ログ管理」が欠けており、本番運用には不十分です。次回はいよいよPM2を実際にインストールして、Bunアプリをバックグラウンドで動かし、クラッシュしても自動で復活する様子をハンズオンで確認します。
📝 ▶ 次のステップ
次は「 」を解説します
