博客项目上线及配置

PM2核心【重点记忆】

  • 进程守护,系统崩溃自动重启
  • 启动多进程,充分利用CPU和内存
  • 自带日志记录功能

nodemon和PM2区别

  • nodemon是在控制台前端监听的服务器启动,一旦使用就不能再在控制台输入其他命令,必须停止nodemon才能输入其他命令
  • PM2是在控制台后台监听的服务器启动,所以使用PM2时还可以在控制台输入其他命令

下载安装

  1. 新建文件夹pm2-test,初始化环境,安装pm2:npm i pm2 -g
  2. 查看pm2版本:pm2 --version

基本使用

  1. package.json:package.json
  2. app.js:app.js
  3. 控制台:控制台使用pm2我们可以继续操作控制台,使用nodemon则是在前台运行,控制台上不可做其他操作

常用命令

  1. 运行进程:pm2 start ...
    • 在上面的例子中,package.json中规定的prd命令中就使用了pm2 start
    • ...:需要启动的 js文件名 或者 配置文件
      • “PM2常用配置”的例子中使用的就是pm2 start 配置文件
  2. 进程列表:pm2 list
    • 上面的例子:上面的例子
  3. 重启进程:pm2 restart <AppName>或<id>
    • AppName和id都来源于进程列表
    • 上面例子中则是:pm2 restart app/pm2 restart 0
  4. 停止进程:pm2 stop <AppName>或<id>
    • 停止以后还可重新启动
  5. 删除进程:pm2 delete <AppName>或<id>
  6. 查看基本信息:pm2 info <AppName>或<id>
  7. 查看进程日志:pm2 log <AppName>或<id>
    1. 修改上方例子,添加自定义日志添加自定义日志
    2. 查看pm2处理结果pm2处理结果
    3. 没做配置的情况下,pm2将 通过console.logconsole.error自定义的日志 保存在这两个文件中,故之前提到自定义日志不需要手动保存于文件中。后面可通过配置改变报错的文件路径
  8. 监控进程的cpu和内存信息:pm2 monit <AppName>或<id>
    • 可用于查看内存是否爆了或者cpu占的太满
    • 例子:例子线上环境下想调试一些问题就可以在服务器上使用该命令

PM2进程守护

  • 进程守护保证服务器稳定性的重要手段
    • 使用node app.js或nodemon appjs启动项目,进程崩溃则不能访问入
    • 使用pm2启动项目,遇到进程奔溃会自动重启
      • 出错的页面虽然出错,但pm2可以保证不出错的页面依旧可以访问,不至于一个地方崩溃就全部崩溃

例子

  • 继续上面例子,模拟错误,使其崩溃:例子
    1. 先访问首页,正常显示
    2. 访问/err页面,显示错误
    3. 再访问首页,正常显示
    4. 但查看 进程列表 可以看到重启次数增加了3次(正常页面是不会重启的,次数不是关键,关键是能重启)
    5. 并且错误日志会被记录:错误日志

PM2常用配置和日志记录

  • 新建PM2配置文件(包括进程数量,日志文件目录等)
  • 修改PM2启动命令,重启
  • 访问server,检查日志文件的内容(日志记录是否生效)

例子

  1. 接上面从“基本使用”开始的例子,新建logs文件夹-新建err.log用于存放错误日志(console.err()打印的)、out.log存放console.log()打印的日志
  2. 新建pm2.conf.json,作为PM2的配置文件pm2.conf.json
    • 注意是json格式
    • watch:是否热更新,true为是。建议填false
  3. 修改package.json,使配置文件生效:修改package.json
  4. 删除进程后重新启动进程,可看到配置文件已被运行控制台
  5. 查看基本信息,可看到日志保存路径成功改变:查看基本信息
  6. 多次访问网页,查看日志文件日志文件可以看到配置文件中的时间戳被自动加载每条日志前面

PM2多进程

  • 多进程能充分利用服务器的内存和cpu资源
  • 多进程内存不共享,但可通过redis解决此问题

为何使用多进程

  • 分成多个进程,这样其中一个进程崩了不至于全都崩了
  • 回顾之前session相关知识点说过,操作系统限制一个进程的最大内存单个进程的内存是受限的
    • 单进程无法充分利用机器全部内存
    • 单进程无法充分利用多核CPU的优势
      • 几核cpu就擅长同时处理几个进程

多进程内存不共享和redis

  • 使用多进程可能会带来一些问题,比如多个进程之间内存无法共享
    • 比如,多个进程之间的session无法共享session
    • 解决方法:多进程访问一个redis,共享session解决方法

例子

  1. 延续上面的例子,在配置文件中设置4核配置文件
  2. 运行程序,可看到进程列表中出现了4个进程进程列表
  3. 多次访问页面,可发现4个进程分别对应不同的日志文件日志文件pm2自有一套计算规则,哪个进程更闲就将请求派发到哪个进程

关于服务器运维

  • 服务器运维,一般都由专业的OP人员和部门来处理
  • 大公司都有自己的运维团队
  • 中小型工期推荐使用一些云服务,如阿里云的node平台