Ceiling

Windows 如何将程序安装成服务

在 Windows 服务器上运行程序时,如果直接在命令行窗口里执行,一旦关闭窗口或注销用户,程序就会随之退出。要让程序在后台长期稳定运行、开机自启、崩溃后自动恢复,最标准的做法就是把它注册为 Windows 服务

但 Windows 服务有严格的接口要求,普通程序并不能直接变成服务。本文介绍使用 NSSM 这个工具,把任意程序(以 Node.js 程序为例)一键安装成 Windows 服务。

一、NSSM 是什么

NSSM(the Non-Sucking Service Manager)是一个免费开源的服务管理工具,它可以:

  • 把任意可执行程序包装成 Windows 服务,无需修改程序代码;
  • 程序崩溃后自动重启;
  • 把程序的输出重定向到日志文件;
  • 支持图形界面和命令行两种操作方式。

与另一个常见工具 node-windows 相比,NSSM 是独立工具,不依赖 Node.js 生态,可以管理任何语言的程序。

下载安装

NSSM 是绿色软件,无需安装:

  1. 访问官网 https://nssm.cc/download 下载最新版压缩包;
  2. 解压后进入 win64 目录(64 位系统);
  3. 建议把 nssm.exe 所在目录加入系统 PATH 环境变量,方便在任意位置调用。

二、图形界面方式安装服务

管理员权限的命令提示符中执行:

nssm install myapp

会弹出一个图形配置窗口,在 Application 选项卡中填写三个关键项:

字段说明示例
Path要运行的程序,必须填绝对路径C:\nodejs\node.exe
Startup directory工作目录D:\apps\myapp
Arguments启动参数index.js

点击 Install service 按钮即可完成安装。

三、命令行方式安装服务

如果希望一条命令完成安装(适合写部署脚本),可以直接带上程序和参数:

:: 安装服务(管理员权限)
nssm install myapp "C:\nodejs\node.exe" "D:\apps\myapp\index.js"

:: 设置工作目录
nssm set myapp AppDirectory "D:\apps\myapp"

四、常用管理命令

:: 启动服务
nssm start myapp

:: 停止服务
nssm stop myapp

:: 重启服务
nssm restart myapp

:: 查看服务状态
nssm status myapp

:: 图形界面编辑服务配置
nssm edit myapp

:: 删除服务(会弹出确认框)
nssm remove myapp

安装完成后,也可以通过系统自带的服务管理器(按 Win + R 输入 services.msc)来查看和管理该服务,例如设置开机自启的启动类型。NSSM 安装的服务默认就是开机自启(Automatic)。

五、进阶配置

1. 设置环境变量

nssm set myapp AppEnvironmentExtra NODE_ENV=production PORT=8081

多个环境变量用空格分隔。

2. 输出日志到文件

Windows 服务没有控制台窗口,程序的输出默认看不到。可以把标准输出和错误输出重定向到日志文件:

:: 标准输出写入日志
nssm set myapp AppStdout "D:\apps\myapp\logs\out.txt"

:: 错误输出写入日志
nssm set myapp AppStderr "D:\apps\myapp\logs\out.txt"

:: 追加模式写入(默认就是 Append,也可设为 Overwrite 覆盖)
nssm set myapp AppStdoutAppend 1
nssm set myapp AppStderrAppend 1

3. 崩溃自动重启

NSSM 默认就会在程序退出后自动重启,这是它相对其他方案最大的优势之一。可以调整重启前的等待时间:

:: 重启前等待 5 秒,避免程序频繁崩溃导致 CPU 空转
nssm set myapp AppThrottle 5000

六、完整示例:部署 myapp

以一个 Node.js 程序为例,假设代码部署在 D:\apps\myapp,Node.js 安装在 C:\nodejs\node.exe。用管理员权限打开命令提示符,依次执行:

:: 1. 安装服务
nssm install myapp "C:\nodejs\node.exe" "D:\apps\myapp\index.js"

:: 2. 设置工作目录
nssm set myapp AppDirectory "D:\apps\myapp"

:: 3. 设置环境变量
nssm set myapp AppEnvironmentExtra NODE_ENV=production

:: 4. 配置日志输出
nssm set myapp AppStdout "D:\apps\myapp\logs\out.txt"
nssm set myapp AppStderr "D:\apps\myapp\logs\out.txt"

:: 5. 启动服务
nssm start myapp

:: 6. 查看状态
nssm status myapp

输出 SERVICE_RUNNING 即表示服务正常运行。之后程序会在开机时自动启动,进程崩溃后也会自动拉起。

七、常见坑:node 命令找不到

与 Linux 的 systemd 类似,Windows 服务运行在独立的会话中,不会继承你登录终端时的完整 PATH 环境变量。如果 Path 里直接写 node

nssm install myapp node index.js

服务启动时很可能报「系统找不到指定的文件」或程序立即退出。

解决方法:先查出 node 的实际路径:
where node
:: 输出类似:C:\nodejs\node.exe
:: 若用 fnm 安装,则类似:C:\Users\dev\AppData\Roaming\fnm\node-versions\v24.19.0\installation\node.exe

再把该绝对路径填入 Path。这也是为什么第二节示例中直接写 C:\nodejs\node.exe 的原因。

注意:路径中包含空格或中文时,务必用英文双引号包裹,如 "C:\Program Files\nodejs\node.exe"

八、卸载服务

不再需要某个服务时,可以将其移除:

:: 先停止服务
nssm stop myapp

:: 删除服务(会弹出确认框)
nssm remove myapp

:: 如需跳过确认框(适合脚本)
nssm remove myapp confirm

九、小结

使用 NSSM 将程序安装成 Windows 服务只需要三步:

  1. 下载 NSSM 并用 nssm install 创建服务;
  2. 通过 nssm set 配置工作目录、环境变量和日志输出;
  3. nssm start 启动服务。

之后程序就会开机自启、崩溃自愈,日志也有迹可查,非常适合在 Windows 服务器上部署 Node.js 应用。