PM2核心【重点记忆】
- 进程守护,系统崩溃自动重启
- 启动多进程,充分利用CPU和内存
- 自带日志记录功能
nodemon和PM2区别
- nodemon是在控制台前端监听的服务器启动,一旦使用就不能再在控制台输入其他命令,必须停止nodemon才能输入其他命令
- PM2是在控制台后台监听的服务器启动,所以使用PM2时还可以在控制台输入其他命令
下载安装
- 新建文件夹pm2-test,初始化环境,安装pm2:
npm i pm2 -g
- 查看pm2版本:
pm2 --version
基本使用
- package.json:
- app.js:
- 控制台:使用pm2我们可以继续操作控制台,使用nodemon则是在前台运行,控制台上不可做其他操作
常用命令
- 运行进程:
pm2 start ...
- 在上面的例子中,package.json中规定的prd命令中就使用了
pm2 start
...
:需要启动的 js文件名 或者 配置文件- “PM2常用配置”的例子中使用的就是
pm2 start 配置文件
- “PM2常用配置”的例子中使用的就是
- 在上面的例子中,package.json中规定的prd命令中就使用了
- 进程列表:
pm2 list
- 上面的例子:
- 重启进程:
pm2 restart <AppName>或<id>
- AppName和id都来源于进程列表
- 上面例子中则是:
pm2 restart app
/pm2 restart 0
- 停止进程:
pm2 stop <AppName>或<id>
- 停止以后还可重新启动
- 删除进程:
pm2 delete <AppName>或<id>
- 查看基本信息:
pm2 info <AppName>或<id>
- 查看进程日志:
pm2 log <AppName>或<id>
- 修改上方例子,添加自定义日志:
- 查看pm2处理结果:
- 没做配置的情况下,pm2将 通过
console.log
和console.error
自定义的日志 保存在这两个文件中,故之前提到自定义日志不需要手动保存于文件中。后面可通过配置改变报错的文件路径。
- 监控进程的cpu和内存信息:
pm2 monit <AppName>或<id>
- 可用于查看内存是否爆了或者cpu占的太满
- 例子:线上环境下想调试一些问题就可以在服务器上使用该命令
PM2进程守护
- 进程守护是保证服务器稳定性的重要手段
- 使用node app.js或nodemon appjs启动项目,进程崩溃则不能访问入
- 使用pm2启动项目,遇到进程奔溃会自动重启
- 出错的页面虽然出错,但pm2可以保证不出错的页面依旧可以访问,不至于一个地方崩溃就全部崩溃
例子
- 继续上面例子,模拟错误,使其崩溃:
- 先访问首页,正常显示
- 访问
/err
页面,显示错误 - 再访问首页,正常显示
- 但查看 进程列表 可以看到重启次数增加了3次(正常页面是不会重启的,次数不是关键,关键是能重启)
- 并且错误日志会被记录:
PM2常用配置和日志记录
- 新建PM2配置文件(包括进程数量,日志文件目录等)
- 修改PM2启动命令,重启
- 访问server,检查日志文件的内容(日志记录是否生效)
例子
- 接上面从“基本使用”开始的例子,新建logs文件夹-新建err.log用于存放错误日志(
console.err()
打印的)、out.log存放console.log()
打印的日志 - 新建pm2.conf.json,作为PM2的配置文件:
- 注意是json格式的
watch
:是否热更新,true为是。建议填false
- 修改package.json,使配置文件生效:
- 删除进程后重新启动进程,可看到配置文件已被运行:
- 查看基本信息,可看到日志保存路径成功改变:
- 多次访问网页,查看日志文件:可以看到配置文件中的时间戳被自动加载每条日志前面
PM2多进程
- 多进程能充分利用服务器的内存和cpu资源
- 多进程内存不共享,但可通过redis解决此问题
为何使用多进程
- 分成多个进程,这样其中一个进程崩了不至于全都崩了
- 回顾之前session相关知识点说过,操作系统限制一个进程的最大内存:
- 单进程无法充分利用机器全部内存
- 单进程无法充分利用多核CPU的优势
- 几核cpu就擅长同时处理几个进程
多进程内存不共享和redis
- 使用多进程可能会带来一些问题,比如多个进程之间内存无法共享
- 比如,多个进程之间的session无法共享:
- 解决方法:多进程访问一个redis,共享session:
例子
- 延续上面的例子,在配置文件中设置4核:
- 运行程序,可看到进程列表中出现了4个进程:
- 多次访问页面,可发现4个进程分别对应不同的日志文件:pm2自有一套计算规则,哪个进程更闲就将请求派发到哪个进程
关于服务器运维
- 服务器运维,一般都由专业的OP人员和部门来处理
- 大公司都有自己的运维团队
- 中小型工期推荐使用一些云服务,如阿里云的node平台