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
|