Linux 服务器上 Node.js 应用监控实践
一 监控分层与总体思路
- 进程与可用性:确保进程存活、自动重启、快速定位异常退出与重启原因。
- 应用指标:请求量、延迟、错误率、状态码分布、数据库/外部依赖耗时、内存与事件循环等。
- 系统资源:CPU、内存、磁盘 I/O、网络、负载、容器/主机层面的资源瓶颈。
- 日志与追踪:结构化日志、集中检索、错误聚合、分布式追踪与性能剖析。
- 可视化与告警:统一看板、阈值/异常告警、变更前后对比与容量水位。
二 快速上手 PM2 与 systemd
-
PM2 快速监控
- 安装与启动:npm install -g pm2;pm2 start app.js --name my-app
- 常用命令:pm2 list、pm2 monit(实时资源)、pm2 logs my-app、pm2 describe
- 高可用与自启动:pm2 startup、pm2 save
- 适用场景:快速上线的 Node.js 进程守护、日志聚合、基础资源监控与自动重启。
-
systemd 托管与日志
三 应用指标与 APM 接入
- Prometheus + Grafana(开源可自托管)
- 在应用中使用 prom-client 暴露指标,如 HTTP 请求时延直方图:
const promClient = require('prom-client');
const httpRequestDurationMs = new promClient.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
buckets: [0.1, 5, 15, 50, 100, 200, 300, 400, 500]
});
app.use((req,res,next)=>{
const start = Date.now();
res.on('finish', ()=>{
httpRequestDurationMs.labels(req.method, req.route, res.statusCode)
.observe(Date.now()-start);
});
next();
});
- Prometheus 抓取应用指标(示例 job 名为 nodejs),Grafana 配置 Prometheus 数据源并导入 Node.js 仪表盘。
- 商业 APM
- New Relic:安装 newrelic 并在 newrelic.js 中配置 licenseKey 与 app_name,引入后自动采集事务、错误与慢查询。
- Datadog:安装 dd-trace 并在入口初始化,采集分布式追踪、性能剖析与指标。
- 内置与诊断
- 使用 process.cpuUsage()、process.memoryUsage() 输出基础指标;内存泄漏可用 heapdump 生成快照并用 Chrome DevTools 分析。
四 系统级监控与网络诊断
- 资源与性能工具
- top/htop:进程级 CPU、内存占用;nmon/atop:CPU、内存、磁盘 I/O 等综合面板;vmstat/iostat/free/df:系统层面资源与 I/O 观测。
- 网络与依赖
- Nethogs:按进程查看带宽占用;iftop:网卡实时流量与端口信息;sar(来自 sysstat):历史与实时系统统计(如 sar -u 1、sar -r 1)。
- 反向代理与观测
- 使用 Nginx 作为反向代理时,可结合其访问日志与状态码进行观测与限流;必要时在 Nginx 层做健康检查与熔断。
五 日志集中与告警
- 结构化日志
- 使用 winston 或 morgan 输出 JSON 日志,便于检索与聚合;将日志写入文件并通过采集器送入集中系统。
- 集中式日志平台
- ELK Stack(Elasticsearch + Logstash + Kibana):Logstash 采集文件日志写入 ES,Kibana 构建检索与可视化看板。
- 可用性与状态页
- Uptime Kuma:自托管状态监控与多通道告警(如 Telegram/Discord/Slack),适合对 HTTP/端口/关键依赖做存活探测与 SLA 观测。
- 告警建议
- 关键告警项:进程异常退出/频繁重启、HTTP 5xx 比例突增、P95/P99 延迟异常、内存使用持续逼近容器/主机上限、磁盘空间不足、依赖服务不可用。