很簡單也很水,就是我今天由於公司項目正好在研究這個東西,權當本身記錄了,不喜勿噴~~~萬分感謝前端
對於線上項目,若是直接經過 node app 來啓動,若是報錯了可能直接中止致使整個服務崩潰,通常監控 node 有幾種方案。node
公司原來的項目採用的是 forever 的形式,不過若是 node 出現問題的時候,沒有辦法獲取到有效的監控數據進行錯誤排查,所以新開發的系統準備採用 pm2 的形式進行前端以及 node 層的監控。git
// 全局安裝pm2,依賴node和npm
npm install -g pm2
複製代碼
pm2 startgithub
// start命令啓動對應的node server文件
$ pm2 start ./build/server.js
複製代碼
啓動以後,控制檯會看到以下消息:web
如上圖所示,能夠看到項目
kafazhe
成功啓動,id 是 0,而且狀態時 online.npm
pm2 show (appname|id)json
$ pm2 show kaifazhe
複製代碼
如上圖所示,能夠查看到 kaifazhe 進程的詳細信息瀏覽器
pm2 listbash
$ pm2 list
複製代碼
pm2 monitapp
$ pm2 monit
複製代碼
可使用 pm2 monit 功能監控全部 node 進程的運行狀況,包括各類響應,錯誤信息。
pm2 logs
$ pm2 logs
複製代碼
pm2 web
$ pm2 web
複製代碼
我只能說,這也太 NB 了吧,不只能夠監控這些進程,還能監控運行這些進程的機器的狀態,逆天了。而後它會自動起一個服務在指定端口,如圖在 9615 啓動了一個服務,咱們能夠訪問。雖然我看不太懂,可是對於測試運維同窗來講,應該挺有用的吧。
pm2 stop (id|all)
// 中止id爲0的進程
$ pm2 stop 0
// 中止全部進程
$ pm2 stop all
複製代碼
如圖,咱們運行了兩個服務狀態都是 online,使用 stop 0 以後,kaifazhe 的服務變成了 stopped,而後使用 stop all,全部進程狀態全變成了 stopped。
pm2 restart (id|all)
// 重啓id爲0的進程
$ pm2 restart 0
// 重啓全部進程
$ pm2 restart all
複製代碼
pm2 delete (id|all)
// 殺死id爲0的進程
$ pm2 delete 0
// 殺死全部進程
$ pm2 delete all
複製代碼
從上圖咱們能夠看出,restart 0 以後,0 進程從 stopped 狀態變成了 online,而後咱們使用 delete 0,進程 0 就消失不見了,咱們再 delete all,能夠看到如今沒有任何進程在運行。
pm2 啓動的方式能夠進行不少的擴展,好比設置環境,設置錯誤信息打印,設置輸入信息打印等等高級功能。那麼一條命令就不能完成這些任務,全部 pm2 提供了配置文件的方式來啓動~
// 名稱任意,按照我的習慣來
module.exports = {
apps: [
{
name: 'kaifazhe', // 應用名稱
script: './build/server.js', // 啓動文件地址
cwd: './', // 當前工做路徑
watch: [
// 監控變化的目錄,一旦變化,自動重啓
'src',
'build',
],
ignore_watch: [
// 忽視這些目錄的變化
'node_modules',
'logs',
'public',
],
node_args: '--harmony', // node的啓動模式
env: {
NODE_ENV: 'development', // 設置運行環境,此時process.env.NODE_ENV的值就是development
ORIGIN_ADDR: 'http://www.yoduao.com'
},
env_production: {
NODE_ENV: 'production',
},
out_file: './logs/out.log', // 普通日誌路徑
error_file: './logs/err.log', // 錯誤日誌路徑
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z',
},
],
};
複製代碼
對於上面的 env,咱們能夠在內部添加不少個參數變量,這樣咱們所使用的 process.env.XXX 就會對應發生變化,例如上面,咱們 process.env.ORIGIN_ADDR 的值就是
http://www.youdao.com
~
最 666 的功能來了~自動給你作負載均衡,只須要一條命令,之前那些複雜的概念懂不懂無所謂。
pm2 start server.js -i (number|max)
# 開啓三個進程運行項目
pm2 start app.js -i 3
# 根據機器CPU核數,開啓對應數目的進程運行項目
pm2 start app.js -i max
複製代碼
配置文件裏對應的:
"instance": (number|max)
// pm2.config.js
"instances": 2, // 啓動兩個實例
複製代碼
這裏是時隔一年後補充的,當初只是爲了簡單寫寫總結,不過沒想到這麼多人點贊喜歡了,那麼一年以後隨着使用加深,對於pm2有個其餘的總結,就補充一下~
上面配置文件能夠看出來,咱們能夠配置logs,包括普通的out和錯誤的error日誌。其實也不須要咱們作什麼,咱們只須要在config裏面配置好就行,他就會自動往裏面寫日誌:
很簡單的功能,就包含了日誌,真是美妙到不行,可是,真的那麼美妙嗎?哈哈,好像不是?咱們的日誌所有輸出到了err.log
和out.log
內,日積月累,OMG不敢想象,排查問題確定很費勁,因此就有了下面的日誌分割~
咱們正常意義上的日誌,以node爲例,應該都是使用的log4js
來進行按日期寫入的,那麼pm2可不能夠按日期寫入呢?答案確定是:能夠。
pm2爲咱們提供了插件系統,而日期分割功能就正好用到了插件系統:pm2-logrotate
安裝:
pm2 install pm2-logrotate // 看好了,是pm2 install而不是npm install
複製代碼
你裝完以後它就自動啓動,而後你還能夠配置各類參數
而後就完成了日誌按日期分割~
細心的小夥伴可能發現了,你上面讓我安裝的是
pm2-logrotate
,爲啥你安裝的是pm2-logrotate-ext
,嗯,由於聽說官方的pm2-logrotate
存在一個bug,就是日期會正常分割,可是若是你前一天的文件沒有寫滿好比你設置了1M但只寫了500K那麼次日的日誌仍是會插入到原來的out.log(err.log),因此大牛就寫了這個解決了這個問題pm2-logrotate-ext
可能不少人不喜歡控制檯,喜歡把監控數據進行可視化更方便查看和分析。沒關係,高手們已經爲咱們提供了工具,pm2-web,一看就是專門配合pm2來使用的。
npm install -g pm2-web
複製代碼
默認pm2-web會自動啓動一個端口8080,可是咱們仍是喜歡可控狀態的,所以按照配置文件的方式啓動。
$ pm2-web --config pm2-web-config.json
複製代碼
// pm2-web-config.json
{
"www": {
"host": "localhost",
"address": "0.0.0.0",
"port": 6688
}
}
複製代碼
這樣你就能夠在瀏覽器查看可視化的監控狀態了~
說明一下,圖片是我從網上找的,爲何沒在本地啓動呢,緣由是
pm2-web
依賴node-inspector
,而node-inspector
對於高版本node沒法安裝,不少人提了issue,可是感受開發者也處於放棄了的狀態。我也不打算在本地安裝低版本node,因此感興趣的你們能夠安裝個低版本的試試~