如何使用Node.js的进程管理器2

362 阅读9分钟

使用Node.js的流程管理器2

如果你经常使用Node.js应用程序,你可能会熟悉默认的脚本npm start ,它一般会直接运行你的服务器。这在最初看起来似乎已经足够了,但在现实世界中,当你的应用遇到错误时,你的应用可能会让大家崩溃。

这就是PM2的作用。PM2或进程管理器2是一个用Node.js编写的多功能进程管理器。

本文将介绍PM2,它的优点,如何使用它,以及为什么PM2在组织中很受欢迎。

前提条件

要跟上本教程,读者应具备以下条件。

  • 在你的系统中安装有Node.js。
  • 有一些关于Node.js的知识,你应该熟悉Linux命令和操作系统。

在讨论PM2之前,我们先从其存在的根源,即Node.js开始,以便对PM2有一个清晰的认识。

什么是Node.js?

Node.js是一个开源的、跨平台的JavaScript运行环境,可以在网络浏览器之外执行JavaScript代码,其架构是基于单线程非阻塞并发输入/输出。它是一个轻量级的网络框架,对初学者非常友好。

Node.js是用C、C++和JavaScript编写的,它是建立在开源的V8 JavaScript引擎上。由于V8支持JavaScript的最新功能,它们被添加到Node.js中。

V8是谷歌的开源高性能JavaScript和WebAssembly引擎,用C++编写。它被用于Chrome和Node.js以及其他浏览器中。

它还可以访问一个名为Libuv的C++库,该库为Node.js提供了对操作系统、文件系统和事件、循环的访问,以管理异步操作。

为什么是Node.js?

Node.js使用一个 "事件驱动的非阻塞I/O模型"。这意味着Node.js构建得很好,可以处理异步的JavaScript任务,执行许多异步活动。这些活动包括对文件系统的读写,处理与数据库服务器的连接,或作为网络服务器处理请求,等等。

为了处理异步任务,Node.js使用一个基于回调的系统。Node.js的函数或方法可能要做一些异步的动作,需要一个回调函数。

比如说。

const fs = require("fs");

fs.readFile("./hello.txt", (error, data) => {
  if (error) throw error;
  console.log(data);
});

在这个例子中,我们使用Node.js的内置fs (文件系统)模块来读取hello.txt文件。回调函数在文件读取操作完成后被调用。如果发生错误,它将作为一个错误被传递和抛出。

Node.js的优势

它提供高性能的实时性

用Node.js编写的Web应用程序从其多任务的能力中获得了很大的优势。与其他语言不同,它的单线程、事件驱动的架构可以有效地处理多个并发请求。

现代应用程序的易扩展性

随着对高效后端需求的增长,大量的跨国公司,如Netflix、沃尔玛、谷歌等,都将Node.js视为一种有价值的可扩展性解决方案。

提供社区支持以简化开发

由于数百万的开发人员积极为Node.js社区做出贡献,你可以从世界各地的专家那里获得广泛的支持,以解决最特殊的开发问题。

例如,NPM,一个用于JavaScript的包管理器,是世界上最大的包管理器存储库。它提供了大量的工具和库,可供你在项目中使用。

Node.js通过快速缓存减少加载时间

Node.js通过其缓存模块,使开发者真正容易减少任务工作量和代码的重新执行。因此,每次你的网络应用程序的任何模块收到请求时,它都会被缓存在应用程序的内存中,这对于经常访问的网站来说是非常有效的。

Node.js允许你使用微服务,让你把你的应用程序隔离成更小的部分。

什么是PM2?

PM2是一个免费的开源、高效、跨平台的Node.js生产级进程管理器,内置负载平衡器。

它可以在Linux、MacOS以及Windows上运行。它支持实时监控应用程序,有效管理微服务和关闭应用程序。

它使你的应用程序 "永远活着",可以启用自动重启,在系统启动时启动应用程序,从而实现更高的可用性配置。

为什么是PM2?

  • 崩溃后重新启动。PM2允许我们保持进程无休止地运行,直到我们关闭系统。
  • 远程监控和管理进程。网络门户允许你随时跟踪远程进程并管理它们。
  • 广泛的支持。PM2不仅限于Node.js进程,这是正确的。它可以用来管理NGINX服务器、Apache服务器等。
  • 重启-持久性。PM2会记住你所有的进程,并在系统启动后重新启动它们。

让我们举个例子来真正理解这一切。

假设你有一个Node.js的微服务,运行在端口8000

const http = require("http");

const hostname = "192.162.93.11";
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("This is the Main App!\n");
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

上面的代码在执行Node.js server.js命令后会在服务器上运行,但如果有什么事情让这个应用程序崩溃了怎么办。我们需要通过执行同样的命令行来手动重启它。

由于这是一个小的代码片段,所以可以很容易地完成。假设我们有一个企业级的代码库,那么这将是非常糟糕和耗时的。

在这里,PM2通过自动重启Node.js API来进行救援。你将不必以root身份运行你的应用程序,因此,你的应用程序将受到保护。

你的应用程序将在崩溃时重新启动,它将跟踪日志中未处理的异常。当服务器再次启动时,你的应用程序将重新启动。

