跳转到内容

把 Node.js 做成 Windows 服务:别让 PATH 坑你

核验于 1 分钟阅读

用 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=3000
nssm 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 1
nssm 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 写权限。
终端窗口
sc.exe qc api-a
Get-CimInstance Win32_Process -Filter "Name='node.exe'" |
Select-Object ProcessId, ExecutablePath, CommandLine
Invoke-WebRequest http://localhost:3000/ -UseBasicParsing | Select-Object StatusCode
Get-Content C:\logs\api-a\err.log -Tail 50

ExecutablePath 必须是 C:\node\20\node.exe。若是 nvm 符号链接,nvm use 下次重启就可能换版本。

  1. 新 Node 装旁边。
  2. 绝对路径测应用。
  3. 改包装器 executable。
  4. 重启一个服务,验证 ExecutablePath 和日志。
  5. 保留旧版本回滚。

E1。实验室没有装 Node/nvm 或服务包装器;命令是 Server 2025 上待验证的服务模式。

来源