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

> 用 NSSM 或 WinSW 包装 Node，固定绝对 node.exe，设置 cwd/env，收集日志并验证服务真的用了目标版本。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

Node 没有内置 Windows 服务模式。用包装器：

- **NSSM** — 快，交互式 `nssm install`；
- **WinSW** — XML 配置，适合可重复部署。

服务必须跑**绝对** `node.exe`，不是 PATH 里的 `node`。

## NSSM

```bat
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` 和相对路径。

## WinSW

```xml
<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` 写权限。

## 验证真实版本

```powershell
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` 下次重启就可能换版本。

> **警告: 不要默认用 PM2 当 Windows 服务管理器**
>
> PM2 能在 Windows 跑，但 daemon/startup 多一层。单 Windows 服务，NSSM/WinSW 更好审计、随系统重启。

## 升级

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

## 实验室边界

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

## 来源

- [WinSW](https://github.com/winsw/winsw)
- [Node.js — 下载](https://nodejs.org/en/download)

---

来源页面: https://winbook.fyi/zh/server/runtimes/node-service/
