share facebook facebook2 twitter menu hatena pocket slack

2014.07.08 TUE

Sensu のイケてる(と思う)ダッシュボード Uchiwa を pm2 でデーモン化する

川原 洋平

WRITTEN BY川原 洋平

cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。

今回も SensuUchiwa のネタですので、ちょっと癒やし的な意味を込めて扇子とうちわの画像を。

01

はじめに

Sensu の直近でイケてるなあと思っている uchiwa というダッシュボードですが、nodejs で動作しているのですがデーモン化しないとサーバー再起動時等に手動で起動せにゃあかん状況です。これではちょっち残念なので同僚に教えて頂いた pm2 という node.js のアプリケーションをお手軽にデーモン化してくれるツールでデーモン化してみたいと思います。


pm2 とは

まずはググらビリティ

SensuUchiwa 同様に pm2 もググらビリティ悪すぎは否めません…

02

気を取り直して…pm2 とは

こちらを参考に…以下のような特徴があります。

  • node.js アプリを負荷分散管理するパッケージ
  • ロードバランサ機能
  • デーモンスクリプト
  • 不安定なプロセスを停止させる機能

などなど。こちらの記事等を拝見させて頂くとだいぶんイケたツールのようですのでかなり楽しみですね。


uchiwa を使う

事前準備

uchiwanode.js で動作するので nodejs とその関連パッケージをインストールしておきましょう。

rpm --import http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install git
yum -y install --enablerepo epel nodejs npm

今回も AWSEC2 インスタンス上に構築した CentOS を利用します。

uchiwa のセットアップ

uchiwa は git clone してきて config.js を修正し npm コマンドで関連パッケージをインストールするだけ。

cd /opt
git clone https://github.com/palourde/uchiwa.git
cd /opt/uchiwa
cp config.js.example config.js
cat << EOT > config.js
module.exports = {
  sensu: [
    {
      name: 'API 1',
      host: 'Sensu API hostname',
      ssl: false,
      port: 4567,
      user: '',
      pass: '',
      path: '',
      timeout: 5000
    }
  ],
  uchiwa: {
    user: 'uchiwa',
    pass: 'aoide',
    stats: 10,
    refresh: 10000
  }
}
EOT
npm install

uchiwa をあおぎましょう

以下のように node コマンドを利用してアプリケーションを立ち上げます。

node app.js

実行するとフォアグランドで uchiwa が起動します。ま、とにかく簡単ですね。

03

残念ながら Ctrl+c で止めなければいけなかったり、端末閉じたりすると uchiwa が落ちたりと使い勝手がよくなさそうです。

04


そこでpm2

pm2 をインストール

以下のように npm コマンドを利用してインストールします。

npm install pm2@latest -g

簡単ですね。

早速 uchiwa を起動してみましょう

以下のようにアプリケーション名を指定して pm2 経由で uchiwa を起動してみましょう。

pm2 start app.js --name uchiwa

以下のように出力されて uchiwa が起動します。

05

ちゃんと uchiwa が起動しているか一応確認しましょう。

06

おお。

pm2 の機能を見てみる

こちらを見ながら pm2 の機能の一部(個人的にチョイス)を見てみたいと思います。

pm2 list

pm2 で管理しているプロセスの一覧を確認することが出来ます。

07

pm2 desc${id}

id を指定するとプロセスの詳細を確認することが出来ます。

08

pm2 monit

アスキーアートで各プロセスのリソース利用状況が確認出来ます。

pm2 monit

実行すると以下のように表示されます。

09

Ctrl+c で終了します。

pm2 logs

管理しているアプリケーションプロセスのログを確認することが出来ます。

10

Ctrl+c で終了します。

pm2 stop

stop コマンドは以下のように使います。

pm2 stop all

管理している全てのアプリケーションプロセスを停止します。また、以下のように id を指定して個別のアプリケーションプロセスを停止します。

pm2 stop ${id}

pm2 delete

delete コマンドは pm2 の管理からアプリケーションプロセスを削除します。stop と同様に all を指定すると全てのアプリケーションプロセスが対象となり、id を指定するとで個別のアプリケーションプロセスを削除することが出来ます。

pm2 delete all

または

pm2 delete ${id}

pm2 restart

restart は管理されているアプリケーションプロセスを再起動します。stopdelete 同様に all または個別の id が指定可能です。

pm2 restart all

または

pm2 restart ${id}

pm2 startup centos

startupCentOS または ubuntu 用のスタートアップスクリプトを作成してくれます。ファンタスティック。

pm2 startup centos

実行すると以下のように表示されます。

11

この状態から /etc/init.d/pm2-init.sh stop/etc/init.d/pm2-init.sh startpm2 自身のプロセスの管理が出来るようになります。ちなみに、uchiwa を自動起動させたい場合には以下のように設定するとよろしく出来そうです。

  1. pm2 startup centos
  2. /etc/init.d/pm2-init.sh start
  3. cd /etc/opt/ && pm2 start app.js

これで、再起動時にも uchiwa が起動してくれますし、pm2 コマンドで管理することが出来ます。尚、自動起動させたくない場合には pm2 deletepm2 管理下から外してあげれば自動起動はしなくなります。

pm2 web

ちょっとした Web 管理インターフェースを備えているようです。以下のように実行すると…

pm2 web

以下のように表示されます。Web 管理インターフェースは 9615 ポートで Listen します。

12

ブラウザでアクセスすると以下のように JSON フォーマットの出力が得られます。

13

尚、この Web 管理インターフェースを停止する場合には以下のように stop コマンドの引数として id を指定します。

pm2 stop 3

祝・デーモン化

以下の状態から再起動してみましょう。

14

再起動、それは魔法の言葉。

shutdown -r now

再起動しました。

15

しばし待ってから改めてインスタンスにアクセス。

16

ちゃんとアプリケーションも起動しているようです。一応、uchiwa も確認。

17

素晴らしい。


おまけ(とするには勿体無い)

pm2 の実力

pm2node.js で書かれたアプリケーション以外も管理出来るというなんとも驚きのツールです…。こちらを見ると pythonRuby なんでも来い状態です。但し、何かしらの制限事項はあると思いますのでそのあたりについて引き続き調べてみたいと思います。

bash Web サーバーを pm2 で管理するデモ

bash の Web サーバー

nc コマンドを駆使することで、たった一行の bash スクリプトで Web サーバーが実装可能です。

while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html; } | nc -l 8080; done

凄いですね。これを以下のようなスクリプトにしてしまいます。

cat << EOT > bash-web.sh
#!/usr/bin/env bash

while true; do { echo -e 'HTTP/1.1 200 OKrn'; cat index.html; } | nc -l 8080; done
EOT
chmod 755 bash-web.sh

合わせてカレントディレクトリに index.html を作成します。

cat << EOT > index.html
hoge
EOT

pm2 で管理出来るようにする

以下のように pm2 経由で起動するようにしてみます。

pm2 add bash-web.sh

以下のように表示されました。

18

ブラウザでアクセスしてみたいと思います。

19

ログも pm2 経由で確認が出来ます。

pm2 logs

以下のように表示されます。

20

一応、pm2 経由で bash で書いたプロセスが管理されているようです。但し、実際に触っていると pm2 側でアプリケーションプロセスを delete しても勝手にアプリケーションプロセスが上がってきたりする挙動が見られたので、実際に利用する場合はアプリケーションのプロセス管理等は工夫をする必要があるかもしれません。


まとめ

今回やったこと

  • uchiwapm2 というツールを使ってデーモン化した
  • pm2Bash で書いた簡単 Web サーバーもデーモン化出来た

一言

  • pm2 素敵!
  • ちなみに他のアプリケーションも pm2 から管理出来るのも面白い

元記事はこちら