如何让Node.js应用在Linux服务器稳定运行?upstart/monit方案咨询
Upstart & Monit:比nohup+forever更可靠的Node.js保活方案
我之前踩过和你一模一样的坑——用nohup forever app.js > logs &跑Node应用,偶尔会遇到进程悄无声息挂掉、forever没自动重启的情况,尤其是当Node环境出异常或者系统资源吃紧的时候。换成Upstart或者Monit之后,稳定性确实提升了一大截,下面给你详细说说这俩工具的可靠性,以及具体配置步骤:
一、为什么这俩工具更可靠?
- Upstart:属于系统级的守护进程管理器,和系统启动流程深度绑定,运行在root权限下(也可以配置成普通用户),不像forever是用户态的Node进程——万一Node本身崩溃,forever也可能跟着挂掉。Upstart会主动监控进程状态,一旦进程退出就立即重启,还能在系统开机时自动拉起应用,完全不用依赖用户会话。
- Monit:是一款轻量级的系统监控工具,功能比forever全面得多——它不光能监控进程是否存活,还能检测端口是否响应、CPU/内存占用是否过高、甚至文件变化。比如你的应用进程虽然没退出,但已经僵死(占着PID但无法处理请求),forever可能检测不到,但Monit通过端口健康检查就能发现并重启,还能同时监控Neo4j,直接替代你之前的cron脚本,响应速度比定时检测快太多。
二、具体配置命令
1. Upstart配置(适合Ubuntu 14.04及以下版本,或使用Upstart的发行版)
Upstart通过配置文件管理服务,步骤如下:
- 创建应用的配置文件:
写入以下内容(根据你的实际情况修改路径、用户等信息):sudo nano /etc/init/myapp.confdescription "我的Node.js应用" author "你的名字" # 系统网络启动后启动应用,关机时停止 start on started networking stop on shutdown # 用普通用户运行应用(替换成你的应用运行用户,比如deploy) setuid deploy setgid deploy # 切换到应用目录 chdir /var/www/myapp # 启动命令(确保node路径正确,可用`which node`查看) exec /usr/bin/node app.js # 日志输出到系统日志,也可以指定自定义日志路径 console log - 常用操作命令:
- 启动应用:
sudo start myapp - 停止应用:
sudo stop myapp - 查看应用状态:
sudo status myapp - Upstart会自动在进程退出时重启,系统开机时也会自动启动服务。
- 启动应用:
2. Monit配置(几乎所有Linux发行版都支持)
Monit可以同时监控Node应用和Neo4j,一步替代forever和cron脚本:
- 先安装Monit:
# Debian/Ubuntu sudo apt-get install monit -y # CentOS/RHEL sudo yum install monit -y - 编辑Monit主配置文件,确保开启基础功能:
找到并取消注释以下行(开启Web监控界面,可选):sudo nano /etc/monit/monitrcset httpd port 2812 and use address localhost # 只允许本地访问,也可以改成服务器IP allow admin:monit # 用户名和密码,自行修改 - 添加应用和Neo4j的监控配置(可以直接写在monitrc末尾,或者在
/etc/monit/conf.d/下新建独立文件):# 监控Node.js应用 check process myapp with pidfile /var/run/myapp.pid # 启动命令(用forever管理,也可以直接用node命令) start program = "/usr/bin/forever start --pidFile /var/run/myapp.pid /var/www/myapp/app.js" # 停止命令 stop program = "/usr/bin/forever stop /var/www/myapp/app.js" # 端口健康检查:如果3000端口10秒内无法响应/healthcheck请求,就重启 if failed port 3000 protocol HTTP request /healthcheck with timeout 10 seconds then restart # CPU占用超过90%持续2个检测周期(默认每2分钟检测一次)就重启 if cpu usage > 90% for 2 cycles then restart # 内存占用超过80%持续2个周期就重启 if memory usage > 80% for 2 cycles then restart # 监控Neo4j数据库 check process neo4j with pidfile /var/run/neo4j/neo4j.pid start program = "/usr/bin/systemctl start neo4j" stop program = "/usr/bin/systemctl stop neo4j" # 检查Neo4j的7474端口是否正常响应 if failed port 7474 protocol HTTP request / with timeout 15 seconds then restart - 常用操作命令:
- 重新加载配置:
sudo monit reload - 启动所有监控服务:
sudo monit start all - 查看监控状态:
sudo monit status - 测试配置是否正确:
sudo monit -t
- 重新加载配置:
额外建议
如果你的服务器是Ubuntu 16.04+、CentOS7+这类使用systemd的发行版,其实systemd是现在的主流方案,它结合了Upstart的系统级守护和Monit的监控能力,配置也很简单,但既然你问的是Upstart和Monit,上面的配置完全能解决你的问题。
内容的提问来源于stack exchange,提问作者Aerodynamika
相关产品推荐
相关产品推荐

