Node.js应用在CentOS上的监控方法
PM2是Node.js生态中最流行的进程管理工具之一,提供进程守护、实时监控、日志管理等功能,适合需要快速部署和管理的场景。
sudo npm install pm2 -g。pm2 start app.js --name "my-app"启动应用(将app.js替换为你的入口文件,my-app为自定义应用名称)。pm2 status查看所有进程的运行状态(包括CPU、内存占用、重启次数等)。pm2 monit打开交互式界面,实时显示应用的CPU、内存使用趋势及日志输出。pm2 logs my-app实时查看应用日志;pm2 save保存当前进程列表;pm2 startup生成开机自启脚本(确保服务重启后自动恢复)。若需将Node.js应用作为系统服务运行(实现开机自启、进程守护),可使用CentOS内置的Systemd工具。
sudo vi /etc/systemd/system/my-app.service创建服务文件,内容如下(替换路径、用户、组为实际值):[Unit]
Description=Node.js Application Service
After=network.target
[Service]
User=your-user
Group=your-group
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node /path/to/your/app/app.js
Restart=always # 应用崩溃时自动重启
[Install]
WantedBy=multi-user.target
sudo systemctl start my-app启动服务;sudo systemctl enable my-app设置开机自启。sudo systemctl status my-app查看服务运行状态;sudo journalctl -u my-app -f实时查看应用日志(-f表示跟随日志输出)。Node.js提供process和os模块,无需安装第三方工具即可获取基础性能指标,适合简单监控需求。
process.memoryUsage(),返回rss(常驻内存)、heapUsed(堆内存使用)等)、CPU时间(process.cpuUsage(),返回用户态/内核态CPU时间)。os.freemem()(空闲内存)、os.totalmem()(总内存)、os.cpus()(CPU核心信息)、os.uptime()(系统运行时间))。const os = require('os');
const memory = process.memoryUsage();
console.log(`内存使用:${memory.heapUsed / 1024 / 1024}MB / ${os.totalmem() / 1024 / 1024}MB`);
console.log(`CPU核心数:${os.cpus().length}`);
CentOS提供的命令行工具可快速查看系统整体性能,辅助定位Node.js应用的资源瓶颈。
top命令实时显示进程CPU、内存占用(按M按内存排序,P按CPU排序);htop(需安装:sudo yum install htop)是top的增强版,支持鼠标操作和颜色高亮。vmstat 3每3秒输出一次系统资源使用情况(包括进程数、内存、CPU、磁盘I/O等)。iostat -x 1查看磁盘I/O详细信息(-x表示扩展模式,1表示每秒刷新)。sar -u 1 3查看CPU使用率(-u表示CPU,1表示间隔1秒,3表示采集3次)。对于生产环境,建议使用专业的第三方监控工具,实现全面的性能追踪、错误报警和可视化。
prometheus.yml,添加Node.js应用的监控目标(如targets: ['localhost:9090'])。Node Exporter dashboard),实现CPU、内存、请求延迟等的可视化。newrelic Node.js代理(npm install newrelic --save),配置newrelic.js(填写许可证密钥和应用名称),重启应用后即可查看监控数据。dd-trace代理(npm install dd-trace --save),配置tracer.init()(设置服务名称),实现应用性能数据的自动收集。日志是排查问题的关键,可通过以下工具收集和分析Node.js应用日志:
/etc/logstash/conf.d/nodejs.conf,配置文件输入路径和Elasticsearch输出)。sudo systemctl start elasticsearch)。sudo systemctl start kibana,访问http://localhost:5601,创建索引模式并设置可视化仪表盘)。const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
new winston.transports.Console()
]
});
logger.info('Application started');