如何在Linux上监控Node.js应用
在Linux环境下,监控Node.js应用的运行状态(如CPU、内存、进程稳定性)和性能指标(如请求速率、响应时间),需结合进程管理、系统工具、第三方监控及日志分析等多层方案。以下是具体方法:
pm2
(进程管理与监控工具)pm2
是Node.js生态中最流行的进程管理器,支持进程守护、资源监控、日志管理,适合生产环境使用。
pm2
后,启动应用并指定名称(便于后续管理):npm install pm2 -g
pm2 start app.js --name "my-node-app"
pm2 monit
(显示CPU、内存、事件循环延迟等实时数据);pm2 status
(列出所有管理的应用,包括PID、状态、重启次数);pm2 logs
(实时查看应用日志),pm2 logs --lines 100
(查看最近100行日志)。--restart-delay
参数)、集群模式提升性能(pm2 scale my-app 4
)。Linux系统自带的工具可快速查看系统级资源占用,定位Node.js进程的性能瓶颈:
top
/htop
:
top
:实时显示进程的CPU、内存使用率(按P
键按CPU排序,M
键按内存排序);htop
(需安装):增强版top
,支持颜色高亮、鼠标操作、进程树查看(安装命令:sudo apt install htop
(Debian/Ubuntu)或sudo yum install htop
(CentOS/RHEL))。vmstat
:查看系统整体资源使用情况(如CPU、内存、IO),每秒刷新一次:vmstat 1
iostat
:监控系统输入/输出设备负载(需安装sysstat
包):iostat -x 1
systemd
(若应用作为服务运行):/etc/systemd/system/my-node-app.service
,内容如下:[Unit]
Description=Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/app.js
Restart=always # 崩溃自动重启
User=www-data # 指定运行用户
Group=www-data # 指定运行组
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 # 查看状态
nodemon
(开发环境监控)nodemon
用于开发环境,监控文件变化并自动重启应用,避免手动重启:
npm install nodemon -g
nodemon app.js
适用于需要自定义指标、长期存储、可视化的场景,支持分布式系统监控。
prometheus.yml
配置文件,添加Node.js Exporter目标:scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # Node.js Exporter默认端口
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.tar.gz
cd node_exporter-* && ./node_exporter &
http://localhost:3000
,账号admin
,密码admin
),添加Prometheus作为数据源,导入Node.js监控Dashboard(如ID:1860)。适用于需要全栈监控、深度性能分析、告警的企业级场景,提供代码级追踪、数据库查询分析等功能。
license_key
;npm install newrelic --save
app.js
)顶部添加配置:const newrelic = require('newrelic');
适用于集中式日志管理、复杂查询,帮助定位应用错误和性能问题。
winston
、morgan
)输出结构化日志(JSON格式);/var/log/node-app.log
),解析后发送到Elasticsearch;若需监控特定业务指标(如订单数量、缓存命中率),可编写自定义脚本,定期采集数据并发送到监控系统(如Prometheus、邮件告警)。
node-cron
定时采集内存使用率,写入文件或发送告警:const cron = require('node-cron');
const fs = require('fs');
cron.schedule('* * * * *', () => { // 每分钟执行一次
const memoryUsage = process.memoryUsage();
const data = {
timestamp: new Date().toISOString(),
rss: memoryUsage.rss,
heapUsed: memoryUsage.heapUsed,
heapTotal: memoryUsage.heapTotal
};
fs.appendFileSync('/var/log/node-app/memory.log', JSON.stringify(data) + '\n');
});
以上方法可根据实际需求组合使用:开发环境用nodemon
+top
;生产环境用pm2
+Prometheus+Grafana
+ELK
,确保应用稳定运行并及时发现潜在问题。