为什么学习 Node.js 必须了解 PM2?

发表时间: 2023-11-24 06:20

家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

高级前端‬进阶

今天给大家带来的主题是PM2,即一个内置负载均衡器的 Node.js 进程管理。话不多说,直接进入正题!

1.什么是进程管理

进程管理是指围绕进程的创建、终止和监控的各种活动,是在程序之上抽象出了进程的概念,然后通过进程状态、上下文切换、中断、调度等等手段,最终实现使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述。

而进程管理器是一种程序,可确保应用程序在启动后始终保持在线状态。进程管理员可以通过在崩溃后、甚至主机重启后自动重启应用程序来防止生产停机。

进程管理在开发中也很有用:一旦源文件或依赖项更新,它们就会自动重启应用程序。 进程管理器通常还提供监控工具,用于访问应用程序日志和其他关键指标,例如 :CPU 和内存使用情况。

2.什么是 PM2

PM2 是一个带有内置负载均衡器(分摊到多个操作单元上执行)的 Node.js 进程管理器(process manager), 也是目前最流行的 Node.js 进程管理器。它有助于促进生产部署,并能够无限期地保持运行应用程序(即使发生事故)。

PM2 还可以让开发者深入了解应用程序的运行时性能和资源消耗,并通过其集群功能实时扩展应用程序,从而轻松实现常见的系统管理任务。

在生产模式下通过 PM2 启动应用程序非常简单:

pm2 start app.js

目前 PM2 适用于 Linux(稳定)和 macOS(稳定)和 Windows(稳定)等不同的平台环境,支持从 Node.js 12.X 开始的所有 Node.js 版本。

目前 PM2 通过 AGPL 3.0 协议(对企业应用不友好,比如 Egg)在 Github 开源,有超过 39.2k 的 star、2.5k 的 fork、88.8k 的项目依赖量,代码贡献者 270+,是妥妥的前端明星开源项目

3.使用 PM2

安装使用 PM2

可以通过 npm 快速安装 pm2:

npm install pm2 -g

安装 pm2 后就可以通过如下命令快速启动任何应用程序(Node.js、Python、Ruby、$PATH 中的二进制文件):

pm2 start app.js

此时应用程序将被守护进程、监控并永远保持活动状态。

管理应用程序

PM2 是一个守护进程管理器,帮助开发者管理和保持应用程序在线。使用 PM2 也非常简单,它以简单直观的 C​LI 形式提供,通过 NPM 安装后就可以基于它启动应用程序,从而轻松管理:

下面命令将列出所有正在运行的应用程序:

pm2 list

管理进程更加方便:

pm2 stop     <app_name|namespace|id|'all'|json_conf>pm2 restart  <app_name|namespace|id|'all'|json_conf>pm2 delete   <app_name|namespace|id|'all'|json_conf>

要获得有关特定应用程序的更多详细信息,可以运行下面的命令:

pm2 describe <id|app_name>

运行下面的命令可以监控日志、自定义指标、应用程序信息:

pm2 monit

集群模式:Node.js 负载均衡和零停机重新加载

集群模式是启动 Node.js 应用程序时的一种特殊模式,它启动多个进程并在它们之间负载平衡 HTTP/TCP/UDP 查询,从而提高应用整体性能(在 16 核机器上提高了 10 倍)和可靠性(在出现未处理错误的情况下更快地重新平衡套接字)。

在集群模式下启动一个 Node.js 应用程序,它将利用所有可用的 CPU:

pm2 start api.js -i <processes>

<processes> 可以是 'max'、-1(所有 cpu 减 1)或要启动的指定实例数。零停机重新加载 Hot Reload 允许在不停机的情况下更新应用程序:

pm2 reload all

容器支持

如果应用程序是在容器环境中运行则可以使用 pm2-runtime,它是在生产环境中充分利用 Node.js 的完美伴侣。pm2-runtime 的目标是将开发者的应用程序包装到适当的 Node.js 生产环境中。 它解决了在容器内运行 Node.js 应用程序时遇到的主要问题,例如:

  • 高应用程序可靠性的第二个进程回退(Second Process Fallback )
  • 流程控制
  • 自动应用程序监控,使其始终保持活跃和高性能
  • 自动 Source Map 发现和解析支持

更进一步,使用 PM2 作为容器和应用程序中间层带来了 PM2 强大的功能,如:应用程序声明文件、可定制的日志系统和其他强大的功能来管理在生产环境中的 Node.js 应用程序。

比如下面使用 pm2-runtime 命令来替换 node 命令,在强化的生产环境中运行 Node.js 应用程序。

RUN npm install pm2 -gCMD [ "pm2-runtime", "npm", "--", "start" ]

主机监控速度条

PM2 允许使用监控速度栏监控主机、服务器生命状态。 可以通过下面的命令启用主机监控:

pm2 set pm2:sysmonit truepm2 update

基于终端的监控

PM2 为开发者提供了一种监视应用程序资源使用情况的简单方法,开发者可以直接从终端轻松监控内存和 CPU。比如下面代码可以监控直接从命令行启动的所有进程:

pm2 monit

同时,PM2 允许根据内存限制重新加载(自动回退以重新启动)应用程序。 请注意,PM2 内部工作程序(检查内存和相关)每 30 秒启动一次,因此开发者可能需要稍等片刻才能在达到内存阈值后自动重新启动进程。

PM2+监测

如果开发者使用 PM2 管理应用程序,PM2+ 可以轻松地跨服务器监控和管理应用程序。

4.本文总结

本文主要和大家谈谈 PM2,即一个内置负载均衡器的 Node.js 进程管理器。相信通过本文的阅读,大家对 PM2 会有一个初步的了解。

因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

参考资料

https://github.com/Unitech/pm2/tree/311c53298448fc4575fc689c4943692a664373ad

https://pm2.keymetrics.io/docs/usage/quick-start/

https://www.educba.com/node-dot-js-process/

https://blog.appsignal.com/2022/03/09/a-complete-guide-to-nodejs-process-management-with-pm2.html

https://blog.logrocket.com/best-practices-nodejs-process-management-pm2/