expressはエラーハンドリングされていないエラーがが起きてしまうとストップしてしまうのでサービスとしては使えません。
そこでforeverというモジュールを使ってデーモン化する事、エラー時に自動的に起動するようにします
実践Node.js プログラミング (Programmer's SELECTION)
- 作者: Mike Cantelon,Marc Harter,T.J. Holowaychuk,Nathan Rajlich,生越昌己,吉川邦夫
- 出版社/メーカー: 翔泳社
- 発売日: 2014/06/10
- メディア: 大型本
- この商品を含むブログ (1件) を見る
簡単な事しか載っていないのでネットで調べた内容を保管しています
- インストールと確認
- テストアプリの準備
- foreverにテストアプリを登録する
- foreverからテストアプリを解除する
- エラーを発生させてアプリが自動起動する事の確認
- 設定ファイルを読み込ませて起動できる事を確認する
- 参考URL
インストールと確認
$ 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の初期画面が表示される
(iptablesやSElinuxは動いていないとする)
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