はじめに (対象読者・この記事でわかること)

この記事は、Node.js で本番運用を考えているエンジニアや、VPS・クラウドサーバ上でサービスを安定稼働させたい方を対象としています。
forever コマンドのインストール方法から基本的な使い方、プロセスの自動再起動やログ管理まで網羅的に解説するので、この記事を読むだけで以下ができるようになります。

  • Node.js アプリをバックグラウンドで永続的に起動できる
  • アプリが異常終了した際に自動で再起動させられる
  • ログの保存先やローテーションを設定できる

執筆のきっかけは、個人で運用している小規模サービスが頻繁に落ち、手動で再起動していた時に「もっと楽に管理したい」と思った経験です。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • 基本的な Node.js 開発環境(npm、package.json など)
  • Linux 系 OS のシェル操作(bash、systemctl など)

forever コマンドとは? — 背景と概要

forever は Node.js 用のプロセスマネージャで、npm でグローバルインストールできるツールです。名前の通り「永遠に」プロセスを走らせ続けることを目的としており、プロセスが予期せぬ例外で終了した場合でも自動的に再起動します。
主な特徴は次の通りです。

  1. シンプルな CLI
    forever start app.js だけでバックグラウンド実行が開始でき、forever list で現在のプロセス一覧が確認できます。
  2. ログ管理
    標準出力・標準エラー出力をファイルにリダイレクトし、ローテーションもオプションで可能です。
  3. プロセスの永続化
    サーバ再起動後に forever start コマンドだけで過去のプロセス情報を復元でき、forever-service と組み合わせると systemd サービス化も容易です。

本格的な本番環境では PM2 などの高度なマネージャが選ばれがちですが、forever は軽量かつ設定が少なく、学習コストが低い点が魅力です。小規模アプリや開発環境で「サーバが落ちてもすぐに復帰させたい」ケースに最適です。

forever の具体的な手順と実装方法

ここからは、実際に VPS 上で Node.js アプリを forever で永続化するまでのフルプロセスを解説します。全体は大きく インストール → 基本起動 → ログ設定 → 自動起動設定 → トラブルシューティング の 5 ステップに分けられます。

ステップ 1:forever のインストール

Bash
# npm でグローバルにインストール sudo npm install -g forever # インストール確認 forever -v # => 0.15.3 などバージョンが表示されれば成功

ポイント
-g オプションでグローバルインストールすると、どのディレクトリからでも forever コマンドが使用できます。権限エラーが出た場合は sudo を付与してください。

ステップ 2:シンプルにアプリを起動してみる

まずはテスト用に app.js を作成します。

Js
// app.js const http = require('http'); const port = process.env.PORT || 3000; http.createServer((req, res) => { res.end('Hello from forever!\n'); }).listen(port, () => { console.log(`Server running on port ${port}`); });

次に forever で起動します。

Bash
forever start app.js

起動状態を確認するには:

Bash
forever list

出力例:

info:    Forever processes running
data:    uid        logfile                     uptime    script
data:    0:iv3b     /root/.forever/0.log        0:00:10   app.js

ステップ 3:ログの永続化とローテーション

forever は -o(標準出力)と -e(標準エラー)オプションでログファイルを指定できます。

Bash
forever start -o /var/log/myapp/out.log -e /var/log/myapp/err.log app.js

ログが肥大化しないように logrotate と連携させる例:

Bash
# /etc/logrotate.d/myapp /var/log/myapp/*.log { weekly rotate 4 compress missingok notifempty copytruncate }

ステップ 4:サーバ再起動後の自動起動

VPS が再起動したときに forever が自動で起動するように、systemd のサービスユニットを作ります。

Ini
# /etc/systemd/system/forever-myapp.service [Unit] Description=Forever-managed Node.js app After=network.target [Service] Type=simple User=root WorkingDirectory=/home/ubuntu/myapp ExecStart=/usr/bin/forever start -c "node" -o /var/log/myapp/out.log -e /var/log/myapp/err.log app.js ExecStop=/usr/bin/forever stop app.js Restart=on-failure [Install] WantedBy=multi-user.target

登録と有効化:

Bash
sudo systemctl daemon-reload sudo systemctl enable forever-myapp sudo systemctl start forever-myapp

systemctl status forever-myapp で状態が確認できます。

ハマった点やエラー解決

1. forever: command not found が出る

  • 原因: グローバルインストールしたが PATH に /usr/local/bin が含まれていない。
  • 解決: export PATH=$PATH:/usr/local/bin をシェルのプロファイルに追記し、再ログインまたは source ~/.bashrc

2. ログファイルが 0 バイトのまま

  • 原因: forever start 時に -o-e のパスが存在しないディレクトリを指している。
  • 解決: 事前に mkdir -p /var/log/myapp && chown $USER:$USER /var/log/myapp でディレクトリを作成し、書き込み権限を付与。

3. 再起動時にプロセスが二重に起動する

  • 原因: systemd がサービスを起動した後、forever が内部でプロセスを再起動し、同一スクリプトが二重に走る。
  • 解決: ExecStartforever start の代わりに forever start -a(append)を使用し、ExecStopforever stopall を追加するか、systemd の PIDFile を利用してプロセス管理を一元化。

解決策まとめ

問題 原因 解決策
command not found PATH が通っていない PATH へ /usr/local/bin を追加
ログが出力されない ディレクトリ未作成・権限不足 ディレクトリ作成・権限付与
二重起動 systemd と forever の競合 -a オプション使用、または PIDFile で管理

まとめ

本記事では forever コマンドを用いた Node.js アプリの永続化手順 を、インストールから自動起動、トラブルシューティングまで一貫して解説しました。

  • forever のインストールと基本起動方法 を習得
  • ログの永続化と logrotate 連携 による運用安定化
  • systemd と組み合わせたサーバ再起動後の自動復帰

これらを実装することで、サーバ障害時でも手動介入なしにアプリが復帰し、運用コストが大幅に削減 されます。今後は PM2 との比較やクラスタリング構成 に関する記事を執筆予定です。

参考資料