390 lines
8.6 KiB
Markdown
390 lines
8.6 KiB
Markdown
|
|
# NSSM 使用指南
|
|||
|
|
|
|||
|
|
> NSSM (Non-Sucking Service Manager) 是一个将任意应用程序安装为 Windows 服务的工具。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、NSSM 简介
|
|||
|
|
|
|||
|
|
NSSM 可以将 Node.js 应用、Python 脚本、批处理文件等任何可执行程序安装为 Windows 服务,实现开机自启动和自动重启。
|
|||
|
|
|
|||
|
|
### 本地文件位置
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
nssm/
|
|||
|
|
└── nssm.exe # 64 位版本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、安装服务
|
|||
|
|
|
|||
|
|
### 基本语法
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
nssm install <服务名> <程序路径> [参数]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 安装 Remote 应用服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 以管理员身份运行 PowerShell
|
|||
|
|
cd C:\Users\xuanchi\Desktop\remote\nssm
|
|||
|
|
|
|||
|
|
# 安装服务
|
|||
|
|
.\nssm.exe install RemoteApp "C:\Program Files\nodejs\node.exe" "C:\Users\xuanchi\Desktop\remote\index.js"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 使用图形界面安装
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 打开图形界面
|
|||
|
|
.\nssm.exe install RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
在弹出的窗口中配置:
|
|||
|
|
|
|||
|
|
| 标签页 | 配置项 | 值 |
|
|||
|
|
|--------|--------|-----|
|
|||
|
|
| Application | Path | `C:\Program Files\nodejs\node.exe` |
|
|||
|
|
| Application | Startup directory | `C:\Users\xuanchi\Desktop\remote` |
|
|||
|
|
| Application | Arguments | `index.js` |
|
|||
|
|
| I/O | Output (stdout) | `C:\Users\xuanchi\Desktop\remote\logs\service.log` |
|
|||
|
|
| I/O | Error (stderr) | `C:\Users\xuanchi\Desktop\remote\logs\error.log` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、管理服务
|
|||
|
|
|
|||
|
|
### 启动服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 通过 NSSM
|
|||
|
|
.\nssm.exe start RemoteApp
|
|||
|
|
|
|||
|
|
# 或通过 Windows 命令
|
|||
|
|
net start RemoteApp
|
|||
|
|
|
|||
|
|
# 或通过 sc 命令
|
|||
|
|
sc start RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 停止服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 通过 NSSM
|
|||
|
|
.\nssm.exe stop RemoteApp
|
|||
|
|
|
|||
|
|
# 或通过 Windows 命令
|
|||
|
|
net stop RemoteApp
|
|||
|
|
|
|||
|
|
# 或通过 sc 命令
|
|||
|
|
sc stop RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 重启服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
.\nssm.exe restart RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看服务状态
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
.\nssm.exe status RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 编辑服务配置
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 打开图形界面编辑
|
|||
|
|
.\nssm.exe edit RemoteApp
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 删除服务
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 先停止服务
|
|||
|
|
.\nssm.exe stop RemoteApp
|
|||
|
|
|
|||
|
|
# 删除服务
|
|||
|
|
.\nssm.exe remove RemoteApp
|
|||
|
|
|
|||
|
|
# 确认删除(不弹窗)
|
|||
|
|
.\nssm.exe remove RemoteApp confirm
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、完整安装示例
|
|||
|
|
|
|||
|
|
### 一键安装脚本
|
|||
|
|
|
|||
|
|
创建 `install-service.ps1`:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 以管理员身份运行
|
|||
|
|
$nssmPath = "C:\Users\xuanchi\Desktop\remote\nssm\nssm.exe"
|
|||
|
|
$nodePath = "C:\Program Files\nodejs\node.exe"
|
|||
|
|
$appPath = "C:\Users\xuanchi\Desktop\remote"
|
|||
|
|
$logPath = "C:\Users\xuanchi\Desktop\remote\logs"
|
|||
|
|
|
|||
|
|
# 创建日志目录
|
|||
|
|
if (-not (Test-Path $logPath)) {
|
|||
|
|
New-Item -ItemType Directory -Path $logPath
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 安装服务
|
|||
|
|
& $nssmPath install RemoteApp $nodePath "index.js"
|
|||
|
|
|
|||
|
|
# 设置工作目录
|
|||
|
|
& $nssmPath set RemoteApp AppDirectory $appPath
|
|||
|
|
|
|||
|
|
# 设置显示名称
|
|||
|
|
& $nssmPath set RemoteApp DisplayName "Remote Desktop Application"
|
|||
|
|
|
|||
|
|
# 设置描述
|
|||
|
|
& $nssmPath set RemoteApp Description "Remote screen streaming service"
|
|||
|
|
|
|||
|
|
# 设置启动类型(自动)
|
|||
|
|
& $nssmPath set RemoteApp Start SERVICE_AUTO_START
|
|||
|
|
|
|||
|
|
# 设置日志输出
|
|||
|
|
& $nssmPath set RemoteApp AppStdout "$logPath\service.log"
|
|||
|
|
& $nssmPath set RemoteApp AppStderr "$logPath\error.log"
|
|||
|
|
|
|||
|
|
# 设置日志轮转
|
|||
|
|
& $nssmPath set RemoteApp AppRotateFiles 1
|
|||
|
|
& $nssmPath set RemoteApp AppRotateBytes 1048576
|
|||
|
|
|
|||
|
|
# 设置失败重启
|
|||
|
|
& $nssmPath set RemoteApp AppExit Default Restart
|
|||
|
|
& $nssmPath set RemoteApp AppRestartDelay 5000
|
|||
|
|
|
|||
|
|
# 启动服务
|
|||
|
|
& $nssmPath start RemoteApp
|
|||
|
|
|
|||
|
|
Write-Host "RemoteApp service installed and started successfully!"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 运行安装脚本
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 以管理员身份运行
|
|||
|
|
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
|
|||
|
|
.\install-service.ps1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、高级配置
|
|||
|
|
|
|||
|
|
### 设置环境变量
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
.\nssm.exe set RemoteApp AppEnvironmentExtra "NODE_ENV=production" "PORT=3000"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 设置服务依赖
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 依赖其他服务(如需要网络)
|
|||
|
|
.\nssm.exe set RemoteApp DependOnService Tcpip
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 设置用户账户
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 使用特定用户运行
|
|||
|
|
.\nssm.exe set RemoteApp ObjectName ".\username" "password"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 设置优先级
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 设置进程优先级
|
|||
|
|
.\nssm.exe set RemoteApp AppPriority NORMAL_PRIORITY_CLASS
|
|||
|
|
|
|||
|
|
# 可选值:
|
|||
|
|
# IDLE_PRIORITY_CLASS
|
|||
|
|
# BELOW_NORMAL_PRIORITY_CLASS
|
|||
|
|
# NORMAL_PRIORITY_CLASS
|
|||
|
|
# ABOVE_NORMAL_PRIORITY_CLASS
|
|||
|
|
# HIGH_PRIORITY_CLASS
|
|||
|
|
# REALTIME_PRIORITY_CLASS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 设置失败操作
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 第一次失败:重启服务
|
|||
|
|
.\nssm.exe set RemoteApp AppExit Default Restart
|
|||
|
|
|
|||
|
|
# 重启延迟(毫秒)
|
|||
|
|
.\nssm.exe set RemoteApp AppRestartDelay 5000
|
|||
|
|
|
|||
|
|
# 设置 Windows 服务恢复选项
|
|||
|
|
.\nssm.exe set RemoteApp AppThrottle 1500
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、同时安装 FRP 和 Remote 服务
|
|||
|
|
|
|||
|
|
### 完整安装脚本
|
|||
|
|
|
|||
|
|
创建 `install-all-services.ps1`:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 以管理员身份运行
|
|||
|
|
$nssmPath = "C:\Users\xuanchi\Desktop\remote\nssm\nssm.exe"
|
|||
|
|
$nodePath = "C:\Program Files\nodejs\node.exe"
|
|||
|
|
$appPath = "C:\Users\xuanchi\Desktop\remote"
|
|||
|
|
$frpPath = "C:\Users\xuanchi\Desktop\remote\frp"
|
|||
|
|
$logPath = "C:\Users\xuanchi\Desktop\remote\logs"
|
|||
|
|
|
|||
|
|
# 创建日志目录
|
|||
|
|
if (-not (Test-Path $logPath)) {
|
|||
|
|
New-Item -ItemType Directory -Path $logPath
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# ==================== 安装 FRP 客户端服务 ====================
|
|||
|
|
|
|||
|
|
Write-Host "Installing FRP Client service..."
|
|||
|
|
|
|||
|
|
& $nssmPath install FRPClient "$frpPath\frpc.exe" "-c frpc.toml"
|
|||
|
|
& $nssmPath set FRPClient AppDirectory $frpPath
|
|||
|
|
& $nssmPath set FRPClient DisplayName "FRP Client"
|
|||
|
|
& $nssmPath set FRPClient Description "FRP Client for Remote Access"
|
|||
|
|
& $nssmPath set FRPClient Start SERVICE_AUTO_START
|
|||
|
|
& $nssmPath set FRPClient AppStdout "$logPath\frpc-service.log"
|
|||
|
|
& $nssmPath set FRPClient AppStderr "$logPath\frpc-error.log"
|
|||
|
|
& $nssmPath set FRPClient AppRotateFiles 1
|
|||
|
|
& $nssmPath set FRPClient AppRotateBytes 1048576
|
|||
|
|
& $nssmPath set FRPClient AppExit Default Restart
|
|||
|
|
& $nssmPath set FRPClient AppRestartDelay 5000
|
|||
|
|
|
|||
|
|
# ==================== 安装 Remote 应用服务 ====================
|
|||
|
|
|
|||
|
|
Write-Host "Installing Remote App service..."
|
|||
|
|
|
|||
|
|
& $nssmPath install RemoteApp $nodePath "index.js"
|
|||
|
|
& $nssmPath set RemoteApp AppDirectory $appPath
|
|||
|
|
& $nssmPath set RemoteApp DisplayName "Remote Desktop Application"
|
|||
|
|
& $nssmPath set RemoteApp Description "Remote screen streaming service"
|
|||
|
|
& $nssmPath set RemoteApp Start SERVICE_AUTO_START
|
|||
|
|
& $nssmPath set RemoteApp AppStdout "$logPath\service.log"
|
|||
|
|
& $nssmPath set RemoteApp AppStderr "$logPath\error.log"
|
|||
|
|
& $nssmPath set RemoteApp AppRotateFiles 1
|
|||
|
|
& $nssmPath set RemoteApp AppRotateBytes 1048576
|
|||
|
|
& $nssmPath set RemoteApp AppExit Default Restart
|
|||
|
|
& $nssmPath set RemoteApp AppRestartDelay 5000
|
|||
|
|
|
|||
|
|
# 设置 RemoteApp 依赖 FRPClient
|
|||
|
|
& $nssmPath set RemoteApp DependOnService FRPClient
|
|||
|
|
|
|||
|
|
# ==================== 启动服务 ====================
|
|||
|
|
|
|||
|
|
Write-Host "Starting services..."
|
|||
|
|
|
|||
|
|
& $nssmPath start FRPClient
|
|||
|
|
Start-Sleep -Seconds 3
|
|||
|
|
& $nssmPath start RemoteApp
|
|||
|
|
|
|||
|
|
Write-Host "All services installed and started successfully!"
|
|||
|
|
Write-Host ""
|
|||
|
|
Write-Host "Services installed:"
|
|||
|
|
Write-Host " - FRPClient (FRP 客户端)"
|
|||
|
|
Write-Host " - RemoteApp (远程桌面应用)"
|
|||
|
|
Write-Host ""
|
|||
|
|
Write-Host "Access URL: http://146.56.248.142:8080"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、卸载服务
|
|||
|
|
|
|||
|
|
### 卸载脚本
|
|||
|
|
|
|||
|
|
创建 `uninstall-services.ps1`:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 以管理员身份运行
|
|||
|
|
$nssmPath = "C:\Users\xuanchi\Desktop\remote\nssm\nssm.exe"
|
|||
|
|
|
|||
|
|
# 停止并删除 RemoteApp
|
|||
|
|
Write-Host "Removing RemoteApp service..."
|
|||
|
|
& $nssmPath stop RemoteApp
|
|||
|
|
& $nssmPath remove RemoteApp confirm
|
|||
|
|
|
|||
|
|
# 停止并删除 FRPClient
|
|||
|
|
Write-Host "Removing FRPClient service..."
|
|||
|
|
& $nssmPath stop FRPClient
|
|||
|
|
& $nssmPath remove FRPClient confirm
|
|||
|
|
|
|||
|
|
Write-Host "All services removed successfully!"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 八、常用命令速查
|
|||
|
|
|
|||
|
|
| 操作 | 命令 |
|
|||
|
|
|------|------|
|
|||
|
|
| 安装服务 | `nssm install <服务名> <程序> [参数]` |
|
|||
|
|
| 启动服务 | `nssm start <服务名>` |
|
|||
|
|
| 停止服务 | `nssm stop <服务名>` |
|
|||
|
|
| 重启服务 | `nssm restart <服务名>` |
|
|||
|
|
| 查看状态 | `nssm status <服务名>` |
|
|||
|
|
| 编辑配置 | `nssm edit <服务名>` |
|
|||
|
|
| 删除服务 | `nssm remove <服务名>` |
|
|||
|
|
| 设置参数 | `nssm set <服务名> <参数名> <值>` |
|
|||
|
|
| 获取参数 | `nssm get <服务名> <参数名>` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 九、常见问题
|
|||
|
|
|
|||
|
|
### 1. 服务启动后立即停止
|
|||
|
|
|
|||
|
|
**原因:** 程序路径错误或依赖未满足
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
```powershell
|
|||
|
|
# 检查服务日志
|
|||
|
|
type C:\Users\xuanchi\Desktop\remote\logs\error.log
|
|||
|
|
|
|||
|
|
# 检查程序路径
|
|||
|
|
nssm get RemoteApp Application
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 权限不足
|
|||
|
|
|
|||
|
|
**解决:** 以管理员身份运行 PowerShell
|
|||
|
|
|
|||
|
|
### 3. 端口被占用
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# 查看端口占用
|
|||
|
|
netstat -ano | findstr :3000
|
|||
|
|
|
|||
|
|
# 结束进程
|
|||
|
|
taskkill /PID <PID> /F
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 服务无法访问网络
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
```powershell
|
|||
|
|
# 设置服务依赖网络
|
|||
|
|
nssm set RemoteApp DependOnService Tcpip Dhcp Dnscache
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十、参考链接
|
|||
|
|
|
|||
|
|
- NSSM 官网: https://nssm.cc/
|
|||
|
|
- NSSM 下载: https://nssm.cc/download
|
|||
|
|
- NSSM 文档: https://nssm.cc/usage
|