七爪源码:使用 PM2 在 Node.js 中进行进程管理

Node.js 非常擅长处理 I/O 操作,但是当涉及到 CPU 密集型任务时,它就崩溃了。您可以通过运行繁重的操作轻松停止应用程序,并且由于 Node.js 是单线程的,它会阻止进一步的请求。

现在,为了处理这个问题,您可以与主进程并行生成子进程,以便任何时候有新请求进来,它都会由这个新进程处理。 Node.js 中的本机集群模块允许您手动配置应用程序以生成子进程集群。但是,如果有一个包可以为您处理它不是更好吗?

PM2 是一个进程管理器,它负责处理从处理多个进程、设置特定于环境的部署策略到将日志保存到系统中的所有事务。这是一个功能丰富的库,在 Node.js 社区中深受粉丝喜爱,这篇博文将介绍其中的一些关键功能。所以让我们开始吧!


基本设置

要将其安装在您的系统上,您可以输入 npm i -g pm2。最好全局安装,这样就可以直接在命令行中使用pm2了。我们将使用一个具有单个端点的简单快速应用程序。因此,在一个空目录中,首先通过输入 npm init -y 创建您的节点项目。之后,您可以通过输入 npm i express 来安装 express。现在,创建一个名为 main.js 的文件并将此代码段复制到文件中。

const app = require("express")()
app.get("/light", (req, res) => {
   console.log("Light request triggered")
   res.send(`Request successful!
`);
})app.listen(3000, () => console.log("Listening to port 3000"));

现在通常我们会使用 node main.js 来运行我们的应用程序,但现在我们使用的是 pm2,我们可以使用 pm2 start main.js。

您将获得此表,其中显示名称/id、CPU/内存消耗以及运行应用程序的进程状态等详细信息。您还可以选择使用名称标志为您的进程显式提供名称。如果你没有明确地给它一个名字,它会使用文件的名字作为进程的名字。

现在在屏幕截图中,应用程序似乎已停止。在表格之前,您会看到“完成”消息,但在表格之后,您什么也看不到。但是,如果您打开浏览器并访问 http://localhost:3000/light,您将看到我们从 API 端点发回的“请求成功”消息。所以应用程序仍在运行。只是 pm2 对其进行了守护,这实质上意味着它在后台运行进程,仅此而已。您会在一个单独的日志文件中找到日志消息,我们将在本博文的后面部分查看该文件。


进程管理命令

  • 在任何给定点,您都可以通过输入 pm2 status 或 pm2 ls 或 pm2 list 查看进程的状态。
  • 您可以使用 pm2 stop 后跟进程的名称或 ID(pm2 stop main 或 pm2 stop 0)来停止进程。您还可以使用 pm2 stop all 停止所有进程。停止进程后,尝试向您的应用程序发出请求,看看它是否正常工作。 P.S 不应该。
  • pm2 delete 后跟进程的名称或 id 将从列表中删除该进程。 (pm2 删除 main 或 pm2 删除 0)。您也可以使用 pm2 delete all 删除所有进程。
  • 还有 2 个命令可以帮助您管理流程。一个是重启命令,另一个是重新加载命令。这两个命令本质上都是重新运行一个进程,但不同之处在于它们是如何执行的。
  • pm2 restart 将首先终止该进程,然后重新启动它。因此,当您重新启动流程时,会涉及一些停机时间。
  • 另一方面,pm2 reload 将在后台创建一个新进程。只有当这个新进程被创建时,它才会杀死旧进程。这样可以确保在重新加载进程时不会出现停机。如果由于某种原因重新加载不起作用,它最终会在特定时间后退回到经典重启。


热重载

当您使用 Node.js 运行应用程序时,每次对应用程序进行更改时都需要重新启动服务器。 Nodemon 是一个流行的库,它会在检测到更改时重新启动服务器。您可以使用 watch 标志在 pm2 中实现相同的目的。因此,如果您在最后提供 watch 标志,则在启动任何进程时,它将侦听更改,然后自动重新启动服务器(pm2 start main.js --watch)


