pm2のデプロイ機能を試してみる

pm2はforeverと類似のプロセスマネージャですが、foreverと比べると以下のようなメリットがあります。

  • マシンのコア数に応じて複数のプロセスを起動し、バランシングを行うことができる
  • CPU使用率、メモリ使用量、再起動回数などの項目を監視することができる
  • Gitリポジトリからのデプロイ機能を備えている

というわけでSailsアプリケーションでデプロイ機能を試してみました。デプロイのイメージは以下のような感じです。

pm2でデプロイを行う場合の注意点としてNodeのモジュールはすべてアプリケーションにローカルインストールし、node_modulesディレクトリをGitリポジトリにコミットしておく必要があります。Sailsなどを使う場合、Windows上だとnode_modulesディレクトリのネストが深すぎてgit addするとき怒られることがあるのでCドライブ直下など、できるだけ浅い場所で作業するほうがよいと思います。

まずはSailsプロジェクトのルートディレクトリで以下のコマンドを実行し、デプロイ用の設定ファイルの雛形を生成します。

$ pm2 ecosystem

ecosystem.jsonというファイルが以下の内容で生成されるのでプロジェクトやデプロイ先の環境にあわせて適当に設定を変更し、リモートリポジトリにプッシュしておきます。

{
  "apps" : [{
    "name"      : "API",
    "script"    : "app.js",
    "env": {
      "COMMON_VARIABLE": "true"
    },
    "env_production" : {
      "NODE_ENV": "production"
    }
  },{
    "name"      : "WEB",
    "script"    : "web.js"
  }],
  "deploy" : {
    "production" : {
      "user" : "node",
      "host" : "212.83.163.1",
      "ref"  : "origin/master",
      "repo" : "git@github.com:repo.git",
      "path" : "/var/www/production",
      "post-deploy" : "pm2 startOrRestart ecosystem.json --env production"
    },
    "dev" : {
      "user" : "node",
      "host" : "212.83.163.1",
      "ref"  : "origin/master",
      "repo" : "git@github.com:repo.git",
      "path" : "/var/www/development",
      "post-deploy" : "pm2 startOrRestart ecosystem.json --env dev"
    }
  }
}

準備ができたらアプリケーションをデプロイしてみます。プロジェクトのルートディレクトリでまずは以下のコマンドを実行します(devの部分はproductionなどデプロイする環境にあわせて変更します)。なお、デプロイ先のサーバへの操作はSSH経由で行われますのでデプロイ先にもNode.js、pm2、Gitなどがインストールされている必要があります。

$ pm2 deploy ecosystem.json dev setup

これでデプロイ先にGitリポジトリがクローンされ、デプロイが可能になります。以下のコマンドを実行するとデプロイ先に配置されたファイルがリモートリポジトリの内容で最新化され、post-deployに指定したコマンドによって起動されます。

$ pm2 deploy ecosystem.json dev

Node.jsアプリケーションの開発・運用にはpm2のようなプロセスマネージャが必須ですが、デプロイ機能まで付属しており手軽に利用できるのは嬉しいところです。ただ、現状ではpm2だと複数のサーバへのデプロイが難しかったり、Windows上では利用できないといった欠点もあります。デプロイには別のツールを使用し、pm2は運用環境でのプロセスマネジメントに特化した使い方をするのがよいかもしれません。