PM2简易使用手册

PM2 使用手册

很简单也很水,就是我今天由于公司项目正好在研究这个东西,权当本身记录了,不喜勿喷~~~万分感谢前端

背景

对于线上项目,若是直接经过 node app 来启动,若是报错了可能直接中止致使整个服务崩溃,通常监控 node 有几种方案。node

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

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

PM2 的主要特性

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

安装

// 全局安装pm2,依赖node和npm
npm install -g pm2
复制代码

用法

  • 基本启动命令

pm2 startgithub

// start命令启动对应的node server文件
$ pm2 start ./build/server.js
复制代码
  • 经过配置文件进行启动稍后详细讲解

启动以后,控制台会看到以下消息:web

如上图所示,能够看到项目kafazhe成功启动,id 是 0,而且状态时 online.npm

  • 查看详细状态信息

pm2 show (appname|id)json

$ pm2 show kaifazhe
复制代码

如上图所示,能够查看到 kaifazhe 进程的详细信息浏览器

  • 查看全部启动的进程列表

pm2 listbash

$ pm2 list
复制代码

  • 监控每一个 node 进程的 cpu 和内存使用状况

    pm2 monitapp

$ pm2 monit
复制代码

可使用 pm2 monit 功能监控全部 node 进程的运行状况,包括各类响应,错误信息。

  • 显示全部进程的日志信息

pm2 logs

$ pm2 logs
复制代码

  • 监控运行这些进程的机器的状态

pm2 web

$ pm2 web
复制代码

我只能说,这也太 NB 了吧,不只能够监控这些进程,还能监控运行这些进程的机器的状态,逆天了。而后它会自动起一个服务在指定端口,如图在 9615 启动了一个服务,咱们能够访问。虽然我看不太懂,可是对于测试运维同窗来讲,应该挺有用的吧。

  • 中止 指定/全部 进程

pm2 stop (id|all)

// 中止id为0的进程
$ pm2 stop 0
// 中止全部进程
$ pm2 stop all
复制代码

如图,咱们运行了两个服务状态都是 online,使用 stop 0 以后,kaifazhe 的服务变成了 stopped,而后使用 stop all,全部进程状态全变成了 stopped。

  • 重启 指定/全部 进程

pm2 restart (id|all)

// 重启id为0的进程
$ pm2 restart 0
// 重启全部进程
$ pm2 restart all
复制代码
  • 杀死 指定/全部 进程

pm2 delete (id|all)

// 杀死id为0的进程
$ pm2 delete 0
// 杀死全部进程
$ pm2 delete all
复制代码

从上图咱们能够看出,restart 0 以后,0 进程从 stopped 状态变成了 online,而后咱们使用 delete 0,进程 0 就消失不见了,咱们再 delete all,能够看到如今没有任何进程在运行。

配置 PM2 启动文件

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

pm2.config.js

// 名称任意,按照我的习惯来
module.exports = {
  apps: [
    {
      name: 'kaifazhe', // 应用名称
      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.yoduao.com'
      },
      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.youdao.com

负载均衡

最 666 的功能来了~自动给你作负载均衡,只须要一条命令,之前那些复杂的概念懂不懂无所谓。

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,  // 启动两个实例
复制代码

日志相关

这里是时隔一年后补充的,当初只是为了简单写写总结,不过没想到这么多人点赞喜欢了,那么一年以后随着使用加深,对于pm2有个其余的总结,就补充一下~

pm2日志

上面配置文件能够看出来,咱们能够配置logs,包括普通的out和错误的error日志。其实也不须要咱们作什么,咱们只须要在config里面配置好就行,他就会自动往里面写日志:

很简单的功能,就包含了日志,真是美妙到不行,可是,真的那么美妙吗?哈哈,好像不是?咱们的日志所有输出到了err.logout.log内,日积月累,OMG不敢想象,排查问题确定很费劲,因此就有了下面的日志分割~

日志分割

咱们正常意义上的日志,以node为例,应该都是使用的log4js来进行按日期写入的,那么pm2可不能够按日期写入呢?答案确定是:能够。

pm2为咱们提供了插件系统,而日期分割功能就正好用到了插件系统:pm2-logrotate

安装:

pm2 install pm2-logrotate // 看好了,是pm2 install而不是npm install
复制代码

你装完以后它就自动启动,而后你还能够配置各类参数

而后就完成了日志按日期分割~

细心的小伙伴可能发现了,你上面让我安装的是pm2-logrotate,为啥你安装的是pm2-logrotate-ext,嗯,由于听说官方的pm2-logrotate存在一个bug,就是日期会正常分割,可是若是你前一天的文件没有写满好比你设置了1M但只写了500K那么次日的日志仍是会插入到原来的out.log(err.log),因此大牛就写了这个解决了这个问题pm2-logrotate-ext

配合pm2-web实现监控可视化

可能不少人不喜欢控制台,喜欢把监控数据进行可视化更方便查看和分析。没关系,高手们已经为咱们提供了工具,pm2-web,一看就是专门配合pm2来使用的。

安装

npm install -g pm2-web
复制代码

使用

默认pm2-web会自动启动一个端口8080,可是咱们仍是喜欢可控状态的,所以按照配置文件的方式启动。

$ pm2-web --config pm2-web-config.json
复制代码
// pm2-web-config.json
{
  "www": {
      "host": "localhost",
      "address": "0.0.0.0",
      "port": 6688
  }                         
}
复制代码

这样你就能够在浏览器查看可视化的监控状态了~

说明一下,图片是我从网上找的,为何没在本地启动呢,缘由是pm2-web依赖node-inspector,而node-inspector对于高版本node没法安装,不少人提了issue,可是感受开发者也处于放弃了的状态。我也不打算在本地安装低版本node,因此感兴趣的你们能够安装个低版本的试试~

谢谢~~~

相关文章
相关标签/搜索