特点

  • 进程守护 - 稳定。进程崩溃,会自动重启。
  • 多进程 - 高效:可以依赖CPU的核数,一般有几核就创建多少个进程。
  • 日志记录 - 问题可追溯

    基本使用

  • pm2 start xxx.js

  • pm2 restart // 硬重启
  • pm2 reload // 重载:一个进程一个进程地重启,保证重启过程中有进程是可用的。
  • pm2 list
  • pm2 logs
  • pm2 stop
  • pm2 delete
  • pm2 monit // 监控 可以查看内存使用量

    配置

    ```javascript /**
    • @description pm2 app 配置信息 */

const os = require(‘os’)

const cpuCoreLength = os.cpus().length // CPU 几核

module.exports = { apps: [ name: ‘your-server-name’, script: ‘bin/www’, // 重要!!app的启动脚本 // watch: true, // 无特殊情况,不用实时监听文件,否则可能会导致很多restart ignorewatch: [‘nodemodules’, ‘__test‘, ‘logs’], // instances: cpuCoreLength, // 线上环境,多进程 instances: 1, // 测试环境,一个进程即可 error_file: ‘./logs/err.log’, out_file: ‘./logs/out.log’, log_date_format: ‘YYYY-MM-DD HH:mm:ss Z’, // Z 表示使用当前时区的时间格式 combine_logs: true, // 多个实例,合并日志 max_memory_restart: ‘300M’, // 内存占用超过 300M ,则重启 //内存泄漏,当Bug难以排查的时候,设置这个字段,超过就重启。 ] }

  1. <a name="foCpT"></a>
  2. ## 代码修改
  3. - 安装 `npm i pm2 -g`
  4. - pm2 配置, 在 `bin/` 目录下
  5. - 修改 package.json `scripts` (临时修改 `NODE_ENV=dev` 然后运行)
  6. ```javascript
  7. "prd-dev": "cross-env NODE_ENV=dev pm2 start bin/pm2-prd-dev.config.js",

会把服务启动起来:
截屏2022-09-27 20.47.41.png
访问可用看到有日志输出
截屏2022-09-27 20.49.24.png

日志拆分

线上的pm2日志量一般很大,不拆分的话,排查问题的时候,日志会大到打不开。所以一般会按照天、小时或者分钟把日志进行拆分。

  • 使用 pm2-logrotate,这是一个pm2插件。
  • 安装 pm2 install pm2-logrotate,运行 pm2 list 即可看到 pm2-logrotate 的进程
    1. #默认配置如下∶
    2. $ pm2 set pm2-logrotate:max_size 10M # 日志文件最大10M
    3. $ pm2 set pm2-logrotate:retain 30 # 保留 30 个文件,多了就自动删掉
    4. $ pm2 set pm2-logrotate:compress false # gzip压缩文件
    5. $ pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
    6. $ pm2 set pm2-logrotate:workerInterval 30 # 单位 s ,日志检查的时间间隔
    7. $ pm2 set pm2-logrotate:rotateInterval 0 0 * * * # 定时规则:每天的00分去拆分日志。
    8. $ pm2 set pm2-logrotate:rotateModule true # 分割 pm2 模块的日志
    拓展:crontab定时规则:一般有六位,如果有五位,则省略最前面一位。
    image.png
    修改配置
    1. # 可修改配置pm2 set pm2-logrotate:<key> <value>