一、node程序异常解决方案
由于nodeJs是单线程机制,在实际生产中开发人员一个小小的bug就可能导致整个系统的崩溃,这样导致整个系统的稳定性大大降低。如在我们自己开发的凤来平台日常维护中目前经常就会碰到前台程序无法访问的情况。对于此类问题,我总结了大概能有以下几种解决方案:
- 程序bug问题就直接修复bug,解决让系统异常停止的bug,但是这个无法最终解决问题,因为我们不能保证我们系统一定没有bug了;
- 通过捕捉uncaughtException系统异常来阻止Node进程结束,这种做法无法获取异常明细,而且有内存泄露的风险,不建议这样做;
- 通过forever、PM2等工具实时监控node进程和集群,并能保证系统进程正常运行及实时故障日志排查。PM2较forever支持更多功能,所以本文也就主要介绍PM2。
二、为什么选择PM2
PM2的主要特性有:
- 内建负载均衡
- 后台运行
- 0秒停机重载,能够保证服务进程时刻运行
- 支持自定义启动脚本
- 自动停止不稳定的进程
- 控制台检测
- 提供 HTTP API
- 支持第三方扩展监控
三、PM2安装及使用
PM2安装
npm install pm2 -g
PM2 常用命令
-
General
$ pm2 start app.js # Start, Daemonize and auto-restart application (Node) $ pm2 start app.py # Start, Daemonize and auto-restart application (Python) $ pm2 start npm -- start # Start, Daemonize and auto-restart Node application
-
Cluster Mode (Node.js only)
$ pm2 start app.js -i 4 # Start 4 instances of application in cluster mode # it will load balance network queries to each app $ pm2 reload all # Zero Second Downtime Reload $ pm2 scale [app-name] 10 # Scale Cluster app to 10 process # Process Monitoring $ pm2 list # List all processes started with PM2 $ pm2 monit # Display memory and cpu usage of each app $ pm2 show [app-name] # Show all informations about application
-
Log management
$ pm2 logs # Display logs of all apps $ pm2 logs [app-name] # Display logs for a specific app $ pm2 logs --json # Logs in JSON format $ pm2 flush $ pm2 reloadLogs
-
Process State Management
$ pm2 start app.js --name="api" # Start application and name it "api" $ pm2 start app.js -- -a 34 # Start app and pass option "-a 34" as argument $ pm2 start app.js --watch # Restart application on file change $ pm2 start script.sh # Start bash script $ pm2 start app.json # Start all applications declared in app.json $ pm2 reset [app-name] # Reset all counters $ pm2 stop all # Stop all apps $ pm2 stop 0 # Stop process with id 0 $ pm2 restart all # Restart all apps $ pm2 gracefulReload all # Graceful reload all apps in cluster mode $ pm2 delete all # Kill and delete all apps $ pm2 delete 0 # Delete app with id 0
-
Startup/Boot management
$ pm2 startup # Detect init system, generate and configure pm2 boot on startup $ pm2 save # Save current process list $ pm2 resurrect # Restore previously save processes $ pm2 unstartup # Disable and remove startup system $ pm2 update # Save processes, kill PM2 and restore processes $ pm2 generate # Generate a sample json configuration file
-
Deployment
$ pm2 deploy app.json prod setup # Setup "prod" remote server $ pm2 deploy app.json prod # Update "prod" remote server $ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
-
Module system
$ pm2 module:generate [name] # Generate sample module with name [name] $ pm2 install pm2-logrotate # Install module (here a log rotation system) $ pm2 uninstall pm2-logrotate # Uninstall module $ pm2 publish # Increment version, git push and npm publish
四、pangu-web部署例子
shell方式启动(这里只是简单例子,实际可以改造成node 集群方式)
1 新建startWeb.sh:
#!/bin/bash
node web_server.js --host 127.0.0.1 -xx 27017 -oo 27017 --noauth --port 5000
2 启动web进程 pm2 start startWeb.sh
3 查看pm2列表
4 PM2监控进程cpu、内存
5 PM2 http api
五、PM2 扩展应用
使用keymetrics实时监控Node.js程序
PM2配合keymetrics能实时监控node.js程序的运行,达到监控node.js程序的目的,以下为PM2官网监控截图:
PM25 开源node服务监控平台
由于Keymetrics是一款商业服务且价格不菲,虽有两台服务器的免费配额但对于有着众多服务器的团队或者公司来说运用免费的显然不够。而且大多数公司也不想将自己的数据存放在第三方平台,这时Keymetrics监控就不太适合了。
PM25是美团开源的基于PM2开发的一款node服务监控平台,其支持的功能有:
- 支持用户的管理(登录作为中间件)
- 被监控机器的分桶管理
- 机器列表、快速过滤和主机的指标信息(进程数、CPU数、负载、上线时长、内存占用)
- 进程的详细指标信息(PID、进程名、重启次数、上线时长、状态、CPU占用、内存占用、错误日志)
- 同Falcon整合,支持监控报警管理(核心指标同步Falcon,可以查看历史图表或者配置监控报警)
- 支持扩展包,引入扩展包后可以收集统计服务端慢路由信息
- 支持进程的远程控制,可以在云端对进程进行远程操作(比如重启、重载)
关于PM25的详细信息可查看:https://github.com/PaulGuo/PM25