Node.js进程管理完全手册

发表时间: 2023-12-04 07:45

进程管理涉及到进程的创建、终止和监控等各种活动。进程管理器是一个程序,可确保应用程序启动后始终保持在线。

进程管理器可以通过在应用程序崩溃或主机机器重启后自动重新启动应用程序来防止生产中的停机时间。它在开发过程中也非常有用:一旦源文件或依赖项更新,它就可以自动重新启动应用程序。进程管理器通常还提供监控工具,可以访问应用程序日志和其他关键指标,如 CPU 和内存的使用情况。

本文主要阐述 Node.js 开发中常用的几种进程管理器,重点介绍 PM2 在生产环境中的应用实践。

1.进程管理器的选择

Node.js 常见的进程管理器有 supervisor、forever、nodemon、pm2。下面我们先看看 NPM Trends 对比,然后将逐一介绍并详细说明它们的优缺点。

从上图可以看出,nodemon 的下载量高于 pm2,主要归因于两个方面,一方面,很多开发环境都使用 nodemon 来监听文件及目录变化,以达到自动重启的目的,另一个方面,随着 docker、k8s 的流行,容器化生产部署不再需要 pm2 来管理进程。但是 PM2 仍是生产环境推荐的进程管理器,小懒的很多项目一直在使用 PM2 来管理。

1.1.supervisor

Supervisor 是保持应用程序运行的常用方案。它能自动监控启动的 .js 脚本中的任何代码更改,并重启相应的应用程序,使其保持最新状态。此外,它还能对 NodeJS 进程执行热重启,确保它们始终可用,并在发生故障时自动重启。

1)优点:

  • 比较成熟(3.8k Github stars)
  • 适应于多种环境

2)缺点:

  • 配置项较少
  • 社区不够活跃,最新 tag 为 2016 年
  • 非 Node.js 专用,Python 也支持

3)安装:

# 全局安装npm install -g supervisor # 开发依赖npm install --save-dev supervisor

1.2.forever

forever 进程管理器是一款简单的 CLI 工具,可让您的 Node.js 进程持续运行。它能永久保留一个子进程(如 Node.js Web 服务器上的项目),并在失败后自动重启。

1)优点:

  • 比较成熟(13.8k Github stars)
  • 适用于多种不同环境
  • 易于设置

2)缺点:

  • 配置项比较有限,不够灵活
  • 社区不够活跃,最新 tag 为 2021 年

3)安装:

# 全局安装npm install -g forever # 开发依赖npm install --save-dev forever

1.3.nodemon

nodemon 是一款帮助开发基于 Node.js 应用程序的工具,当检测到目录中的文件发生变化时,它会自动重启 node 应用程序。nodemon 无需对代码或开发方法进行任何额外更改。要使用 nodemon,请在执行脚本时替换命令行中的 node 字样。

1)优点:

  • 比较流行(25.7k Github stars),尤其在监听文件及内容变化自动重启的场景
  • CLI 配置项比较灵活
  • 社区比较活跃

2)缺点:

  • 主要应用于开发环境

3)安装:

# 全局安装npm install -g nodemon # 开发依赖npm install --save-dev nodemon

1.4.PM2

PM2(Process Manager 2)是一款适用于 Node.js 应用程序的流行进程管理器和进程运行程序。它旨在简化 Node.js 应用程序在生产环境中的部署和管理。它提供进程管理、自动重启、集群和监控等功能。PM2 通常用于生产环境,以确保高可用性和可靠性。

1)优点:

使用 PM2(Process Manager 2,进程管理器 2)运行 Node.js 应用程序具有多种优势,因此成为在生产环境中管理 Node.js 应用程序的热门选择:

  • 流程管理:PM2 允许您将应用程序的多个实例作为独立进程运行,从而简化了进程管理。这有助于负载平衡和确保高可用性。
  • 自动重启:如果 Node.js 应用程序崩溃或遇到错误,PM2 可自动重新启动。这可确保您的应用程序保持可用性和响应速度。
  • 日志记录:PM2 提供内置日志功能,可让您轻松捕获和管理应用程序日志。您可以指定日志文件位置、日志格式等。
  • 环境变量:您可以在 PM2 配置中为应用程序设置和管理环境变量,从而更轻松地管理不同的环境配置(如开发、暂存、生产)。
  • 应用程序监控:PM2 包含一个内置监控仪表板,可提供有关运行进程的实时信息,包括 CPU 和内存使用情况。这有助于您识别和解决性能问题。
  • 扩展:PM2 允许您通过运行多个实例来横向扩展应用程序。这对于处理增加的流量或分配工作负载特别有用。
  • 生产就绪:PM2 专为在生产环境中使用而设计,这意味着它提供了生产应用程序所需的功能和可靠性,如流程管理、负载平衡和错误处理。
  • 启动脚本:PM2 可为您的 Node.js 应用程序生成启动脚本,从而轻松地将应用程序作为服务启动和停止。
  • 集群模式:PM2 支持集群模式,可分叉多个应用程序实例,以利用多核 CPU,提高性能和可扩展性。
  • 轻松部署:PM2 提供了一种便捷的方式来管理应用程序的生命周期,包括停止、启动和更新,从而简化了部署过程。

