pm2和forever是啓動Nodejs服務常用到的兩個工具。使用這兩個指令可以使node服務在後臺運行(類似於linux的nohup),另外它們可以在服務因異常或其他原因被殺掉後進行自動重啓。
由於Node的單線程特徵,自動重啓能很大程度上的提高它的健壯性。
本文不對比兩者工具優劣,只是結合自己的使用,簡要介紹如何在工程部署時更好的使用pm2。
基本指令
npm install pm2 -g
: 全局安裝。pm2 start app.js
: 啓動服務,入口文件是app.js。pm2 start app.js -i [n] --name [name]
: 啓動n個進程,名字命名爲name。npm restart [name or id]
: 重啓服務。npm reload [name or id]
: 和rastart功能相同,但是可以實現0s的無縫銜接;如果有nginx的使用經驗,可以對比nginx
reload指令。pm2 start app.js --max_memory_restart 1024M
: 當內存超過1024M時自動重啓。
如果工程中有比較棘手的內存泄露問題,這個算是一個折中方案。pm2 monit
: 對服務進行監控。
更多的指令可以參考 PM2 介紹
高級用法
pm2支持配置文件啓動:pm2 ecosystem
: 生成配置文件ecosystem.json
pm2 startOrRestart /file/path/ecosystem.json
: 通過配置文件啓動服務
如下是我開發時ecosystem.json的內容:
{
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
* 多個服務,依次放到apps對應的數組裏
*/
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模式啓動了4個服務進程;如果服務佔用的內存超過300M,會自動進行重啓。
監控工具
pm2的監控功能是其一大特色,它提供的監控服務Keymetrics monitoring 很酷炫,感興趣的可以配置玩一下。
一些思考
1. 服務進程數
至於要啓動幾個進程,可以通過服務器的內核數進行確定,幾個內核就啓動幾個服務。指令如下:
# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id" | sort| uniq | wc -l
# 查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看邏輯CPU的個數
cat /proc/cpuinfo| grep "processor"| wc -l
當然可以啓動多個端口,一個端口號對應一個服務,這樣的話就需要nignx來做負載均衡了。
2. 是否需要nginx
nginx可以做的事情主要有兩個:
- 反向代理,實現簡單的負載均衡: 如果有多臺服務器或者一臺服務器多個端口,可以考慮用nginx。
- 靜態資源緩存:把一些靜態資源(如靜態頁面,js等資源文件)放到nginx裏,可以極大的提高服務的性能。
3. 自動化部署
通過shell腳本實現資源拉取、服務重啓、nginx緩存更新等操作,再配合pm2的監控功能,就初步達到了一個後端工程部署的標配了。