Nodejs生产环境,pm2监控node服务程序,如何在crash的时候发邮件?
Nodejs生产环境,pm2监控node服务程序,如何在crash的时候发邮件?
目前是在node的process.on(‘uncaughtException’)自己发现错误自己发邮件,可否直接用pm2,在程序出意外的时候通知?谢谢。
当然可以!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的各种事件
要在 Node.js 生产环境中使用 PM2 来监控服务并在进程崩溃时发送邮件,可以通过 PM2 的插件机制来实现。PM2 提供了一个 pm2-logrotate
插件用于日志管理,但没有直接提供崩溃通知的插件。因此,你需要结合 PM2 和外部服务或脚本来实现这一功能。
这里有一个简单的方案,使用 PM2 配合一个自定义脚本,当检测到进程崩溃时,通过外部脚本发送邮件:
- 配置 PM2:首先确保你的应用能够被 PM2 监控。假设你的应用文件名为
app.js
。
pm2 start app.js --name my-app
- 创建监控脚本:创建一个 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
-
发送邮件:确保你的服务器上安装了
mail
或者mailx
工具,或者使用其他邮件发送工具如nodemailer
结合 PM2 的输出日志来发送邮件。 -
运行监控脚本:保存上述脚本并赋予执行权限,然后运行它。
chmod +x monitor.sh
./monitor.sh &
这种方法中,你创建了一个循环监控 PM2 进程状态的脚本。当发现进程不再处于 online
状态时,即认为应用已崩溃,并通过邮件通知管理员,同时尝试重启应用。
这种方法虽然简单,但也可以扩展到更复杂的场景中,比如增加更多的错误处理逻辑、使用更高级的日志分析等。