进程管理涉及到进程的创建、终止和监控等各种活动。进程管理器是一个程序,可确保应用程序启动后始终保持在线。
进程管理器可以通过在应用程序崩溃或主机机器重启后自动重新启动应用程序来防止生产中的停机时间。它在开发过程中也非常有用:一旦源文件或依赖项更新,它就可以自动重新启动应用程序。进程管理器通常还提供监控工具,可以访问应用程序日志和其他关键指标,如 CPU 和内存的使用情况。
本文主要阐述 Node.js 开发中常用的几种进程管理器,重点介绍 PM2 在生产环境中的应用实践。
Node.js 常见的进程管理器有 supervisor、forever、nodemon、pm2。下面我们先看看 NPM Trends 对比,然后将逐一介绍并详细说明它们的优缺点。
从上图可以看出,nodemon 的下载量高于 pm2,主要归因于两个方面,一方面,很多开发环境都使用 nodemon 来监听文件及目录变化,以达到自动重启的目的,另一个方面,随着 docker、k8s 的流行,容器化生产部署不再需要 pm2 来管理进程。但是 PM2 仍是生产环境推荐的进程管理器,小懒的很多项目一直在使用 PM2 来管理。
Supervisor 是保持应用程序运行的常用方案。它能自动监控启动的 .js 脚本中的任何代码更改,并重启相应的应用程序,使其保持最新状态。此外,它还能对 NodeJS 进程执行热重启,确保它们始终可用,并在发生故障时自动重启。
1)优点:
2)缺点:
3)安装:
# 全局安装npm install -g supervisor # 开发依赖npm install --save-dev supervisor
forever 进程管理器是一款简单的 CLI 工具,可让您的 Node.js 进程持续运行。它能永久保留一个子进程(如 Node.js Web 服务器上的项目),并在失败后自动重启。
1)优点:
2)缺点:
3)安装:
# 全局安装npm install -g forever # 开发依赖npm install --save-dev forever
nodemon 是一款帮助开发基于 Node.js 应用程序的工具,当检测到目录中的文件发生变化时,它会自动重启 node 应用程序。nodemon 无需对代码或开发方法进行任何额外更改。要使用 nodemon,请在执行脚本时替换命令行中的 node 字样。
1)优点:
2)缺点:
3)安装:
# 全局安装npm install -g nodemon # 开发依赖npm install --save-dev nodemon
PM2(Process Manager 2)是一款适用于 Node.js 应用程序的流行进程管理器和进程运行程序。它旨在简化 Node.js 应用程序在生产环境中的部署和管理。它提供进程管理、自动重启、集群和监控等功能。PM2 通常用于生产环境,以确保高可用性和可靠性。
1)优点:
使用 PM2(Process Manager 2,进程管理器 2)运行 Node.js 应用程序具有多种优势,因此成为在生产环境中管理 Node.js 应用程序的热门选择:
2)缺点:
3)安装:
# 全局安装npm install -g pm2 # 开发依赖npm install --save-dev pm2
抛开 docker、k8s 容器化部署,pm2 已成为 Node.js 应用程序常用的进程管理器,下面将进一步阐述 pm2 在应用开发中的最佳实践。
我们首先会快速初始化一个 Node.js 项目,然后通过创建 PM2 配置文件来操作 Node.js 服务。
使用 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`);});
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', }, }, ],};
使用 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"}
我们可以使用 pm2 monit 命令来查看某个服务的实时 CPU 以及 内存变化。
pm2 的配置项目很多,比如可以进行缩放 pm2 scale <app_name> num、pm2 delete、pm2 logs、等等.如果你是新手需要多花些时间取熟悉和应用才能更好地掌握,必要时也可以看到 pm2 包的源码,里面有很多值得学习的东西。
希望通过本篇文章能帮助您熟悉 Node.js 中常见的进程管理器以及使用它们的重要性,同时利用功能强大的 PM2 来高效管理应用程序。随着容器化部署的流行,比如在腾讯内部很多服务都在云上,它有着自己的进程管理模块,很少会直接使用到 PM2 来管理。当然也有很多公司存在 Docker 内仍然使用 pm2 的情况。
感谢您的阅读,如果文章对您有帮助,欢迎关注、点赞和分享,让更多需要的人看到。