把 Node.js 做成 Windows 服务:别让 PATH 坑你
用 NSSM 或 WinSW 包装 Node,固定绝对 node.exe,设置 cwd/env,收集日志并验证服务真的用了目标版本。
测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1- 版本号
- 26100.33650
- 版本
- Standard / Datacenter
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 任务
Node 没有内置 Windows 服务模式。用包装器:
- NSSM — 快,交互式
nssm install; - WinSW — XML 配置,适合可重复部署。
服务必须跑绝对 node.exe,不是 PATH 里的 node。
nssm install api-a "C:\node\20\node.exe" "C:\apps\api-a\server.js"nssm set api-a AppDirectory "C:\apps\api-a"nssm set api-a AppEnvironmentExtra NODE_ENV=production PORT=3000nssm set api-a AppStdout "C:\logs\api-a\out.log"nssm set api-a AppStderr "C:\logs\api-a\err.log"nssm set api-a AppRotateFiles 1nssm start api-a设置 AppDirectory;Node 从工作目录解析 require('./...')、.env 和相对路径。
<service> <id>api-a</id> <name>API A</name> <executable>C:\node\20\node.exe</executable> <arguments>C:\apps\api-a\server.js</arguments> <workingdirectory>C:\apps\api-a</workingdirectory> <env name="NODE_ENV" value="production"/> <env name="PORT" value="3000"/> <logpath>C:\logs\api-a</logpath> <log mode="roll-by-size"/> <onfailure action="restart" delay="10 sec"/></service>用 winsw install / winsw start。XML 放包装器旁边并版本化。
- 专用服务账户,不用 LocalSystem。
C:\node\20和C:\apps\api-a读/执行。- 只给日志/上传/临时目录写。
- 不要给应用
C:\node写权限。
验证真实版本
Section titled “验证真实版本”sc.exe qc api-aGet-CimInstance Win32_Process -Filter "Name='node.exe'" | Select-Object ProcessId, ExecutablePath, CommandLineInvoke-WebRequest http://localhost:3000/ -UseBasicParsing | Select-Object StatusCodeGet-Content C:\logs\api-a\err.log -Tail 50ExecutablePath 必须是 C:\node\20\node.exe。若是 nvm 符号链接,nvm use 下次重启就可能换版本。
- 新 Node 装旁边。
- 绝对路径测应用。
- 改包装器 executable。
- 重启一个服务,验证
ExecutablePath和日志。 - 保留旧版本回滚。
E1。实验室没有装 Node/nvm 或服务包装器;命令是 Server 2025 上待验证的服务模式。