node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > PM2应用监控与管理

使用PM2实现高效的应用监控与管理功能

作者:lecepin

PM2 是一个流行的进程管理器,用于 Node.js 应用程序,它支持应用程序的负载均衡、自动重启、日志管理、监控以及多环境管理等功能,本文给大家介绍了如何使用PM2实现高效的应用监控与管理功能,需要的朋友可以参考下

1. pm2

PM2 是一个流行的进程管理器,用于 Node.js 应用程序。它支持应用程序的负载均衡、自动重启、日志管理、监控以及多环境管理等功能。PM2让开发者能够以守护进程的方式运行和管理 Node.js 应用,即使在应用崩溃或服务器重启后也能自动重启应用。这使得 PM2非常适合在生产环境中部署 Node.js 应用。除此之外,PM2还支持应用的零停机更新,以及对 Docker 容器的支持。

2. 诞生背景

PM2 的诞生背景主要是为了解决 Node.js 应用程序在生产环境中的运维问题。在 PM2出现之前,Node.js 开发者经常面临如何有效管理和维持应用稳定运行的挑战,特别是在应对应用崩溃、服务器重启或是负载均衡等方面。

PM2的主要目标是提供一个简单而强大的工具,帮助开发者和系统管理员在生产环境中管理和维护 Node.js 应用。它解决的关键问题包括:

3. 安装

执行以下命令来全局安装 PM2。全局安装意味着你可以在任何地方运行 PM2命令。

npm install pm2 -g

这条命令会将 PM2安装到你的系统上,-g 参数表示全局安装,这样你就可以在任何目录下使用 PM2命令。

安装完成后,你可以运行以下命令来检查 PM2是否正确安装:

pm2 --version

4. 常用命令

命令描述使用示例及参数
start启动应用pm2 start app.jspm2 start app.js -i 4 --name myApppm2 start app.js --watch
stop停止应用pm2 stop app.jspm2 stop 0pm2 stop all
restart重启应用pm2 restart app.jspm2 restart all
delete删除应用pm2 delete app.jspm2 delete 0pm2 delete all
list列出所有应用pm2 list
monit监控应用pm2 monit
logs查看应用日志pm2 logspm2 logs app.jspm2 logs --lines 100
save保存当前应用列表pm2 save
reload重载应用pm2 reload app.jspm2 reload all
scale调整集群模式下的实例数量pm2 scale app +1pm2 scale app 4
describe查看应用详细信息pm2 describe 0
update更新 PM2守护进程pm2 update
status查看应用状态pm2 status
flush清空所有日志文件pm2 flush
startup创建开机自启动脚本pm2 startup
unstartup删除开机自启动脚本pm2 unstartup

5. 配置文件

PM2的配置文件通常被称为ecosystem.config.js,这是一个 JavaScript 文件,允许你配置和管理应用程序的多个方面。通过使用配置文件,你可以轻松地指定环境变量、日志文件路径、实例数量等,并且可以一次性启动多个应用。下面详细介绍如何使用 PM2配置文件。

基本结构

PM2的ecosystem.config.js文件基本结构如下:

module.exports = {
  apps: [
    {
      name: "app1", // 应用程序名称
      script: "./app.js", // 主脚本路径
      args: "arg1 arg2", // 传递给脚本的参数
      instances: 4, // 应用实例数
      autorestart: true, // 自动重启
      watch: false, // 监控文件变动
      max_memory_restart: "1G", // 内存超过1G 重启
      env: {
        // 环境变量
        NODE_ENV: "development",
      },
      env_production: {
        // 生产环境变量
        NODE_ENV: "production",
      },
    },
    {
      name: "app2",
      script: "./app2.js",
      // 其他配置...
    },
  ],
};

主要字段解释

使用配置文件

pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env production

配置文件为应用部署提供了强大而灵活的管理方式,特别是当你需要部署多个应用或需要为应用指定特定的环境变量和配置时。通过精心设计的配置文件,你可以确保应用的部署更加一致和可预测。

6. CLI 实现配置文件效果

如果你不使用配置文件,而是选择直接使用 PM2的 CLI 命令来实现上面提到的功能,可以通过在命令行中添加特定的选项和参数来完成。下面是如何通过 CLI 命令实现配置文件中提到的一些主要功能:

pm2 start app.js --name "app1" -- arg1=value1 arg2=value2
pm2 start app.js -i 4
pm2 start app.js --watch
pm2 start app.js --max-memory-restart 1G
NODE_ENV=development pm2 start app.js

或者,为了同时设置多个环境变量,可以使用:

pm2 start app.js --env NODE_ENV=development,env1=13,env2=32

使用 CLI 命令直接设置这些选项的好处是快速简便,特别是对于一次性或临时的任务。但对于更复杂的部署,或者当你需要在多个环境中维护一致的配置时,使用配置文件将更为有效和易于管理。

7. 监控

