node本身是一个单线程应用
。它的特点就是所有的方法都是串行一次执行,并且node没有能力像java一样去创建一个新的现成去实现异步,如果在执行I/O中遇到了阻塞,就会降低整个应用的执行效率。在应用和计算能力要求日益倍增的今天,单线程最大的弊端就是无法利用多核CPU
带来的优势来提升运行效率
pm2的主要特性
内建负载均衡
(使用node cluster集群模块,可以使用服务器上的所有cpu)
后台运行
(node app.js 这种命令是直接在前台运行的,不稳定,很容易断)
0秒停机重载
(应该是上线升级的时候 不需要停机)
停止不稳定的进程
(避免无限循环)
控制台检测
安装
npm i pm2 -g
- 用法
pm2 start build/ecosystem.config.js --env test -i 4 #也可以把‘Max’传递给start,正确的进程数目依赖于cpu的核心数目
pm2 start build/ecosystem.config.js --name my-api # 命名进程,后面的参数其实都可以在config.js中定义
pm2 deploy build/ecosystem.config.js test # 执行deploy部署
pm2 list # 显示所有进程状态
pm2 monit # 监控所有进程
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
监视每个node进程的CPU和内存的使用情况
- app.js 解析(对应的地方会有注释)
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 时会根据--env 后面的参数,决定注入不同的环境变量
* pm2 start 的时候会执行apps里面的配置
*/
apps: [
{
name: '进程的名字',
script: 'server.js', # 注入了环境变量后,执行的脚本
log: '/var/log/xm.log',
error: '/var/log/xm-err.log',
output: '/var/log/xm-out.log',
instances: 4, # 实例数
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的时候会执行deploy中的配置,会使用ssh的方式去登录到服务器上
* post-deploy 为拉取代码之后 要执行的命令,若是不设置post-deploy字段的话,执行deploy命令就只是登录到服务器上拉取对应分支的代码
*/
deploy: {
test: {
user: 'root',
host: 'x.x.x.x',
ref: origin,
key: 'build/key',
repo: 'git仓库地址',
path: '代码在服务器上的路径',
'post-deploy': 'npm run test_build && npm run test_start',
env: {
NODE_ENV: 'test',
},
},
},
};