やりたかったこと

VPSで動かしているNode.jsアプリがSSHを切断するたびに終了してしまった。PM2を使ってバックグラウンドで常駐させたかった。

PM2のインストール

npm install -g pm2

グローバルインストールするので、nvmを使っている場合はバージョンを固定しておく。

アプリの起動

pm2 start app.js
# または
pm2 start app.js --name myapp

--nameでプロセス名を指定しておくと後で管理しやすい。

よく使うコマンド

# プロセス一覧確認
pm2 list

# ログ確認
pm2 logs
pm2 logs myapp

# 再起動
pm2 restart myapp

# 停止
pm2 stop myapp

# 削除
pm2 delete myapp

pm2 listでCPU・メモリ使用量も一覧で確認できる。

サーバー再起動後も自動起動させる

pm2 startup

実行すると以下のようなコマンドが出力されるので、そのままコピーして実行する。

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

その後、現在の起動設定を保存する。

pm2 save

これでサーバーを再起動してもPM2が自動で立ち上がり、登録済みのアプリも起動する。

ecosystem.config.jsで設定をまとめる

複数アプリや環境変数が多い場合は設定ファイルにまとめた方が管理しやすかった。

module.exports = {
  apps: [{
    name: 'myapp',
    script: './app.js',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log'
  }]
};
pm2 start ecosystem.config.js

ハマったポイント

  • nvmでNode.jsを管理している場合、pm2 startup後にnvmのパスが通らなくてアプリが起動しないことがある → pm2 startupの出力コマンドにPATHを追加して解決
  • pm2 saveを忘れるとサーバー再起動後に登録が消える
  • ログが溜まり続けるのでpm2 install pm2-logrotateでローテーション設定しておくと良い
  • nginxのリバースプロキシと組み合わせる時はPORTの設定を揃えること
  • pm2 startupは実行ユーザーのホームディレクトリを参照するので、rootとuserで混在しないよう注意

関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。