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