如何在Linux服务器上监控Node.js应用
监控Node.js应用的核心需求包括进程状态追踪、资源使用(CPU/内存)、性能指标分析、日志管理与故障预警。以下是Linux环境下常用的监控方法,覆盖从基础到高级的场景:
Linux自带的命令行工具可快速获取Node.js进程的基础状态,适合临时检查或脚本自动化:
top命令实时显示系统中所有进程的CPU、内存占用(按P键按CPU排序,M键按内存排序);htop是其增强版(需安装:sudo apt install htop),提供更直观的界面、进程树及滚动日志功能,可通过F3键搜索“node”进程快速定位。ps aux | grep node过滤出所有Node.js进程,查看其PID、CPU/内存占比及启动命令;结合watch -n 1 "ps aux | grep node"可每秒刷新一次进程状态。vmstat 1(每秒刷新)显示系统整体资源使用(如进程数、内存交换、IO等待);iostat(需安装sysstat包)监控磁盘IO负载,帮助定位I/O瓶颈。生产环境需确保Node.js应用持续运行、自动重启,进程管理工具是关键:
npm install pm2 -g;pm2 start app.js --name "my-app"(指定应用名称)。pm2 status(查看所有进程状态)、pm2 monit(实时监控CPU/内存/日志)、pm2 logs(查看实时日志)、pm2 save(保存当前进程列表)、pm2 startup(设置开机自启)。sudo vi /etc/systemd/system/my-node-app.service,内容如下:[Unit]
Description=My Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
WorkingDirectory=/path/to/your/app
User=www-data
Group=www-data
Restart=always
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload;sudo systemctl start my-node-app;sudo systemctl enable my-node-app(开机自启);sudo systemctl status my-node-app(查看状态);journalctl -u my-node-app -f(查看实时日志)。对于生产环境,需更全面的性能指标(如请求延迟、数据库查询耗时、错误堆栈)、可视化 dashboard及告警,推荐以下工具:
pm2 monit提供实时CPU/内存/日志监控,pm2 plus(付费)支持应用性能分析、错误跟踪及用户会话监控。prometheus-node-exporter或使用pm2-prometheus插件);newrelic Node.js agent,参考官方文档)。日志是排查问题的关键,需将Node.js日志集中收集、存储及分析:
console.log或winston/morgan等日志库记录关键事件(如请求、错误),例如:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/node-app/error.log', level: 'error' }),
new winston.transports.File({ filename: '/var/log/node-app/combined.log' }),
],
});
若需监控特定业务指标(如订单量、缓存命中率),可编写自定义脚本,定期采集数据并发送至监控系统:
process.memoryUsage()获取内存使用情况,process.cpuUsage()获取CPU占用,通过axios发送至Prometheus Pushgateway或直接写入InfluxDB:setInterval(() => {
const memory = process.memoryUsage();
const cpu = process.cpuUsage();
console.log(`Memory: ${Math.round((memory.heapUsed / 1024 / 1024) * 100) / 100} MB`);
console.log(`CPU: ${Math.round((cpu.user / 1000000) * 100) / 100} ms`);
}, 5000);
cron定时任务,定期执行脚本并将结果写入日志或数据库(如*/5 * * * * /usr/bin/node /path/to/monitor.js >> /var/log/node-monitor.log)。以上方法可根据应用规模、团队技术栈及预算选择组合使用。例如: