Node.js非常擅长处理I / O操作,但是当涉及到CPU密集型任务时,它会崩溃。您可以通过运行繁重的操作来轻松停止应用程序,并且由于 Node.js是单线程的,因此它将阻止进一步的请求。
现在,要处理此问题,您可以生成与主进程并行的子进程,以便每当有新请求传入时,它都将由此新进程处理。Node.js中的本机群集模块允许您手动配置应用程序以生成子进程的群集。但是,如果有一个包可以为您处理它,那不是更好吗?
PM2是一个进程管理器,它负责从处理多个进程到设置特定于环境的部署策略,再到将日志保存到系统中的所有事务。这是一个功能丰富的库,是Node.js社区中粉丝的最爱,这篇博客文章将介绍其中的一些关键功能。让我们开始!
基本设置
要将其安装在系统上,可以键入 。最好将其全局安装,以便您可以直接在命令行中使用pm2。我们将使用具有单个终结点的简单快速应用程序。因此,在空目录中,首先通过键入 来创建节点项目。之后,您可以通过键入 来安装 express。现在,创建一个名为 main.js的文件,并将此代码段复制到该文件中。npm i -g pm2npm init -ynpm i express
现在,我们通常使用 来运行我们的应用程序,但现在我们使用 pm2,我们可以使用 。node main.jspm2 start main.js
您将获得此表,其中显示名称/ID、CPU/内存消耗以及运行应用程序的进程的状态等详细信息。您还可以选择使用标志为进程显式提供名称。如果您没有显式为其指定名称,它将使用文件名作为进程的名称。name
现在在屏幕截图中,应用程序似乎已停止。在表格之前,您会看到“完成”消息,但在表格之后,您看不到任何内容。但是,如果您打开浏览器并转到相应链接,您将看到我们从 API 终端节点发回的“请求成功”消息。因此,应用程序仍在运行。只是pm2守护它,这基本上意味着它在后台运行进程,仅此而已。
进程管理命令
在任何给定点,都可以通过键入 或 或 来查看进程的状态。pm2 statuspm2 lspm2 list
您可以通过 使用后跟进程的名称或 ID(或 )来停止进程。您还可以使用 来停止所有进程。停止进程后,请尝试向应用程序发出请求,看看它是否正常工作。附言:不应该。pm2 stoppm2 stop mainpm2 stop 0pm2 stop all
pm2 delete后跟进程的名称或 ID,将从列表中删除该进程。( 或 )。您还可以使用 删除所有进程。pm2 delete mainpm2 delete 0pm2 delete all
还有 2 个命令可帮助您管理流程。一个是命令,另一个是命令。这两个命令本质上都重新运行进程,但区别在于它们如何执行。restartreload
A 将首先终止该进程,然后再次启动它。因此,重新启动进程时会涉及一些停机时间。pm2 restart
另一方面,A 将在后台创建一个新进程。只有当这个新进程被创建时,它才会杀死旧的进程。这可确保在重新加载进程时不会出现停机。如果由于某种原因重新加载不起作用,它最终会在特定时间后回退到经典重启。pm2 reload
热重载
使用 Node.js 运行应用程序时,每次在应用程序中进行更改时都需要重新启动服务器。Nodemon是一个流行的库,每当服务器检测到更改时,它就会重新启动服务器。您可以使用该标志在pm2中实现相同的目标。因此,如果在结束时提供监视标志,则在启动任何进程时,它将侦听更改,然后自动重新启动服务器(watchpm2 start main.js --watch)
其他一些启动选项
最大内存重启<200MB> — 此选项将在进程达到特定内存限制时重新启动进程。您可以指定内存限制,单位为千字节 (K)、兆字节 (M) 或千兆字节 (G)
日志 <文件路径> — Log 将指定要在其中存储应用程序日志的文件。尝试启动进程,但这次,请在末尾使用带有日志文件名称的日志标志。
现在,如果向光源终结点发出请求,则会在项目文件夹中看到一个名为 logFile.txt。此文件的顶部将包含 log 语句。pm2 start main.js --log ./logFile.txt
重新启动延迟<以毫秒为单位>将在自动重新启动之间添加延迟。
时间标志将为所有日志添加时间戳。重新启动应用程序,但这次在末尾附加时间标志。.现在向终结点发出请求,你将在日志文件中看到记录的消息之前的时间戳。pm2 restart 0 --time
无自动重新启动将禁用自动重新启动。当您想要执行一次性脚本并且不希望进程管理器在脚本完成运行后重新启动脚本时,这是有道理的。
cron标志将根据您添加的cron表达式间隔重新启动该过程,我有一个单独的视频详细解释了cron表达式,如果您想了解更多信息,可以查看它。
无守护进程标志不会妖魔化您的 pm2 进程。因此,您现在不会在后台运行它,而是在控制台本身上看到所有日志和事件,就像在典型的节点执行中一样。
现在,我们在启动或重新启动进程时手动添加这些选项是没有意义的。相反,我们要做的是添加一个配置文件,该文件将包含所有这些选项,以便每当我们启动应用程序时,它始终在启用这些选项的情况下运行。
创建 pm2 配置文件
要生成此配置文件,请在控制台中键入 。这将创建一个名为生态系统.config.js。如果要创建自己的配置文件,请确保它以 结尾,以便 PM2 能够将其识别为配置文件。在文件中,复制此代码段。pm2 init simple.config.js
我将解释我们在这里使用的选项。
名称:进程的名称
脚本:要执行的脚本的位置
监视:跟踪更改并重新启动进程
ignore_watch:不会跟踪一组文件/文件夹的更改
time:将时间戳附加到日志文件中的日志语句
out_file和error_file:将相应的日志语句添加到这些文件
您还可以添加特定于环境的选项,例如,如果环境变量值在测试和生产模式之间发生更改,则可以在内部或分别添加这些变量。envenv_production
稍后在切换到群集模式时,我们将添加一些额外的选项,但就目前而言,这看起来不错。
现在,我们可以运行配置文件 (),而不是使用 ,它将反过来为我们运行脚本。您可以在应用程序数组中添加多个非节点.js应用程序,它仍然可以工作。PM2不仅局限于节点.js。您可以从其他语言(如python)运行进程,例如,使用pm2。pm2 start main.jspm2 start ecosystem.config.js
现在我们对pm2有了一些了解,让我们看看它如何帮助管理多个进程。在配置文件中,添加 2 个额外的选项,exec_mode和实例。
当您想要为应用程序启动进程集群时,需要将exec_mode设置为“集群”。默认情况下,它设置为“分叉”。
设置集群时,您需要说明需要多少个流程实例。您可以传递 0/max,这将使进程旋转等于系统中的内核数。-1 将比最大值少旋转 1,如果你传入任何其他数字,它将启动那么多进程。
现在,如果您运行配置文件,您将看到一堆进程同时运行(在我的情况下是8,因为我有一个8核系统)。您还会注意到,执行模式已更改为“群集”。
PM2具有高级仪表板,可让您监控流程。您可以运行配置文件,然后使用命令打开此仪表板。pm2 monit
它为您提供了所有流程的更实时视图。您可以单独检查系统中每个进程的资源消耗和分配。还有一个日志部分,您可以在其中实时跟踪所有日志。
好吧,这篇博客文章差不多就是这样。这是对pm2及其方便功能的简要概述。