2)缺点:

  • 配置复杂,上手成本高
  • 深入原理,学习成本高

3)安装:

# 全局安装npm install -g pm2 # 开发依赖npm install --save-dev pm2

抛开 docker、k8s 容器化部署,pm2 已成为 Node.js 应用程序常用的进程管理器,下面将进一步阐述 pm2 在应用开发中的最佳实践。

2.PM2 应用实践

我们首先会快速初始化一个 Node.js 项目,然后通过创建 PM2 配置文件来操作 Node.js 服务。

2.1.初始化项目

使用 npm init -y 来快速初始化一个项目:

npm init -y

新建 index.js 入口文件,并增加如下内容:

const http = require('node:http');// Create a local server to receive data fromconst server = http.createServer();// Listen to the request eventserver.on('request', (request, res) => {  res.writeHead(200, { 'Content-Type': 'application/json' });  res.end(JSON.stringify({    data: 'Hello World!',    env: process.env.NODE_ENV || 'development',  }));});server.listen(8888, () => {  console.log(`http://localhost:8888`);});

2.2.创建 pm2 配置文件

PM2 的配置文件 ecosystem.config.js 定义了运行和管理 Node.js 应用程序的配置,包括应用程序设置、环境变量、执行选项等详细信息,该文件专用于 PM2,用于配置和控制 PM2 在运行 Node.js 应用程序时的行为。

配置文件的名称可根据您的偏好和使用的进程管理器而有所不同。不过,ecosystem.config.js 是专门用于 PM2 的常用命名约定。如果您在使用 PM2 时不提供 ecosystem.config.js 文件,PM2 仍将运行您的 Node.js 应用程序,但会使用默认设置和配置。

使用配置文件的好处:

  • 便于配置多个应用程序
  • 便于配置不同环境变量
  • 便于进程扩展
  • 便于配置自定义脚本
  • 便于日志管理

常用的 ecosystem.config.js 文件内容如下:

module.exports = {  apps: [    {      name: 'demo',      script: './index.js',      instances: 4,      exec_mode: 'cluster',      out_file: '../logs/.pm2/demo.log',      error_file: '../logs/.pm2/demo-error.log',      watch: false,      max_memory_restart: '10G',      listen_timeout: 5000,      kill_timeout: 5000,      wait_ready: true,      max_restarts: 10,      env: {        NODE_ENV: 'development',      },      env_test: {        NODE_ENV: 'test',      },      env_production: {        NODE_ENV: 'production',      },    },  ],};

1.3.启动服务

使用 pm2 start ecostystem.config.js 来启动服务。

demo  pm2 start ecosystem.config.js[PM2][WARN] Folder does not exists: /Users/ifedlab/logs/.pm2[PM2] Creating folder: /Users/ifedlab/logs/.pm2[PM2] App [demo] launched (4 instances)┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬───────────┬──────────┐ App name  id  mode     pid    status  restart  uptime  cpu  mem        user       watching ├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼───────────┼──────────┤ demo      0   cluster  88675  online  0        20s     0%   42.4 MB    ifedlab  disabled  demo      1   cluster  88684  online  0        15s     0%   43.2 MB    ifedlab  disabled  demo      2   cluster  88719  online  0        10s     0%   42.1 MB    ifedlab  disabled  demo      3   cluster  88740  online  0        5s      0%   43.9 MB    ifedlab  disabled └──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴───────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

访问 http://localhost:8888 响应如下:

{  data: "Hello World!",  env: "development"}

我们还可以在启动时增加环境变量参数 pm2 start ecosystem.config.js --env production ,刷新页面响应如下:

{  data: "Hello World!",  env: "production"}

1.4.监控服务

我们可以使用 pm2 monit 命令来查看某个服务的实时 CPU 以及 内存变化。

pm2 的配置项目很多,比如可以进行缩放 pm2 scale <app_name> numpm2 deletepm2 logs、等等.如果你是新手需要多花些时间取熟悉和应用才能更好地掌握,必要时也可以看到 pm2 包的源码,里面有很多值得学习的东西。

总结

希望通过本篇文章能帮助您熟悉 Node.js 中常见的进程管理器以及使用它们的重要性,同时利用功能强大的 PM2 来高效管理应用程序。随着容器化部署的流行,比如在腾讯内部很多服务都在云上,它有着自己的进程管理模块,很少会直接使用到 PM2 来管理。当然也有很多公司存在 Docker 内仍然使用 pm2 的情况。

感谢您的阅读,如果文章对您有帮助,欢迎关注、点赞和分享,让更多需要的人看到。