Apache反向代理下Node.js应用随机崩溃报503 PM2未自动重启问题咨询
故障排查与解决方案
1. 校验PM2自动重启配置
绝大多数PM2不自动重启的问题都由参数配置错误导致:
- 执行
pm2 show <你的应用ID/名称>查看当前配置,重点核对autorestart是否为true、restart count是否已经达到max restarts的阈值 - 如果配置异常,重新启动应用时补充参数:
pm2 start <入口文件.js> --name <自定义应用名> --autorestart true --max-restarts 0 --min-uptime 5000,其中max-restarts=0代表不限制重启次数,min-uptime=5000代表进程启动5秒后崩溃才计入异常重启次数,避免启动即崩溃的场景短时间触发PM2的停止保护 - 可额外添加
--max_memory_restart 500M参数,进程占用内存超过阈值时自动重启,提前规避内存溢出问题
2. 补全进程异常捕获逻辑
你当前无报错日志的核心原因是代码未捕获全局异常,Node.js遇到未处理的同步异常、异步Promise拒绝时会直接终止进程,报错信息容易丢失。在你的Node.js入口文件最开头添加以下代码:
// 捕获未处理的同步异常 process.on('uncaughtException', (err) => { console.error('未捕获全局异常:', err.stack || err); process.exit(1); }); // 捕获未处理的异步Promise rejection process.on('unhandledRejection', (reason, promise) => { console.error('未处理Promise拒绝:', promise, '错误原因:', reason.stack || reason); });
配置完成后重启PM2,下次进程崩溃后执行pm2 logs --err <应用名>即可拿到具体报错信息,根因大概率出在你引入的两个路由文件中,比如未加try/catch的数据库请求错误、第三方接口调用异常等。
3. 排查系统级进程终止原因
如果依旧无报错日志,基本可以确定是VPS系统主动终止了Node进程:
- 执行
dmesg | grep -i kill查看系统日志,如果存在Out of memory: Killed process <PID> (node)类的记录,说明是VPS内存不足触发了OOM Killer主动杀进程,该场景下PM2不会留存相关日志 - 若确认是OOM问题,要么升级VPS内存配置,要么优化代码内存泄漏问题(常见原因有数据库连接未释放、全局变量未清理、大文件读写未释放内存)
4. 优化日志留存配置
- 执行
pm2 install pm2-logrotate安装PM2日志滚动插件,避免日志体积过大被自动清理导致丢失报错信息 - 执行
pm2 startup按提示完成操作后再执行pm2 save,配置PM2开机自启,避免VPS重启后服务未拉起的问题
临时兜底方案
如果暂时无法定位根因,可以先配置自动重启规则兜底,保证服务崩溃后自动恢复,后续抓到报错后再修复根源问题。
内容的提问来源于stack exchange,提问作者Paul Serre
相关产品推荐
相关产品推荐

