当前位置:

首页 > 编程开发 > ubuntu上js应用如何监控

ubuntu上js应用如何监控

本文目录

    在Ubuntu上对Node.js应用实施监控需覆盖日志、进程、性能指标、错误追踪及可视化告警。进程管理采用PM2或systemd,日志通过logrotate轮转,指标利用Prometheus与Grafana展示并告警,异常接入Sentry收集堆栈。综合多维度工具形成完整闭环,保障应用稳定。

    在Ubuntu上部署Node.js应用,监控是确保稳定性的关键一环。但监控不只是“死了重启”这么简单,它需要覆盖多个维度,从日志到性能指标,再到错误追踪和可视化告警,形成一套完整的闭环。下面这份指南,就是从实战角度出发,梳理了在Ubuntu环境下对JS应用实施监控的完整路径。

    一、监控目标与总体架构

    一个成熟的监控体系,至少需要覆盖以下几个层面:

    • 日志:捕获console输出与未捕获异常,按级别分别写入文件与系统日志,方便后续检索和告警触发。
    • 进程与可用性:保证进程存活、支持自动重启,同时验证端口是否正常响应,确保应用可达。
    • 指标与性能:关注请求延迟、吞吐量、错误率,以及内存、CPU、GC、事件循环等系统资源使用情况。
    • 错误追踪:聚合线上异常堆栈,按环境、版本分组,结合链路上下文快速定位问题。
    • 可视化与告警:通过Grafana看板展示数据,用Prometheus采集指标,配合Alertmanager或系统工具发送告警通知。

    二、快速落地步骤

    进程与日志

    进程托管最常用的两种方式: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://:19999,就能看到主机和应用的实时指标,对快速排障和容量评估很有帮助。

    此外,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和系统层面的瓶颈,然后针对性地优化查询、缓存和并发策略。这才是从监控到优化的完整闭环。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 Ubuntu
    相关文章 更多
    解决PHP递归报错:max_nesting_level限制与内存溢出处理
    解决PHP递归报错:max_nesting_level限制与内存溢出处理

    遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

    PHP递归中static变量与引用传递的常见陷阱及调试
    PHP递归中static变量与引用传递的常见陷阱及调试

    本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。