pm2 实践指南

前言

pm2 是 node 进程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,因为在工作中遇到服务器重启后,需要一个个去重新启动每个服务,这样不仅繁琐、效率低,而且容易遗忘开启一些服务,所以特地对 pm2 进行一次比较全面的学习+实践,在解决工作问题的同时,进行一次较完整的学习实践总结,现分享给大家。

博客 github地址为:github.com/fengshi123/…,汇总了作者的所有博客,也欢迎关注及 star ~

一、安装 & 目录

1、运行以下命令进行全局安装

$ npm install -g pm2

2、安装完之后,会自动创建以下目录:

$HOME/.pm2/logs // 包括所有应用的日志
$HOME/.pm2/pids // 包括所有应用的 pids
$HOME/.pm2/dump.pm2 // 开机自启动配置
$HOME/.pm2/pm2.log // pm2 日志
$HOME/.pm2/pm2.pid // pm2 pid

二、常用命令

1、启动命令

$ pm2 start app.js

启动成功后,我们对应可以看到启动的服务的一些信息,如下所示:

2、命令行参数

我们可以在最基本的启动命令后面,添加一些参数选项,去满足我们的需求,常用的参数选项如下所示:

  • --watch:监听应用目录的变化,一旦发生变化,自动重启。
  • -i or --instance:启用多少个实例,可用于负载均衡,如果 -i 0 或者 -i max,则根据当前机器核数确定实例数目。
  • --ignore-watch:排除监听的目录或文件,可以是特定的文件名,也可以是正则。
  • -n or --name:应用的名称,查看应用信息的时候可以用到。
  • -o or --output path:标准输出日志文件的路径。
  • -e or --error path:错误输出日志文件的路径。

我们在启动命令后面加入以上的一些参数,完整的启动命令如下所示:

$ pm2 start app.js --watch -i max -n first_app

启动成功后的截图如下,我们通过截图可以看到启动的应用名称变为 first_app,然后启动四个进程,说明我们在启动命令后面添加的参数已经起作用。

3、重启命令

$ pm2 restart app.js

4、停止命令

停止特定的应用,可以通过 pm2 list 先获取应用的名字或者进程的 id,然后再调用以下命令停止相应的应用;

$ pm2 stop app_name | app_id

如果需要停止全部的应用,则使用以下命令:

$ pm2 stop all

5、删除命令

删除特定的应用,可以通过 pm2 list 先获取应用的名字或者进程的 id,然后再调用以下命令删除相应的应用;

$ pm2 delete app_name | app_id

如果需要删除全部的应用,则使用以下命令:

$ pm2 delete all

6、查看有哪些进程

$ pm2 list

7、查看某个进程的信息

$ pm2 descripe app_name | app_id

相应的进程信息输出如下所示:

三、配置文件

如果我们使用命令行参数定义一些选项,那么每次启动进程时,都需要敲上一大堆的命令,非常繁琐;所以我们可以使用配置文件来将命令行参数进行配置,配置文件里的配置项跟命令行参数是基本一致的;如下所示,我们在 express_project 项目中添加 pm2 的配置文件 pm2.json ,然后在 package.json 文件中配置启动命令 "pm2": "pm2 start pm2.json" ,这样我们只需要运行 npm run pm2 就可以使用 pm2 启动我们的 express 项目,并且相关运行参数直接在 pm2.json 中配置好了。相关配置项表示的意义在下面文件中都已经注释说明,就不在一一解释了。

{
    "apps": {
        "name": "express_project",       // 项目名          
        "script": "app.js",              // 执行文件
        "cwd": "./",                     // 根目录
        "args": "",                      // 传递给脚本的参数
        "interpreter": "",               // 指定的脚本解释器
        "interpreter_args": "",          // 传递给解释器的参数
        "watch": true,                   // 是否监听文件变动然后重启
        "ignore_watch": [                // 不用监听的文件
            "node_modules",
            "public"
        ],
        "exec_mode": "cluster_mode",     // 应用启动模式,支持 fork 和 cluster 模式
        "instances": "max",              // 应用启动实例个数,仅在 cluster 模式有效 默认为 fork
        "error_file": "./logs/app-err.log",         // 错误日志文件
        "out_file": "./logs/app-out.log",           // 正常日志文件
        "merge_logs": true,                         // 设置追加日志而不是新建日志
        "log_date_format": "YYYY-MM-DD HH:mm:ss",   // 指定日志文件的时间格式
        "min_uptime": "60s",                        // 应用运行少于时间被认为是异常启动
        "max_restarts": 30,                         // 最大异常重启次数
        "autorestart": true,                        // 默认为 true, 发生异常的情况下自动重启
        "restart_delay": "60"                       // 异常重启情况下,延时重启时间
        "env": {
           "NODE_ENV": "production",                // 环境参数,当前指定为生产环境
           "REMOTE_ADDR": ""               
        },
        "env_dev": {
            "NODE_ENV": "development",              // 环境参数,当前指定为开发环境
            "REMOTE_ADDR": ""
        },
        "env_test": {                               // 环境参数,当前指定为测试环境
            "NODE_ENV": "test",
            "REMOTE_ADDR": ""
        }
    }
}

四、高阶应用

1、负载均衡

可以使用 -i 参数配置集群数,实现负载均衡,相关命令如下,可以查看 官网章节

$ pm2 start app.js -i 3 // 开启三个进程
$ pm2 start app.js -i max // 根据机器CPU核数,开启对应数目的进程 

2、日志查看

我们可以通过打开日志文件查看日志外,还可以通过 pm2 logs 来查看实时日志,这点有对于线上问题排查;日志查看命令如下:

$ pm2 logs

则我们可以在命令窗口实时看到日志输出:

3、监控

我们可以使用以下命令,查看当前通过 pm2 运行的进程的状态;

$ pm2 monit

动态监控界面如下所示:

4、内存超过使用上限自动重启

我们可以使用 --max-memory-restart 参数来限制内存使用上限,当超过使用内存上限后自动重启;

$ pm2 start app.js --max-memory-restart 100M

5、开机自启动

在 linux 中,设置开机自启动,只需要执行以下两个步骤:

  • 运行 pm2 startup,即在/etc/init.d/ 目录下生成 pm2-root 的启动脚本,且自动将 pm2-root 设为服务;
  • 运行 pm2 save,会将当前 pm2 所运行的应用保存在 /root/.pm2/dump.pm2 下,当开机重启时,运行pm2-root 服务脚本,并且到 /root/.pm2/dump.pm2 下读取应用并启动;

但在 windows 中运行 pm2 startup 时,会报以下错误,因为其不适合 windows 系统;

我们需要额外安装其它库,如下所示:

$ npm install pm2-windows-startup -g
$ pm2-startup install

然后我们只需要运行以下保存命令,就可以将现在正在运行的服务添加到开机自启动命令中;后面即使服务器开机重启,也会将我们保存的服务自动重启;

$ pm2 save

五、总结

本文讲述了 pm2 安装、pm2 基本常用命令、pm2 配置文件、以及 pm2 的高阶应用,通过本文的阅读,基本能够使用 pm2 来管理你的 node 应用,至于一些不常用的特性,可以访问 pm2 官网;并且通过本文的实践,作者还优化了之前开源的 express 项目的 pm2 管理,对应的博客文章《一个开箱即用,功能完善的 Express 项目》,希望对你有帮助。

博客 github地址为:github.com/fengshi123/…,汇总了作者的所有博客,也欢迎关注及 star ~

参考文献:

www.cnblogs.com/chyingp/p/p…

pm2.keymetrics.io/docs/usage/…

原文链接:juejin.im

上一篇:@babel/plugin-proposal-do-expressions
下一篇:所见即所得, 通过拖拽实现一个自定义布局

相关推荐

  • 高性能javascript--编程实践

    setTimeout()和settimeInterval()传递函数而不是字符串作为参数 引申: 用setTimeout()方法来模拟setInterval()与setInterval()之间的...

    9 个月前
  • 高德前端这五年:动态化技术的研发历程和全面落地实践

    前言 2015年2020年,历经5年发展,高德地图应用开发前端团队在业务快速发展中不断成长。一路走来,从小团队主要负责短期运营活动开发的散兵游勇,到现在团队规模100人,覆盖高德5大业务线,上百个模...

    3 个月前
  • 高德APP启动耗时剖析与优化实践(iOS篇)

    前言最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内。就像产品们用后说的,快到不习惯。

    4 个月前
  • 马蜂窝容器化平台前端赋能实践

    容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。

    1 年前
  • 首页白屏优化实践

    前言 自从前端三大框架React、Vue、Angular面世以来,前端开发逐渐趋向规范化、统一化,大多数时候新建前端项目,首先想到使用的技术一定是三大框架之一,框架给前端开发带来了极大的便利和规范...

    1 年前
  • 首发 | 闲鱼公开多年 Flutter 实践经验

    (https://img.javascriptcn.com/7f312df423086aca9f69ec144384ad5f) 阿里妹导读:Flutter从诞生到现在,已经成为了跨端开发的领跑者。

    10 个月前
  • 飞猪找一找,端侧 AI 的实践和展望

    本文介绍飞猪互动双十一彩蛋“飞猪找一找”, 一个基于 AI 图像识别的纯客户端游戏 (/public/upload/d1c681661c07508083ea69abbe26841c) 以这个游...

    3 个月前
  • 飞冰 - ICE Design Pro 使用指南

    写在前面: 目前在飞冰中,我们提供了 21 套模板(后续会持续的增加),可以在 Iceworks 的模板界面根据需求选择合适的模板进行初始化项目,然后基于区块快速搭建页面进行二次开发,减少各种环境...

    2 年前
  • 项目中资源缓存机制实践(静态资源和本地数据缓存)

    网络资源的缓存 核心方案 1. HTML文件 nocache 2. js,css文件 时间戳/哈希/版本号,长缓存 3. 图片资源 长缓存,更新时使用新链接地址 1. 前后端...

    1 年前
  • 顶级测试框架Jest指南:跑通一个完美的程序,就是教出一群像样的学生

    facebook三大项目:yarn jest metro,有横扫宇宙之势。 这个项目的宗旨为:减少测试一个项目所花费的时间成本和认知成本。 ——其实,它在让你当一个好老师。

    2 年前

官方社区

扫码加入 JavaScript 社区