pm2和forever是啟動(dòng)Nodejs服務(wù)常用到的兩個(gè)工具死相。使用這兩個(gè)指令可以使node服務(wù)在后臺運(yùn)行(類似于linux的nohup),另外它們可以在服務(wù)因異成穑或其他原因被殺掉后進(jìn)行自動(dòng)重啟肮柜。 由于Node的單線程特征,自動(dòng)重啟能很大程度上的提高它的健壯性素挽。
本文不對比兩者工具優(yōu)劣狸驳,只是結(jié)合自己的使用缩赛,簡要介紹如何在工程部署時(shí)更好的使用pm2酥馍。
基本指令
npm install pm2 -g
: 全局安裝阅酪。
pm2 start app.js
: 啟動(dòng)服務(wù),入口文件是app.js术辐。
pm2 start app.js -i [n] --name [name]
: 啟動(dòng)n個(gè)進(jìn)程,名字命名為name必孤。
npm restart [name or id]
: 重啟服務(wù)瑞躺。
npm reload [name or id]
: 和rastart功能相同,但是可以實(shí)現(xiàn)0s的無縫銜接幢哨;如果有nginx的使用經(jīng)驗(yàn),可以對比nginx reload指令闸与。
pm2 start app.js --max_memory_restart 1024M
: 當(dāng)內(nèi)存超過1024M時(shí)自動(dòng)重啟岸售。 如果工程中有比較棘手的內(nèi)存泄露問題,這個(gè)算是一個(gè)折中方案映胁。
pm2 monit
: 對服務(wù)進(jìn)行監(jiān)控甲雅。
更多的指令可以參考 PM2 介紹
高級用法
pm2支持配置文件啟動(dòng):
pm2 ecosystem
: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/ecosystem.json
: 通過配置文件啟動(dòng)服務(wù)
如下是我開發(fā)時(shí)ecosystem.json的內(nèi)容:
{
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
* 多個(gè)服務(wù),依次放到apps對應(yīng)的數(shù)組里
*/
apps : [
// First application
{
name : "nova",
max_memory_restart: "300M",
script : "/root/nova/app.js",
out_file : "/logs/nova_out.log",
error_file : "/logs/nova_error.log",
instances : 4,
exec_mode : "cluster",
env: {
NODE_ENV: "production"
}
}
]
}
上述采用cluster模式啟動(dòng)了4個(gè)服務(wù)進(jìn)程弛姜;如果服務(wù)占用的內(nèi)存超過300M妖枚,會(huì)自動(dòng)進(jìn)行重啟。
監(jiān)控工具
pm2的監(jiān)控功能是其一大特色,它提供的監(jiān)控服務(wù)Keymetrics monitoring
很酷炫寂恬,感興趣的可以配置玩一下莱没。
一些思考
1. 服務(wù)進(jìn)程數(shù)
至于要啟動(dòng)幾個(gè)進(jìn)程,可以通過服務(wù)器的內(nèi)核數(shù)進(jìn)行確定饰躲,幾個(gè)內(nèi)核就啟動(dòng)幾個(gè)服務(wù)。指令如下:
# 查看物理CPU個(gè)數(shù)
cat /proc/cpuinfo| grep "physical id" | sort| uniq | wc -l
# 查看每個(gè)物理CPU中core的個(gè)數(shù)(即核數(shù))
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看邏輯CPU的個(gè)數(shù)
cat /proc/cpuinfo| grep "processor"| wc -l
當(dāng)然可以啟動(dòng)多個(gè)端口妄壶,一個(gè)端口號對應(yīng)一個(gè)服務(wù)寄狼,這樣的話就需要nignx來做負(fù)載均衡了。
2. 是否需要nginx
nginx可以做的事情主要有兩個(gè):
- 反向代理狡逢,實(shí)現(xiàn)簡單的負(fù)載均衡: 如果有多臺服務(wù)器或者一臺服務(wù)器多個(gè)端口拼卵,可以考慮用nginx。
- 靜態(tài)資源緩存:把一些靜態(tài)資源(如靜態(tài)頁面腋腮,js等資源文件)放到nginx里,可以極大的提高服務(wù)的性能徊哑。
3. 自動(dòng)化部署
通過shell腳本實(shí)現(xiàn)資源拉取聪富、服務(wù)重啟莺丑、nginx緩存更新等操作,再配合pm2的監(jiān)控功能墩蔓,就初步達(dá)到了一個(gè)后端工程部署的標(biāo)配了梢莽。