发布于2026-07-20 阅读(0)
扫一扫,手机访问
在Ubuntu上部署Node.js应用,监控是确保稳定性的关键一环。但监控不只是“死了重启”这么简单,它需要覆盖多个维度,从日志到性能指标,再到错误追踪和可视化告警,形成一套完整的闭环。下面这份指南,就是从实战角度出发,梳理了在Ubuntu环境下对JS应用实施监控的完整路径。
一个成熟的监控体系,至少需要覆盖以下几个层面:
进程托管最常用的两种方式:PM2和systemd。
先说PM2,安装简单,功能集中。全局安装后,用pm2 start app.js -n my-app --log /var/log/my-app/app.log启动应用,日志统一输出到指定位置。实时查看用pm2 logs my-app -f,资源监控用pm2 monit,开机自启用pm2 startup && pm2 sa ve搞定。
如果更倾向于系统级管理,systemd是更稳妥的选择。创建一个服务文件,设置Restart=always,然后通过systemctl start启动,用journalctl -u my-app -f查看日志。这种方式和系统深度集成,适合生产环境。
实时跟踪日志,tail -f /var/log/my-app/app.log是最直接的手段。如果希望定期刷新,watch -n 5 cat /var/log/my-app/app.log也能满足需求。日志轮转方面,配置logrotate按日切分并压缩,再配合logwatch生成日报/周报,通过cron定时发送,基本就能覆盖日常运维的日志管理需求。
在Node.js中引入prom-client模块,暴露/metrics端点,Prometheus定期抓取数据后,接入Grafana进行可视化展示,并设置阈值告警。这是目前最主流的方案,灵活且可扩展性强。
接入Sentry(或New Relic、Datadog)是处理线上异常的标准做法。它能自动收集堆栈信息和上下文,按时间、版本、环境分组,大幅缩短排查时间。
PM2日志与启动:
sudo npm i -g pm2
pm2 start app.js -n my-app --log /var/log/my-app/app.log
pm2 logs my-app -f
pm2 monit
pm2 startup && pm2 sa ve
systemd服务:
sudo tee /etc/systemd/system/my-app.service >/dev/null <<'EOF'
[Unit]
Description=Node.js App
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/opt/my-app
ExecStart=/usr/bin/node /opt/my-app/app.js
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now my-app
sudo journalctl -u my-app -f
Winston结构化日志:
npm i winston
// logger.js
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info',
format: format.combine(format.timestamp(), format.json()),
transports: [
new transports.File({ filename: 'error.log', level: 'error' }),
new transports.File({ filename: 'combined.log' }),
new transports.Console({ format: format.simple() })
]
});
module.exports = logger;
Sentry错误追踪:
npm i @sentry/node
// app.js
const Sentry = require('@sentry/node');
Sentry.init({ dsn: process.env.SENTRY_DSN, environment: 'production' });
// 全局异常兜底
process.on('unhandledRejection', e => Sentry.captureException(e));
process.on('uncaughtException', e => { Sentry.captureException(e); process.exit(1); });
Prometheus指标端点:
npm i prom-client
// metrics.js
const client = require('prom-client');
const http = require('http');
const register = client.register;
const httpReqDur = new client.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
buckets: [5, 15, 50, 100, 200, 300, 400, 500]
});
const server = http.createServer((req, res) => {
const end = httpReqDur.startTimer();
res.on('finish', () => {
end({ method: req.method, route: req.url, code: res.statusCode });
});
res.end('OK');
});
server.listen(3000, () => console.log('Metrics on :3000/metrics'));
// Prometheus 抓取目标示例:scrape_configs: job_name: 'nodejs' static_configs: targets: ['localhost:3000']
logrotate轮转示例:
sudo tee /etc/logrotate.d/my-app >/dev/null <<'EOF'
/var/log/my-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0644 ubuntu ubuntu
sharedscripts
postrotate
systemctl reload my-app >/dev/null 2>&1 || true
endscript
}
EOF
Prometheus + Grafana的组合是业界标配。部署好Prometheus和Grafana后,在Grafana中添加Prometheus作为数据源,导入或自建Node.js仪表盘,基于http_request_duration_ms、进程内存、CPU等指标设置阈值告警,告警通知可以通过Alertmanager或外部webhook发送。
如果希望快速获取系统与应用性能总览,NetData是一个不错的选择。部署后浏览器访问http://,就能看到主机和应用的实时指标,对快速排障和容量评估很有帮助。
此外,Uptime Kuma可以专门用来监控可用性。它支持HTTP、TCP、Ping等多种协议,支持多通知渠道和状态页展示,能弥补纯资源指标监控的盲区。
开发期定位问题,可以用node --inspect app.js启动,然后在Chrome DevTools的chrome://inspect中进行CPU/内存采样和火焰图分析。配合autocannon、wrk或Artillery做负载与稳定性压测,能提前发现性能瓶颈。
运行期观测,重点是代码中埋点并暴露/metrics端点,通过Prometheus和Grafana观察P95/P99延迟、吞吐与错误率的变化趋势,再联动告警机制,做到问题早发现、早处理。
遇到资源瓶颈时,用htop、vmstat、iostat、sar(来自sysstat包)排查CPU、内存、磁盘I/O和系统层面的瓶颈,然后针对性地优化查询、缓存和并发策略。这才是从监控到优化的完整闭环。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8