Skip to content
VDS · ウェブサイトとウェブサーバー

systemdでのNode.jsアプリケーション運用

SSH切断やマシン再起動後も動作し続けるようにVDSでNodeアプリケーションを実行する方法を説明します。systemdユニット、環境変数、ログを扱います。

更新日 2026年8月23日

手動で起動した node index.js は SSH セッションの終了とともに停止します。アプリケーションを常時稼働させ、再起動後も自動的に復帰させるには、systemd サービスとして実行します。これはシステムに組み込まれた仕組みなので、追加でインストールするものはありません。

準備

Node は古いシステムパッケージではなく、公式リポジトリからインストールします。

curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node -v

専用ユーザーを作成します。アプリケーションを root で実行してはいけません。

useradd -r -m -d /srv/app -s /usr/sbin/nologin appuser
chown -R appuser:appuser /srv/app
sudo -u appuser npm ci --omit=dev --prefix /srv/app

systemd サービス

/etc/systemd/system/myapp.service ファイル:

[Unit]
Description=My Node app
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/srv/app
EnvironmentFile=/srv/app/.env
ExecStart=/usr/bin/node /srv/app/index.js
Restart=always
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp

Restart=always はクラッシュ後にプロセスを復帰させます。EnvironmentFile は引用符も export もない、素の KEY=value 形式のファイルです。パスワードを保持するため、パーミッションは 600 に設定してください。

プロキシ経由での公開

アプリケーションは 127.0.0.1:3000 のみで待ち受け、証明書を持つ Web サーバーが外部へ配信します。

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

詳細は リバースプロキシ と Let's Encrypt を参照してください。アプリケーションが 0.0.0.0 で待ち受けると、プロキシを迂回して、暗号化なしでインターネットから到達できてしまいます。

ログとアップデート

journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago" -p err
systemctl restart myapp

stdout への出力は自動的にジャーナルへ送られるため、独自のログファイルやログローテーションを設定する必要はありません。

よくあるエラー

症状原因
status=203/EXECExecStart 内の node またはファイルへのパスが誤っている — 絶対パスを使用してください
サービスが再起動を繰り返す起動時にアプリケーションがクラッシュしている — journalctl -u myapp -n 50 を確認してください
EADDRINUSE手動で起動したプロセスがまだ実行中 — ss -tulpn | grep 3000
SSH 経由では動作するが、サービスとしては動作しない環境変数が不足している — systemd はそれらを保持していないため、EnvironmentFile で設定してください
VDS-1 でビルドがメモリ不足になるローカルでビルドし、完成したビルドをマシンへアップロードしてください

systemd の上に pm2 を重ねないでください。1 つのプロセスに 2 つのスーパーバイザーが関与すると混乱を招きます。pm2 が再起動している間、systemd はプロセスが稼働中と見なします。