サイトロゴ
PM2 Created: 2026/05/07 Updated: 2026/05/23

Bunアプリを本番で動かすには?
プロセス管理の必要性 ― Bun単体の限界とPM2を選ぶ理由

Bunアプリを本番環境で動かす際に必要になる「プロセス管理」の基本を解説。PM2とは何か、なぜ必要なのか、Bun単体運用との違いを初心者向けにわかりやすく紹介します。

シリーズ: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行で動きます。

bash
curl -fsSL https://bun.sh/install | bash

インストール後はターミナルを一度閉じて開き直し、バージョンを確認します。

bash
bun --version
# 1.3.x   ← このようなバージョン番号が出れば成功

Windowsネイティブ環境の場合は、PowerShellで以下を実行します。

powershell
powershell -c "irm bun.sh/install.ps1 | iex"

⚠️ Windowsの方へ

Windowsネイティブ版は対応が進んでいますが、本番サーバーはLinuxで動かすことがほとんどです。このシリーズでは WSL2(Windows上でLinuxを動かす仕組み) の使用を推奨します。

Bun単体でサーバーを動かしてみる

まず「普通に動かした状態」を確認するため、シンプルなHTTPサーバーを作ります。

bash
mkdir bun-server-demo
cd bun-server-demo
typescript
const 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}`);
bash
bun run server.ts
# 起動しました → http://localhost:3000

ブラウザでhttp://localhost:3000 を開くとHello, Bun! 🎉 と表示されます。ここまでは順調です。 でも、本番で使うにはこれだけでは足りません。

Bun単体の問題点

「ちょっと意地悪な実験」をして、本番環境で必ず起きることを手元で再現してみましょう。

問題1:ターミナルを閉じるとサーバーも止まる

▶️ 実験

起動中のターミナルウィンドウを閉じてから、別のターミナルでアクセスを試みます。

bash
curl http://localhost:3000
# curl: (7) Failed to connect to localhost port 3000

プロセスはターミナルのセッションと紐づいているため、セッションが切れると同時に終了します。リモートサーバーにSSHしてアプリを起動していた場合、 回線が切れただけでサーバーが落ちます。

問題2:クラッシュしても誰も気づかない

▶️ 実験

わざとクラッシュするエンドポイントを追加して確認します。

typescript
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}`);
bash
# ターミナル①:起動
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

開発者にはおなじみのツールです。ファイルの変更を検知して自動再起動してくれます。 ローカル開発専用 で、クラッシュ時の自動再起動・バックグラウンド実行には対応していません。

bash
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アプリをバックグラウンドで動かし、クラッシュしても自動で復活する様子をハンズオンで確認します。

📝 ▶ 次のステップ

次は「 」を解説します

Bun × PM2 の導入と基本操作まとめ\n起動・停止・再起動・ログ確認
PM2

Bun × PM2 の導入と基本操作まとめ 起動・停止・再起動・ログ確認

BunアプリをPM2で管理する方法を実践形式で解説。PM2のインストール、Bunアプリの起動方法、restart・stop・logsなど基本コマンドの使い方をまとめます。