安装PM2

在成功安装了Node.js和npm ,即node包管理器后,我们需要做的第一件事是在你的系统上全局安装PM2。

npm i -g pm2

如果你喜欢yarn作为你的包管理器,那么。

sudo yarn global add pm2

启动和配置PM2

要在PM2下启动一个进程,你所需要做的就是运行pm2 start <app> ,使你的应用程序由PM2管理。

对于Windows用户,PM2会输出类似这样的内容。

[PM2] Starting C:\Users\moose\app.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬
│ App name │ id │
├──────────┼────|
│ app      │ 0  │
└──────────┴────|

对于Linux和Mac用户,命令和输出有点不同。

sudo pm2 start example.js

[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting example.js in fork_mode (1 instance)
[PM2] Done.
┌─────────┬──┬────┬────┬──────┬───────┬──────┬─────────┬──────────┐
│ App name│id│mode│pid │status│restart│uptime│memory   │ watching │
├─────────┼──┼────┼────┼──────┼───────┼──────┼─────────┼──────────┤
│ example │0 │fork│3221│online│0      │5s    │15.276 MB│ disabled │
└─────────┴──┴────┴────┴──────┴───────┴──────┴─────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

输出应该与此类似。其余的命令中会有sudo 。只要把每个命令中的sudo ,那么对Windows用户来说应该是一样的。

在启动一个应用程序后,可以通过使用restart 子命令和name 标志以及你的应用程序的名称来进一步加强。

sudo pm2 restart old-app-name --name new-app-name

PM2会自动重启在其下运行的应用程序,但如果我们想让PM2在系统启动时启动我们的应用程序,我们还需要做一些额外的步骤。

为了做到这一点,我们将使用PM2的启动命令,这就是。

sudo pm2 startup systemd

上面的命令将生成一个脚本,你的服务器将使用该脚本在系统启动时启动PM2的特定应用程序进程。

如果成功的话,你应该看到一个类似于这样的输出。

[PM2] Generating system init script in  /etc/systemd/system/pm2.service
[PM2] Making script booting at startup...
[PM2] -systemd- Using the command:
      su root -c "pm2 dump && pm2 kill" && su root -c "systemctl daemon-reload && systemctl enable pm2 && systemctl start pm2"
[PM2] Dumping processes
[PM2] Stopping PM2...
[PM2] All processes have been stopped and deleted
[PM2] PM2 stopped
[PM2] Done.

接下来,我们要让PM2知道哪些应用程序要在启动时启动。我们可以通过保存当前进程列表来做到这一点,在我们的例子中,这只是我们的 "例子 "应用程序。

要保存当前进程列表,请运行。

sudo pm2 save

[PM2] Saving current process list...
[PM2] Successfully saved in /home/deployer/.pm2/dump.pm2

这就是了!现在PM2已经配置好了,在每次重启时都会自动启动保存的进程列表中指定的应用程序。

PM2集群模式

集群模式允许联网的Node.js应用程序在所有可用的CPU上进行并行扩展,而不需要任何代码更新。

这提高了你的应用程序的性能和可靠性,这取决于在特定时间内可用的CPU数量。

要启用集群模式,只需通过-i 选项。

sudo pm2 start server.js -i max

max 意味着PM2将自动检测可用的CPU数量并尽可能多地运行进程。

PM2的优点

内置集群

PM2在内部为你处理所有的逻辑,所以你不需要改变你的代码中的任何东西。

实时扩展你的集群

你可以通过运行pm2 scale <app name> <n> ,随时扩展你的集群,其中<n> 可以是一个数字,集群可以向上或向下扩展。

在生产中更新你的应用程序,零停机时间

pm2 reload <app name> 该功能将逐一重新启动你的工作者,每个工作者将等待新的工作者完成其工作,然后再杀死旧的工作者。

这样一来,即使你直接将新的批次部署到生产中,你的服务器也会继续运行。

应用程序将保持活力

如果你的任何一个工作者恰好死亡,PM2会立即重新启动它们,所以你也不必担心这个问题。

PM2的日志管理

PM2有内置的日志管理。它从你的应用程序中收集日志数据,并将其记入一个文件。

你甚至可以实时查看这些日志,以了解你的应用程序正在发生的情况。PM2的日志管理还带有日志轮换功能,这一点很重要,特别是当你的应用程序经常给出冗长的输出日志时。

这些是一些基本的命令,你可以用它们来处理你的应用程序的日志。

  • pm2 logs - 输出所有运行中的应用程序的日志。
  • pm2 logs app - 只输出应用程序的日志。
  • pm2 flush - 冲洗所有日志数据,释放磁盘空间。

要做的最重要的事情是启用日志旋转。

通过这样做,PM2将能够把一个大块的日志文件分割成许多小文件,它们更容易被PM2处理。

要做到这一点,请运行以下命令。

pm2 install pm2-logrotate 

结论

PM2使我们能够专注于构建惊人的应用程序,而不必担心维持应用程序运行所需的大量开销,当我们在Node中处理复杂的数据时,它使生活变得如此简单。

这只是你能用PM2做什么的一个小片段,但你必须亲自尝试一下,才能看到PM2所能提供的全部功能。