目前Nodejs開發中有很多痛點,其中有一個是修改完代碼以后需要我們重啟服務才能看到效果。這樣一次次的殺進程、重啟,殺進程、重啟很讓人頭大。程序員是最痛恨重復工作的物種,之前有了解過的同學可能知道 forever 。 forever 可以幫我們解決上面的問題,通過對資源變化的檢測做到變化后自動重啟。開發階段我們使用 node file.js 來啟動另外由於Nodejs的單線程,任何異常都會導致整個服務中斷,這對於生產上長時間提供服務的程序來講是不可以的, forever 可以幫我們在異常后重啟,保證服務一直在線,我想這也就是它名字的由來吧。但我想說的是 forever 不夠“高!大!上!”。接下來我要介紹一個足夠高大上的神器– pm2 。
簡介
pm2 = P (rocess) M (anager)2,是可以用於生產環境的Nodejs的進程管理工具,並且它內置一個負載均衡。它不僅可以保證服務不會中斷一直在線,並且提供0秒reload功能,還有其他一系列進程管理、監控功能。並且使用起來非常簡單。下面我將把我的使用過程分享出來,Nodejs應用是一個基於Express 4.x的應用,名稱是 Wolverine 。
安裝
環境清單:
- windows7 x64
- node v5.0.0
- npm 3.3.6
全局安裝 pm2
$ npm install pm2 -g
更新
$ pm2 update
啟動
以前啟動 Wolverine 是利用package.json的 scripts 來實現的,只需要執行 npm run start 就可以啟動,配置如下:
"scripts": {
"start": "node ./bin/www", "debug": "node debug ./bin/www" },
使用 pm2 我們可以在start處配置成 pm2 ./bin/www ,命令后面支持加參數來實現watch、cluster多進程模式等功能。我不太喜歡一大串的命令,於是我使用了配置文件的方式。
在 Wolverine 的根目錄,我創建了一個 processes.json 配置文件,配置文件內容如下,注釋寫的也很清楚了
{
"apps" : [{
"name" : "Wolverine", //名稱 "script": "./bin/www", //程序入庫 "cwd": "./", //根目錄 "watch":[ "bin", "common", "configs", "public", "routes", "views" ],//需要監控的目錄 "error_file":"./logs/app-err.log",//錯誤輸出日志 "out_file":"./logs/app-out.log", //日志 "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式 }] }
隨后,我在package.json中增加了一條
"pm2": "pm2 start processes.json"
在啟動就直接輸入如下命令就好:
$ npm run pm2
看到下面的界面,就啟動成功了,然后我們就可以關掉這個窗口了,服務不會因此停止,是不是高大上多了。
管理和監控
啟動成功的界面會展示App name和id,這兩個值很重要。當然這兩個值都可以在processes.json配置文件進行配置。
打開命令行,在任何路徑下,輸入
$ pm2 list
就能看到啟動時的圖表界面,方便我們查看所有通過pm2管理的Nodejs服務。
輸入,下面命令配合id或者name可以查看某一個進程的詳細信息
$ pm2 show Wolverine 或者
$ pm2 show 0
內容涉及重啟次數、運行時間、腳本路徑、參數、日志路徑、運行模式等等信息
輸入
$ pm2 monit
停止、重啟等命令
$ pm2 stop [app-name|id] #停止某一個進程,可以使用app-name或者id $ pm2 stop all #停止所有進程 $ pm2 restart all #重啟所有的進程 $ pm2 delete [app-name|id]#刪除並停止進程 $ pm2 delete all #刪除並停止所有進程
可以進一步查看每一個服務的cpu、內存動態占用情況。
日志監控
如果你一直使用 tail -f log_file.log log_error.log 來查看日志,你可能會愛上下面的這個功能。
$ pm2 logs $ pm2 logs [app-name]
我們可以實時查看全部進程的日志,或者只查看某一個。我們甚至可以使用json格式查看日志。
$ pm2 logs --json
Web API
如果你不僅僅想監控被pm2管理的進程,還需要監控進程所運行的機器的信息,你可以使用下面這個API
$ pm2 web
pm2會啟動一個叫做pm2-http-interface的進程提供web服務。你打開瀏覽器輸入http://127.0.0.1:9615,是不是被看到的結果驚艷到了。
pm2提供的web api通過json輸出了很多信息。大致結構可以看截圖:
拿出你的想象力,我們可以開發一個應用來調用此api,就可以開發出一個圖形界面的監控軟件了。。。
