如何在Linux服務器上監控Node.js應用
監控Node.js應用的核心需求包括進程狀態追蹤、資源使用(CPU/內存)、性能指標分析、日志管理與故障預警。以下是Linux環境下常用的監控方法,覆蓋從基礎到高級的場景:
Linux自帶的命令行工具可快速獲取Node.js進程的基礎狀態,適合臨時檢查或腳本自動化:
top
命令實時顯示系統中所有進程的CPU、內存占用(按P
鍵按CPU排序,M
鍵按內存排序);htop
是其增強版(需安裝:sudo apt install htop
),提供更直觀的界面、進程樹及滾動日志功能,可通過F3
鍵搜索“node”進程快速定位。ps aux | grep node
過濾出所有Node.js進程,查看其PID、CPU/內存占比及啟動命令;結合watch -n 1 "ps aux | grep node"
可每秒刷新一次進程狀態。vmstat 1
(每秒刷新)顯示系統整體資源使用(如進程數、內存交換、IO等待);iostat
(需安裝sysstat
包)監控磁盤IO負載,幫助定位I/O瓶頸。生產環境需確保Node.js應用持續運行、自動重啟,進程管理工具是關鍵:
npm install pm2 -g
;pm2 start app.js --name "my-app"
(指定應用名稱)。pm2 status
(查看所有進程狀態)、pm2 monit
(實時監控CPU/內存/日志)、pm2 logs
(查看實時日志)、pm2 save
(保存當前進程列表)、pm2 startup
(設置開機自啟)。sudo vi /etc/systemd/system/my-node-app.service
,內容如下:[Unit]
Description=My Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
WorkingDirectory=/path/to/your/app
User=www-data
Group=www-data
Restart=always
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
(查看狀態);journalctl -u my-node-app -f
(查看實時日志)。對于生產環境,需更全面的性能指標(如請求延遲、數據庫查詢耗時、錯誤堆棧)、可視化 dashboard及告警,推薦以下工具:
pm2 monit
提供實時CPU/內存/日志監控,pm2 plus
(付費)支持應用性能分析、錯誤跟蹤及用戶會話監控。prometheus-node-exporter
或使用pm2-prometheus
插件);newrelic
Node.js agent,參考官方文檔)。日志是排查問題的關鍵,需將Node.js日志集中收集、存儲及分析:
console.log
或winston
/morgan
等日志庫記錄關鍵事件(如請求、錯誤),例如:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: '/var/log/node-app/error.log', level: 'error' }),
new winston.transports.File({ filename: '/var/log/node-app/combined.log' }),
],
});
若需監控特定業務指標(如訂單量、緩存命中率),可編寫自定義腳本,定期采集數據并發送至監控系統:
process.memoryUsage()
獲取內存使用情況,process.cpuUsage()
獲取CPU占用,通過axios
發送至Prometheus Pushgateway或直接寫入InfluxDB:setInterval(() => {
const memory = process.memoryUsage();
const cpu = process.cpuUsage();
console.log(`Memory: ${Math.round((memory.heapUsed / 1024 / 1024) * 100) / 100} MB`);
console.log(`CPU: ${Math.round((cpu.user / 1000000) * 100) / 100} ms`);
}, 5000);
cron
定時任務,定期執行腳本并將結果寫入日志或數據庫(如*/5 * * * * /usr/bin/node /path/to/monitor.js >> /var/log/node-monitor.log
)。以上方法可根據應用規模、團隊技術棧及預算選擇組合使用。例如: