masalibの日記

システム開発、運用と猫の写真ブログです

Node.jsのexpressをforeverでデーモン化する

expressはエラーハンドリングされていないエラーがが起きてしまうとストップしてしまうのでサービスとしては使えません。
そこでforeverというモジュールを使ってデーモン化する事、エラー時に自動的に起動するようにします

実践Node.js プログラミング (Programmer's SELECTION)

実践Node.js プログラミング (Programmer's SELECTION)

の354ページ(12.2.2のNodeの実行を続ける)に記載されています
簡単な事しか載っていないのでネットで調べた内容を保管しています

github.com

インストールと確認

$ npm install -g forever

$ which forever
/usr/bin/pm 

$ forever --version
v0.15.3



テストアプリの準備

いきなり自分のプログラムでテストするのは怖かったので
expressジェネレーターで試すことにした
(テストが不十分な状態だったため)

sudo npm install express-generator -g
sudo mkdir /var/node	#node.jsを動かすFolder
cd /var/node 
sudo express myapp
cd myapp
sudo npm install 

これでテストアプリの準備ができた

念のためにアクセスの確認をすると

npm start
http://XXXXX:3000/

Expressの初期画面が表示される
iptablesSElinuxは動いていないとする)



foreverにテストアプリを登録する

$ forever start /var/node/myapp/bin/www

#warn:    --minUptime not set. Defaulting to: 1000ms
#warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
#info:    Forever processing file: /var/node/myapp/bin/www

$ forever list

#info:    Forever processes running
#data:        uid  command       script                  forever pid  id logfile                 uptime
#data:    [0] D-78 /usr/bin/node /var/node/myapp/bin/www 9290    9296    /root/.forever/D-78.log 0:0:2:28.619

http://XXXXX:3000/ にアクセスしてExpressの初期画面が表示される事を確認する

foreverからテストアプリを解除する

0はリストにのっているIDです
uidでも解除できます

forever stop 0
forever stop /var/node/myapp/bin/www


エラーを発生させてアプリが自動起動する事の確認

プログラムの修正
vi /var/node/myapp/app.js
//app.use('/users', users);の下の行に追加する
// errorを起こす所
app.get('/errortest', function (req, res) {
  errortestfunction();
});
foreverの再起動
forever restart /var/node/myapp/bin/www
エラーの確認

http://XXXXX:3000/errortest
にアクセスしてExpressのエラー画面が表示される事を確認する

errortestfunction is not defined
ReferenceError: errortestfunction is not defined
at /var/node/myapp/app.js:29:3

http://XXXXX:3000にアクセスして表示されることを確認する
(エラーになっても表示されていること)

設定ファイルを読み込ませて起動できる事を確認する

色々なオプションとか試したいので設定ファイルでの起動に変更する

設定変更ファイルの作成
$ vi /var/node/myapp/foreverconfig.json

{
    "uid": "myapp",
    "append": true,
	// 変更があった場合は再起動する
    "watch": true,
	// sourcedirから見た相対パスを記載する
    "script": "./bin/www",
    "sourceDir": "/var/node/myapp/"
    //"args": ["--port", "3000"]

}
設定ファイルでのデーモンの起動
$ forever start /var/node/myapp/foreverconfig.json

#warn:    --minUptime not set. Defaulting to: 1000ms
#warn:    --spinSleepTime not set. Your script will exit if it does not stay up f                                                                             or at least 1000ms
#info:    Forever processing file: ./bin/www


# 確認
$ forever list

#info:    Forever processes running
#data:        uid   command       script                  forever pid  id logfile                  uptime
#data:    [0] myapp /usr/bin/node /var/node/myapp/bin/www 9525    9551    /root/.forever/myapp.log 0:0:1:40.47

コマンドで全部やるのはめんどくさいので助かりました


これだけ調べたのですが、実際の運用はCPUやメモリやクラスタリング機能があるpm25(pm2)に切り替えてしまった
masalib.hatenablog.com
masalib.hatenablog.com

参考URL

参考にさせていただきました
ありがとうございます

qiita.com
pppurple.hatenablog.com
qiita.com
blog.shonanshachu.com