Nodejs生产环境,pm2监控node服务程序,如何在crash的时候发邮件?

Nodejs生产环境,pm2监控node服务程序,如何在crash的时候发邮件?

目前是在node的process.on(‘uncaughtException’)自己发现错误自己发邮件,可否直接用pm2,在程序出意外的时候通知?谢谢。

3 回复

当然可以!PM2 提供了丰富的功能来监控 Node.js 应用程序,并且可以通过配置文件或者命令行工具实现错误通知。你可以使用 PM2 的 on 事件监听器来捕获应用程序的崩溃,并通过邮件通知你。

以下是一个简单的步骤指南,帮助你在 Node.js 生产环境中使用 PM2 监控 Node 服务程序,并在程序崩溃时发送邮件:

1. 安装必要的依赖

首先,你需要安装一个用于发送邮件的库。这里我们使用 nodemailer 作为示例。

npm install nodemailer --save

2. 创建发送邮件的脚本

创建一个简单的 JavaScript 文件,例如 send-email.js,用于发送邮件。

const nodemailer = require('nodemailer');

let transporter = nodemailer.createTransport({
    host: 'smtp.example.com',
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
        user: 'your-email@example.com', // your email address
        pass: 'your-password' // your password
    }
});

let mailOptions = {
    from: '"Your Name" <your-email@example.com>', // sender address
    to: 'recipient-email@example.com', // list of receivers
    subject: 'Node.js Application Crashed', // Subject line
    text: 'The Node.js application has crashed.', // plain text body
    html: '<b>The Node.js application has crashed.</b>' // html body
};

transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }
    console.log('Message sent: %s', info.messageId);
});

3. 配置 PM2

接下来,你需要配置 PM2 来监听应用程序的崩溃并调用上述脚本。你可以在 PM2 的配置文件中添加一个启动脚本,或者直接在命令行中设置。

使用 PM2 配置文件

创建一个 ecosystem.config.js 文件:

module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    instances: 0,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    error_file: './logs/app-err.log',
    out_file: './logs/app-out.log',
    log_date_format: "YYYY-MM-DD HH:mm Z",
    env: {
      NODE_ENV: "production"
    },
    post_restart: [
      { exec_interpreter: "node", exec_mode: "fork", script: "./send-email.js" }
    ]
  }]
}

使用 PM2 命令行

你也可以直接使用 PM2 命令行工具来配置:

pm2 start app.js --name "app" --post-restart "node ./send-email.js"

4. 启动 PM2

最后,启动你的应用:

pm2 start ecosystem.config.js

或者直接使用命令行:

pm2 start app.js

这样,当你的 Node.js 应用程序崩溃时,PM2 将会调用 send-email.js 脚本,向你发送一封邮件通知。


pm2-interface

可以监听pm2的各种事件

要在 Node.js 生产环境中使用 PM2 来监控服务并在进程崩溃时发送邮件,可以通过 PM2 的插件机制来实现。PM2 提供了一个 pm2-logrotate 插件用于日志管理,但没有直接提供崩溃通知的插件。因此,你需要结合 PM2 和外部服务或脚本来实现这一功能。

这里有一个简单的方案,使用 PM2 配合一个自定义脚本,当检测到进程崩溃时,通过外部脚本发送邮件:

  1. 配置 PM2:首先确保你的应用能够被 PM2 监控。假设你的应用文件名为 app.js
pm2 start app.js --name my-app
  1. 创建监控脚本:创建一个 Bash 脚本(例如 monitor.sh),该脚本将监听 PM2 进程的状态变化,并在进程崩溃时发送邮件。
#!/bin/bash

# 检查 PM2 进程状态
while true; do
    status=$(pm2 describe my-app | grep 'status' | awk '{print $4}')
    if [ "$status" != "online" ]; then
        # 进程状态不是 online 说明已经崩溃
        echo "App crashed, sending email..." | mail -s "App Crash Alert" your-email@example.com
        # 重新启动应用
        pm2 restart my-app
    fi
    sleep 5
done
  1. 发送邮件:确保你的服务器上安装了 mail 或者 mailx 工具,或者使用其他邮件发送工具如 nodemailer 结合 PM2 的输出日志来发送邮件。

  2. 运行监控脚本:保存上述脚本并赋予执行权限,然后运行它。

chmod +x monitor.sh
./monitor.sh &

这种方法中,你创建了一个循环监控 PM2 进程状态的脚本。当发现进程不再处于 online 状态时,即认为应用已崩溃,并通过邮件通知管理员,同时尝试重启应用。

这种方法虽然简单,但也可以扩展到更复杂的场景中,比如增加更多的错误处理逻辑、使用更高级的日志分析等。

回到顶部