Windows下如何集成PM2、Node.js与Nginx并实现服务自动恢复
PM2启动批处理失败原因&优化实现方案
核心问题根因
- PM2在Windows环境下无法直接识别原生
.bat脚本作为启动入口,默认会将传入的路径按Node.js程序解析,直接触发执行报错 - 原批处理脚本的
start cmd /k逻辑会新开独立脱离管控的cmd窗口,所有启动的npm、Nginx进程都会脱离父进程树,PM2完全无法感知进程运行状态,即便勉强启动也实现不了崩溃自动重启的效果 - 原脚本未做工作路径强绑定,在PM2的运行上下文(无交互的服务环境)下,很容易出现路径找不到、npm命令无法识别的报错
适配需求的优化方案
目标是实现进程崩溃自动拉起、服务器重启后全量服务自动启动,两种方案按需选择:
方案1:拆分服务独立托管(推荐,管控精度最高)
不需要依赖批处理文件,直接让PM2接管所有需要常驻的进程:
- 启动后端Node服务:
pm2 start npm --name "app-backend" -- run start-server
PM2的Windows适配层会自动识别npm.cmd路径,无需手动开cmd窗口 - 启动前端Node服务:
pm2 start npm --name "app-frontend" -- run start-client
若前端为构建完成的静态资源,无需常驻Node进程,直接将静态资源路径配置到Nginx即可,不需要额外托管 - 启动Nginx服务:
pm2 start "D:\nginx\nginx.exe" --name "nginx" -- -g "daemon off;"
加daemon off;参数是为了关闭Nginx自带的后台守护逻辑,避免进程立刻退出导致PM2误判为崩溃、触发循环重启
方案2:保留统一批处理启动逻辑
若希望通过单个脚本统一管理启动流程,先修正原批处理的逻辑,去掉所有独立开窗口的命令,改成全链路进程受控的版本:
修正后的test.bat内容:
@echo off cd /d "D:\my-app" call npm run start-server call npm run start-client cd /d "D:\nginx" nginx -g "daemon off;"
之后PM2不能直接传入bat路径启动,需要指定通过cmd shell调用执行:pm2 start cmd --name "full-stack" -- /c "D:\my-app\test.bat"
通过/c参数告知cmd执行脚本后保持进程挂起,让PM2可以持续监控整个进程组的运行状态
开机自启配置
两种方案完成进程启动后,统一执行以下步骤实现系统重启自动拉起:
- 保存当前PM2托管的进程列表:
pm2 save - 全局安装PM2的Windows开机自启工具:
npm install -g pm2-windows-startup - 初始化开机自启服务:
pm2-startup install
完成后系统重启时PM2会自动加载之前保存的进程列表,拉起所有服务
注意事项
- 批处理脚本中不要使用
start命令新开独立cmd窗口,这类进程会脱离PM2的进程树,既无法被监控崩溃状态,也会在PM2停止服务时残留 - 不要手动指定
npm.cmd的全路径作为启动入口,PM2的Windows适配层会自动处理命令路径解析
内容的提问来源于stack exchange,提问作者Gnik
相关产品推荐
相关产品推荐

