Node.js のアプリケーションを本番環境に反映するためにPM2を導入する方法です。
Node.js を本番サーバーで立ち上げる際に気にしていたこと
アプリケーションを本番環境で起動させるにあたり、気にすべきことは山ほどあると思います。
今回、Node.js のアプリケーションということでアプリケーションサーバーの立ち上げが必要でした。
- デーモン化した状態で起動させること
- プロセス管理ができること
- 更新時の手間がかからないこと
などを基準として、選定したのがPM2でした。
PM2とは
PM2は、Node.js を本番環境で起動するためのもので、プロセスをデーモン化したりの起動を管理することができるツールです。
Githubのリポジトリはこちらです。
PM2には、主にこのような機能があります。
- プロセス管理
- クラスタリング
- 内臓のモニタリングUI
また、Keymetrics という名前で、有償版が存在しているのもメリットだと思います。
それ以外にも良いところがたくさんあるので、興味がある方は公式ページをご覧ください。
http://pm2.keymetrics.io/
導入方法
ここからが本題です。
まずは大まかな手順をお伝えします。
- サーバーに Node.js をインストールする(今回は省略します)
- PM2をインストールする
- Apache から Node.js のアプリケーションサーバーにProxyを設定する
- PM2経由で Node.js アプリケーションを起動する
1. サーバーに Node.js をインストールする
Node.js をインストールする方法は様々で、説明しだすと1つ記事が出来上がるほど説明が長くなるので、今回は省略させていただきます。
ちなみに私は、nodebrew を使用しました。
2. PM2をインストールする
PM2のインストールはとても簡単で、下記コマンドを実行するだけでパッケージがインストールされます。
# npm
npm install pm2 -g
# yarn
yarn global add pm2
ただ、yarn を経由して pm2 をインストールした方や、nodenv や nodebrew を使用して Node.js をインストールした方は、
実行環境に PATH が通っていない可能性があります。
試しに、こちらのコマンドを実行してみてください。
which pm2
これでパスが表示されれば良いのですが、PATHに含まれていないエラーが出た場合はパスを通す必要があります。
インストールした方法で、グローバルインストールされたフォルダがどこにあるかを調べてパスを通してください。
3. Apache から Node.js のアプリケーションサーバーにProxyを設定する
Node.js のアプリケーションを立ち上げる場合、Proxy経由で localhostに接続しなければ、
ファイルを直接叩きにいってしまうので、Proxyを設定する必要があります。
Apache の conf ファイルに下記の記述を追加してください
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
Locationディレクティブの中に書くのであれば、このようになります。
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
設定が終わったら忘れずにhttpdをリスタートしてください。
service httpd restart
これで Node.js のアプリケーションが待ち構えているポートにProxy経由でアクセスすることができます。
4. PM2経由で Node.js アプリケーションを起動する
いよいよアプリケーションの立ち上げです。
pm2 start /path/to/app.js -n 'application_name'
これでアプリケーション名を指定した状態で立ち上げることができます。
プロセスが立ち上がっているかを確認するには下記のようにします。
pm2 list
アプリケーションが立ち上がっていれば、立ち上がっているアプリケーションの情報が表示されます。
もし、Node.js をCoffeescriptなどで記述している場合は、下記のコマンドで立ち上げます。
pm2 start /path/to/bin/www -n 'application_name'
終わりに
Node.js を使用したアプリケーションは、増加傾向にあります。
Rails でAPIサーバーを立てて、アプリケーション側は Node.js というのも多くなってきていますし、
Ionicなどのモバイルアプリケーションを開発するためのフレームワークも Node.js をベースにして作られています。
それらを本番化する際に役立てていただければ幸いです。