node本身是一個單線程應(yīng)用
龄糊。它的特點就是所有的方法都是串行一次執(zhí)行剩晴,并且node沒有能力像java一樣去創(chuàng)建一個新的現(xiàn)成去實現(xiàn)異步萤晴,如果在執(zhí)行I/O中遇到了阻塞互艾,就會降低整個應(yīng)用的執(zhí)行效率。在應(yīng)用和計算能力要求日益倍增的今天猜嘱,單線程最大的弊端就是無法利用多核CPU
帶來的優(yōu)勢來提升運行效率
pm2的主要特性
內(nèi)建負載均衡
(使用node cluster集群模塊衅枫,可以使用服務(wù)器上的所有cpu)
后臺運行
(node app.js 這種命令是直接在前臺運行的,不穩(wěn)定朗伶,很容易斷)
0秒停機重載
(應(yīng)該是上線升級的時候 不需要停機)
停止不穩(wěn)定的進程
(避免無限循環(huán))
控制臺檢測
安裝
npm i pm2 -g
- 用法
pm2 start build/ecosystem.config.js --env test -i 4 #也可以把‘Max’傳遞給start弦撩,正確的進程數(shù)目依賴于cpu的核心數(shù)目
pm2 start build/ecosystem.config.js --name my-api # 命名進程,后面的參數(shù)其實都可以在config.js中定義
pm2 deploy build/ecosystem.config.js test # 執(zhí)行deploy部署
pm2 list # 顯示所有進程狀態(tài)
pm2 monit # 監(jiān)控所有進程
pm2 logs # 顯示所有進程日志
pm2 log name/id # 顯示單個進程日志(name為進程名稱)
pm2 stop all # 停止所有的進程
pm2 stop name/id # 停止指定的進程
pm2 reload all # 0秒停機重載所有的進程
pm2 reload name/id # 0秒停機重載指定的進程
# 0秒停機重載:
# 這項功能允許你重新載入代碼而不用失去請求連接论皆。
pm2 restart all # 重啟所有的進程
pm2 restart name/id # 重啟指定的進程
pm2 delete all # 殺死所有的進程
pm2 delete name/id # 殺死指定的進程
示例
pm2 list
pm2 monit
監(jiān)視每個node進程的CPU和內(nèi)存的使用情況
- app.js 解析(對應(yīng)的地方會有注釋)
const origin = typeof process.argv[2] != 'undefined' ? process.argv[2] : 'origin/dev';
module.exports = {
/**
* Application configuration section
* http://pm2.keymetrics.io/docs/usage/application-declaration/
* start 時會根據(jù)--env 后面的參數(shù)益楼,決定注入不同的環(huán)境變量
* pm2 start 的時候會執(zhí)行apps里面的配置
*/
apps: [
{
name: '進程的名字',
script: 'server.js', # 注入了環(huán)境變量后,執(zhí)行的腳本
log: '/var/log/xm.log',
error: '/var/log/xm-err.log',
output: '/var/log/xm-out.log',
instances: 4, # 實例數(shù)
exec_mode: 'cluster',
env: {
COMMON_VARIABLE: 'true',
},
env_test: {
NODE_ENV: 'test',
port: 4003,
},
env_development: {
NODE_ENV: 'development',
port: 4003,
},
env_production: {
NODE_ENV: 'production',
port: 3862,
},
},
],
/**
* Deployment section
* http://pm2.keymetrics.io/docs/usage/deployment/
* pm2 deploy的時候會執(zhí)行deploy中的配置纯丸,會使用ssh的方式去登錄到服務(wù)器上
* post-deploy 為拉取代碼之后 要執(zhí)行的命令偏形,若是不設(shè)置post-deploy字段的話静袖,執(zhí)行deploy命令就只是登錄到服務(wù)器上拉取對應(yīng)分支的代碼
*/
deploy: {
test: {
user: 'root',
host: 'x.x.x.x',
ref: origin,
key: 'build/key',
repo: 'git倉庫地址',
path: '代碼在服務(wù)器上的路徑',
'post-deploy': 'npm run test_build && npm run test_start',
env: {
NODE_ENV: 'test',
},
},
},
};