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 对其进行了守护,这实质上意味着它在后台运行进程,仅此而已。您会在一个单独的日志文件中找到日志消息,我们将在本博文的后面部分查看该文件。
进程管理命令
热重载
当您使用 Node.js 运行应用程序时,每次对应用程序进行更改时都需要重新启动服务器。 Nodemon 是一个流行的库,它会在检测到更改时重新启动服务器。您可以使用 watch 标志在 pm2 中实现相同的目的。因此,如果您在最后提供 watch 标志,则在启动任何进程时,它将侦听更改,然后自动重新启动服务器(pm2 start main.js --watch)
其他一些启动选项
现在,我们在启动时或重新启动进程时手动添加这些选项是没有意义的。相反,我们要做的是添加一个包含所有这些选项的配置文件,这样每当我们启动应用程序时,它总是会在启用这些选项的情况下运行。
创建一个 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",
}
}]
}
我将解释我们在这里使用的选项。
您还可以添加特定于环境的选项,例如,如果您的环境变量值在测试和生产模式之间发生变化,您可以分别在 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 条评论) “” |