PM2提供了一个内置的监控工具,允许你实时查看运行在 PM2下的应用的性能指标,如 CPU 和内存使用情况。这个监控工具可以帮助你了解应用的运行状况,及时发现潜在的问题。

使用 PM2监控命令行工具

pm2 monit

使用 PM2 Web 界面

PM2还提供了一个 Web 界面,称为 PM2 Plus,用于更高级的监控和管理功能,包括远程监控和日志管理。不过,这需要在 PM2 Plus 网站上注册并设置 keymetrics 代理。

自定义指标

PM2还允许你定义自己的指标来监控。你可以在你的应用中集成 PM2的 API 来发送自定义指标,这样就可以在 PM2的监控工具中查看这些指标了。

8. 其它

8.1 负载均衡下的会话管理

在使用 PM2的集群模式运行多个实例的场景下,确保会话(session)一致性是一个重要的考虑点。由于每个实例都是独立运行的,直接在内存中存储会话信息可能会导致会话不一致的问题,因为用户的后续请求可能被路由到不同的实例上,而不同的实例之间无法共享内存中的会话信息。

为了解决这个问题,通常的做法是使用一个中央存储来存储会话信息,这样不同的实例可以共享这些信息。以下是一些常见的解决方案:

对于 Node.js 应用,如果你使用 Express 框架,可以利用express-session配合 Redis 等存储的中间件来实现会话的共享。例如,使用connect-redis中间件将会话存储在 Redis 中:

const session = require("express-session");
const RedisStore = require("connect-redis")(session);

app.use(
  session({
    store: new RedisStore({
      // Redis 服务器配置
      host: "localhost",
      port: 6379,
    }),
    secret: "your_secret",
    resave: false,
    saveUninitialized: false,
  })
);

使用这种方式,无论用户的请求被路由到哪个实例,应用都能访问到同一份会话信息,从而避免了会话不一致的问题。确保你的会话存储方案是可伸缩的,并且可以处理你的应用负载。

8.2 异常重启处理

当 PM2重启应用时,确保应用的当前状态完成后再继续,以及在异常重启下恢复重启前的状态,需要在应用层面做一些策略设计。这通常涉及到优雅的关闭处理和持久化状态管理。

优雅的关闭处理

process.on("SIGINT", function () {
  console.log("Received SIGINT. Performing graceful shutdown.");
  gracefulShutdown();
});

function gracefulShutdown() {
  // 在这里执行清理操作,如关闭数据库连接、完成正在处理的请求等
}

恢复状态

PM2特定策略

8.3 SIGINT 信号超时处理

const express = require("express");
const app = express();
const server = app.listen(3000, () =>
  console.log("Server started on port 3000")
);

let activeConnections = new Set();

app.get("/", (req, res) => {
  // 模拟长时间运行的请求
  const requestId = Date.now();
  activeConnections.add(requestId);
  console.log(`Request ${requestId} started`);

  setTimeout(() => {
    res.send("Hello World");
    activeConnections.delete(requestId);
    console.log(`Request ${requestId} finished`);
  }, 10000); // 假设请求处理需要10秒
});

process.on("SIGINT", () => {
  console.log("Received SIGINT. Graceful shutdown start.");

  // 停止服务器接受新的连接
  server.close(() => {
    console.log("Server closed. No new connections are accepted.");
  });

  // 等待所有活动请求完成
  const checkActiveConnections = () => {
    if (activeConnections.size > 0) {
      console.log(
        `Waiting for ${activeConnections.size} active connections to finish.`
      );
      setTimeout(checkActiveConnections, 1000);
    } else {
      console.log("All connections finished. Exiting now.");
      process.exit(0);
    }
  };

  checkActiveConnections();
});

捕获SIGINT信号后,进程确实有机会执行清理逻辑,但这并不意味着 PM2无法再去主动 kill 进程。当你的应用捕获SIGINT信号并进入清理阶段时,PM2会等待一段时间(默认是1600毫秒),这个时间是可配置的。如果应用在这段时间内没有退出,PM2会发送SIGKILL信号来强制终止进程。

这意味着你的清理逻辑需要在 PM2的超时时间内完成,以确保它能够正常执行并让进程优雅地退出。如果清理逻辑需要的时间超过了 PM2的超时阈值,你可以调整 PM2的配置来增加这个超时时间。

例如,你可以在启动应用时通过--kill-timeout参数来设置这个超时时间:

pm2 start app.js --kill-timeout 3000

这里,--kill-timeout 3000表示 PM2将等待3000毫秒(3秒)给应用足够的时间来处理清理逻辑。如果应用在3秒内没有退出,PM2将使用SIGKILL来强制终止应用。

这个机制确保了你的应用有机会在 PM2重启或停止它之前完成必要的清理工作,同时也保留了 PM2在应用无法正确响应终止信号时强制关闭它的能力。

以上就是使用PM2实现高效的应用监控与管理功能的详细内容,更多关于PM2应用监控与管理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文