PM2是一个非常强大的命令行工具,可以帮助用户在服务器上运行各种任务,管理系统资源,监控系统性能等。

PM2支持记录系统的各种信息,例如,任务执行情况、进程信息、错误信息等。用户可以在配置文件中设置不同的日志等级,以及记录的时间间隔和方式。

我们一般运行node程序的时候会直接用node执行例如node ./app.js,但是这样有个不好的点在于程序崩溃时我们需要再次手动启动程序(当然开发环境是无所谓的),而且如果需要负载均衡的话还需要我们在代码层面进行适配。但是这些问题在pm2面前根部就不是问题,pm2可以监控进程,当程序崩溃时自动重启,并且在不侵入代码的情况下进行负载均衡。

说了这么个多pm2的好处,下面就来正式进入学习,第一步首先需要安装工具,最简单的pm2安装方式是使用npm来全局安装(或者可以去官网下载安装)

$ npm install pm2 -g

应用启停

关于应用启停的命令如下

$ pm2 start [<name>|filepath [--name <name>]]
$ pm2 stop <name>
$ pm2 restart <name>

在启动时需要给的参数可以时文件路径,也可以是已经存在的应用名称,关于应用名称可以使用默认命名(文件名),也可以使用主动命名,即通过参数的形式传入。

image-20230520174632013

进程管理

在应用管理方面相关的命令有以下几个

应用列表,列出应用列表的命令有多个,他们实现的功能是完全一致的

$ pm2 ps
$ pm2 l
$ pm2 ls|list

image-20230520181548649

另外还有jlist命令可以将应用列表输出为json形式

image-20230520182203161

这里我使用了jq工具来提取格式化返回值,原始值非常长就不展示了。

删除应用,删除也是管理所必需的功能,当某个应用过时之后我们需要把它删掉。

$ pm2 delete|del <name>

删除命令执行完成之后还会自动执行以下list命令,用于展示删除应用后的列表状态。

image-20230520182943862

查看详情,列表展示的数据是有限的,当我们需要看完整的应用信息是,需要使用show命令

$ pm2 show <name>

image-20230520185347568

负载均衡

基于pm2实现负载均衡非常之简单,其底层依赖NodeJS的cluster模块,虽然听起来高大上,但是我们在使用的时候是很简单的。

$ pm2 start ./app.js -i <number>

image-20230520200538187

(启动失败是因为我的脚本是一个http-server,都监听了同一个端口,没有进行适配)

理论上负载均衡的最大值是我们CPU的核心数量,工具也提供了max变量,直接将命令中的集群数量替换为max即可。

如果想要调整负载均衡的集群数量可以进行如下操作

$ pm2 scale <name> <number>

image-20230520200843036

日志管理

pm2会讲控制台的所有输出全部记录下来,方便我们查看

$ pm2 logs <name|pid>

image-20230520202945990

pm2 logs会把每一个进程的日志都显示出来,或者也可以指定某个某个应用的日志。

此外pm2还支持插件系统,可以使用插件来进行日志分割,防止一个日志文件过大导致查询不方便的情况。使用命令安装分割插件(注意不是npm install)

pm2 install pm2-logrotate-ext

image-20230520235249922

(如果需要卸载,使用uninstall命令)安装完成之后就会自动运行,如果想看一下module的详情,可以使用命令进行查询

$ pm2 describe pm2-logrotate-ext

image-20230520235505714

性能监控

当需要同时查看多个应用的详情时,以及监控各个应用的性能时,控制台是一个不错的方法,打开控制台的命令有下面两条

$ pm2 dashboard|dash
$ pm2 monit

image-20230520185809199

这控制台中展示了应用的运行消耗资源,运行日志,应用信息等数据,可以方便我们快速的了解应用的状态。

配置文件

可以使用pm2 init命令来生成一份初始化的配置文件,我们可以基于这个文件进行自定义配置。

常用的配置文件描述如下

// 名称任意,按照个人习惯来
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',
    },
  ],
};

OK,现在你已经掌握了pm2的日常使用技巧,你可能会有疑问,现在流行的k8s方式部署也能轻松实现负载均衡等功能,而且容器化部署可以抹平机器之间的环境差异,为什么还需要pm2呢?

个人看来他们并不是竞品关系,基于k8s的负载均衡是实例的资源扩缩,而pm2的负载均衡是为了CPU资源利用的最大化。


前端小白