PM2入门

PM2使用背景

对于线上项目,如果直接通过 node app 来启动,如果报错了可能直接停止导致整个服务崩溃,一般监控 node 有几种方案。

  • supervisor: 一般用作开发环境的使用。
  • forever: 管理多个站点,一般每个站点的访问量不大的情况,不需要监控。
  • PM2: 网站的访问量比较大,需要完整的监控页面。

公司原来的项目采用的是 forever 的形式,不过如果 node 出现问题的时候,没有办法获取到有效的监控数据进行错误排查,因此新开发的系统准备采用 pm2 的形式进行前端以及 node 层的监控。

PM2主要特性

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口 API ( Nodejs 模块,允许和 PM2 进程管理器交互 )

安装

// 全局安装pm2,依赖node和npm
$ npm install -g pm2

用法

(1)基本启动命令:pm2 start

// start命令启动对应的node server文件
$ pm2 start ./build/server.js

npm脚本:

$ npm run pm2

(2)查看详细状态信息:pm2 show (appname|id)

$ pm2 show appblog-cn

(3)查看所有启动的进程列表:pm2 list

$ pm2 list

┌────────────┬────┬─────────┬─────────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name   │ id │ version │ mode    │ pid   │ status  │ restart │ uptime │ cpu │ mem       │ user  │ watching │
├────────────┼────┼─────────┼─────────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ appblog-cn │ 0  │ 1.0.0   │ cluster │ 25288 │ online  │ 7       │ 0      │ 0%  │ 0 B       │ nginx │ disabled │
│ appblog-cn │ 1  │ 1.0.0   │ cluster │ 25299 │ online  │ 7       │ 48s    │ 0%  │ 54.5 MB   │ nginx │ disabled │
│ appblog-cn │ 2  │ 1.0.0   │ cluster │ 25317 │ online  │ 7       │ 48s    │ 0%  │ 55.3 MB   │ nginx │ disabled │
│ appblog-cn │ 3  │ 1.0.0   │ cluster │ 0     │ stopped │ 7       │ 48s    │ 0%  │ 54.7 MB   │ nginx │ disabled │
└────────────┴────┴─────────┴─────────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘

(4)监控每个 node 进程的 cpu 和内存使用情况:pm2 monit

$ pm2 monit

可以使用 pm2 monit 功能监控所有 node 进程的运行情况,包括各种响应,错误信息。

(5)显示所有进程的日志信息:pm2 logs

$ pm2 logs

(6)监控运行这些进程的机器的状态:pm2 web

$ pm2 web

(7)停止 指定/所有 进程:pm2 stop (id|all)

// 停止id为0的进程
$ pm2 stop 0
// 停止所有进程
$ pm2 stop all

服务状态是 online,使用 stop 之后,服务状态变成 stopped

(8)重启 指定/所有 进程:pm2 restart (id|all)

// 重启id为0的进程
$ pm2 restart 0
// 重启所有进程
$ pm2 restart all

(9)杀死 指定/所有 进程:pm2 delete (id|all)

// 杀死id为0的进程
$ pm2 delete 0
// 杀死所有进程
$ pm2 delete all

服务状态是 online,使用 delete 之后,进程消失

配置 PM2 启动文件

pm2 启动的方式可以进行很多的扩展,比如设置环境,设置错误信息打印,设置输入信息打印等等高级功能。那么一条命令就不能完成这些任务,所以 pm2 提供了配置文件的方式来启动~

pm2.config.js

// 名称任意,按照个人习惯来
module.exports = {
  apps: [
    {
      name: 'appblog', // 应用名称
      script: './build/server.js', // 启动文件地址
      cwd: './', // 当前工作路径
      watch: [
        // 监控变化的目录,一旦变化,自动重启
        'src',
        'build',
      ],
      ignore_watch: [
        // 忽视这些目录的变化
        'node_modules',
        'logs',
        'public',
      ],
      node_args: '--harmony', // node的启动模式
      env: {
        NODE_ENV: 'development', // 设置运行环境,此时process.env.NODE_ENV的值就是development
        ORIGIN_ADDR: 'http://www.appblog.cn'
      },
      env_production: {
        NODE_ENV: 'production',
      },
      out_file: './logs/out.log', // 普通日志路径
      error_file: './logs/err.log', // 错误日志路径
      merge_logs: true,
      log_date_format: 'YYYY-MM-DD HH:mm Z',
    },
  ],
};

对于上面的 env,我们可以在内部添加很多个参数变量,这样我们所使用的 process.env.XXX 就会对应发生变化,例如上面,我们process.env.ORIGIN_ADDR的值就是http://www.appblog.cn

负载均衡

自动负载均衡,只需要一条命令,以前那些复杂的概念懂不懂无所谓。

pm2 start server.js -i (number|max)
# 开启三个进程运行项目
pm2 start app.js -i 3
# 根据机器CPU核数,开启对应数目的进程运行项目
pm2 start app.js -i max

配置文件里对应的:"instance": (number|max)

// pm2.config.js
"instances": 2,  // 启动两个实例

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/pm2-introduction/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
PM2入门
PM2使用背景 对于线上项目,如果直接通过 node app 来启动,如果报错了可能直接停止导致整个服务崩溃,一般监控 node 有几种方案。 supervisor: 一般用作开……
<<上一篇
下一篇>>
文章目录
关闭
目 录