プロセス管理ツールpm2をCapistranoでデプロイ

Node.jsアプリケーションのプロセス管理をしてくれるpm2をcapistranoでデプロイしてみたのですが、プラグインのcapistrano-pm2でサクッとやろうとしたらうまくいかなかったのでメモしておきます(pm2はかなり高機能でNode.js以外も扱えたりデプロイ自体もこのツールでできるみたいです)

デプロイ設定

pm2の起動にはEcosystemというファイルを使用して設定するのが良さそうです。今回アプリケーションルートにecosystem.jsonというファイルを作成しました。

ecosystem.json

{
  "apps": [{
    "name": "app",
    "script": "./server.js",
    "cwd": "/var/www/app/current",
    "instances": "0",
    "watch": false,
    "exec_mode": "cluster",
    "env_staging": {
      "APP_ENV": "staging"
    },
    "env_production": {
      "APP_ENV": "production"
    }
  }]
}

capistranoの設定

Capistranoでpublishing処理がされた後に

pm2 startOrReload current/ecosystem.json --env production

このコマンドを実行して再読み込みさせますが、current以下で実行するとアプリケーションがエラーで死んでしまったので、リンクの張替えが行われないその上のディレクトリ(deploy_toで設定されているディレクトリ)で実行するようにしました。

namespace :deploy do
  desc 'Restart application'
  task :restart do
    within deploy_to do
      execute :pm2, 'startOrReload', 'current/ecosystem.json', '--env', 'production'
    end
  end
end

after 'deploy:publishing', 'deploy:restart'

設定はecosystem.jsonの作成とこの2点だけで完了です。

ecosystemの設定項目

今回使用したecosystemの設定項目についてはこのようになっています。

name

アプリケーション名を指定します。pm2 lsでプロセスを表示させた時に表示されるnameの部分です。

┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ app       │ default     │ 1.0.0   │ cluster │ 9172     │ 3h     │ 11   │ online    │ 0.3%     │ 67.6mb   │ app      │ disabled │
│ 1   │ app       │ default     │ 1.0.0   │ cluster │ 9185     │ 3h     │ 11   │ online    │ 0.4%     │ 70.8mb   │ app      │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

script

pm2 startで起動するファイルです。

cwd

アプリケーションが起動する場所を指定します、通常はアプリケーションルートを指定しておけば良いと思います。

instances

起動するプロセス数を指定します。

maxか0を指定するとCPU数分プロセスを起動させますまた、-1を指定すると[CPU数-1]個起動します。

watch

ファイルが変更されたときにリロードするかを指定します。今回はCapistranoでデプロイしてデプロイ後にリロードコマンドを実行するのでfalseにしておきます。

exec_mode

clusterモードとforkモードを指定できます。

clusterモードではプロセスを指定した数起動したあとpm2がそれぞれのプロセスにリクエストを分散してくれます。

forkモードではリクエストの分散は行いません。NginxやHAProxyなど他のアプリケーションでリクエストを分散します。それぞれのプロセスがリクエストを待ち受けるので起動時にポートがかぶらないように設定する必要があります。

今回はclusterモードで起動します。

env_xxx

xxxの部分に環境名などを指定して、起動時に

pm2 start ecosystem.json --env xxx

とするとそのプロパティ内の環境変数が設定された状態で起動します。環境変数は複数指定可です。

参照