其他一些启动选项

  • max-memory-restart <200MB> — 此选项将在进程达到某个内存限制时重新启动。您可以以千字节 (K)、兆字节 (M) 或千兆字节 (G) 为单位指定内存限制
  • log — Log 将指定您将在其中存储应用程序日志的文件。尝试启动一个进程,但这一次,在最后使用带有日志文件名称的日志标志。
  • pm2 开始 main.js --log ./logFile.txt
  • 现在,如果您向轻端点发出请求,您将在项目文件夹中看到一个名为 logFile.txt 的文件自动生成。该文件将在顶部有日志语句。
  • restart-delay 将在自动重启之间添加延迟。
  • time 标志将为您的所有日志添加时间戳。重新启动您的应用程序,但这次在末尾附加时间标志。 pm2 重新启动 0 --time。现在向端点发出请求,您将在日志文件中看到记录消息之前的时间戳。
  • no-autorestart 将禁用自动重启。当您想要执行一次性脚本并且不希望进程管理器在脚本完成运行后重新启动脚本时,这是有道理的。
  • cron 标志将根据您添加的 cron 表达式间隔重新启动进程。我有一个单独的视频详细解释了 cron 表达式,如果您想了解更多信息,可以查看它。
  • no-daemon 标志不会妖魔化您的 pm2 进程。因此,您现在无需在后台运行它,而是在控制台本身上看到所有日志和事件,就像在典型节点执行的情况下一样。

现在,我们在启动时或重新启动进程时手动添加这些选项是没有意义的。相反,我们要做的是添加一个包含所有这些选项的配置文件,这样每当我们启动应用程序时,它总是会在启用这些选项的情况下运行。


创建一个 pm2 配置文件

要生成此配置文件,请在控制台中输入 pm2 init simple。这将创建一个名为生态系统.config.js 的文件。如果您正在创建自己的配置文件,请确保它以 .config.js 结尾,以便 PM2 能够将其识别为配置文件。在文件中,复制此代码段。

module.exports = {
  apps: [{
    name : "app",
    script: "./main.js",
    watch: true,
    ignore_watch : "node_modules",
    time: true,
    out_file : "./scripts.txt",
    error_file : "./error.txt",
    env: {
      "NODE_ENV": "development"
    },
    env_production: {
      "NODE_ENV": "production",
    }
  }]
}

我将解释我们在这里使用的选项。

  • name:进程的名称
  • script:要执行的脚本的位置
  • watch:跟踪更改并重新启动进程
  • ignore_watch:不会跟踪一组文件/文件夹的更改
  • time:将时间戳附加到日志文件中的日志语句
  • out_file 和 error_file:将各自的日志语句添加到这些文件中

您还可以添加特定于环境的选项,例如,如果您的环境变量值在测试和生产模式之间发生变化,您可以分别在 env 或 env_production 中添加这些变量。

稍后当我们切换到集群模式时,我们将添加几个额外的选项,但现在看起来不错。

现在,我们可以运行配置文件 (pm2 start Ecosystem.config.js) 而不是使用 pm2 start main.js,然后它会依次为我们运行脚本。您可以在应用程序数组中添加多个非 Node.js 应用程序,它仍然可以工作。 PM2 不仅仅绑定到 Node.js。您可以使用不同的语言(例如 python)运行进程,例如使用 pm2。

现在我们对 pm2 有了一些了解,让我们看看它如何帮助管理多个进程。在配置文件中,添加 2 个额外的选项,exec_mode 和实例。

module.exports = {
  apps: [{
    name : "app",
    script: "./main.js",
    watch: true,
    ignore_watch : "node_modules",
    time: true,
    exec_mode:"cluster",
    instances:"max",
    out_file : "./scripts.txt",
    error_file : "./error.txt",
    env: {
      "NODE_ENV": "development"
    },
    env_production: {
      "NODE_ENV": "production",
    }
  }]
}

当您想为您的应用程序启动一个进程集群时,您需要将 exec_mode 设置为“cluster”。 默认情况下,它设置为“分叉”。

设置集群时,您需要提及需要多少流程实例。 您可以传递 0/max ,这将启动等于系统中核心数的进程。 -1 将比最大值旋转 1,如果您传入任何其他数字,它将启动那么多进程。

现在如果你运行配置文件,你会看到一堆同时运行的进程(在我的例子中是 8 个,因为我有一个 8 核系统)。 您还会注意到执行模式已更改为“集群”。

PM2 有一个高级仪表板,可让您监控流程。 您可以运行配置文件,然后使用 pm2 monit 命令打开此仪表板。

它使您可以更实时地查看所有流程。 您可以单独检查系统中每个进程的资源消耗和分配。 还有一个日志部分,您可以在其中实时跟踪所有日志。


结论

好的,这就是这篇博文的内容。 这是对 pm2 及其便利功能的简要概述。 显然还有很多。 我并没有真正讨论任何可以使用 pm2 实现的部署策略,这本身就是一个全新的话题。 也许在未来,我会为此单独写一篇博文,但这篇博文只是为了演示我们如何使用 pm2 自动化流程管理。


关注七爪网,获取更多APP/小程序/网站源码资源!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章