要使用Nagios监控Windows服务器,最常用的方式不是在Windows上安装SSH服务,而是部署一个轻量级代理NSClient++。Nagios服务器通过插件主动连接被监控端的TCP端口,NSClient++接收请求后读取Windows系统指标并返回结果。默认情况下,check_nt插件对应12489端口,check_nrpe插件对应5666端口。监控项覆盖CPU负载、内存使用、磁盘空间、Windows服务状态、进程数量和自定义PowerShell脚本输出。整个配置分为Windows端代理、Nagios端命令对象、主机对象、服务对象四部分。

一、Windows端安装与配置NSClient++
NSClient++是Windows平台下最成熟的Nagios代理程序,支持check_nt和NRPE两种协议。安装时可以直接从NSClient++官方仓库下载MSI安装包,双击安装并保持默认目录C:\Program Files\NSClient++。安装完成后,Windows服务列表中会出现nscp服务,该服务默认可能不会自动放行外部连接,因此必须修改配置文件C:\Program Files\NSClient++\nsclient.ini。
配置文件中需要重点确认三项内容:allowed hosts用于限制哪些Nagios服务器可以连接,password用于校验请求身份,模块开关决定哪些功能可用。下面是一个常见的NSClient++配置片段,它同时启用了check_nt和NRPE服务。
[/settings/default] allowed hosts = 192.168.1.0/24 password = mytoken [/modules] CheckSystem = 1 CheckDisk = 1 NSClientServer = 1 NRPEServer = 1 CheckExternalScripts = 1 [/settings/NSClient/server] port = 12489 [/settings/NRPE/server] port = 5666 allow arguments = 1 allow nasty_meta chars = 1 [/settings/external scripts] allow arguments = 1 allow nasty_meta chars = 1
上面的allowed hosts可以写单个IP,也可以写CIDR网段,多个地址用英文逗号分隔。password是Nagios插件调用时必须携带的共享密钥,check_nt命令中的-s参数和check_nrpe握手时都会使用它。NSClientServer模块负责12489端口的check_nt协议,NRPEServer模块负责5666端口的NRPE协议。配置修改完成后需要重启nscp服务,可以执行PowerShell命令Restart-Service nscp,也可以运行net stop nscp和net start nscp命令。
Windows防火墙默认会阻止外部连接,因此需要在被监控主机上放行12489和5666端口。管理员可以在Windows防火墙高级安全控制台中创建入站规则,也可以直接执行下面两条命令。
netsh advfirewall firewall add rule name="NSClient 12489" dir=in action=allow protocol=TCP localport=12489 netsh advfirewall firewall add rule name="NSClient 5666" dir=in action=allow protocol=TCP localport=5666
放行完成后,可以在Nagios服务器上使用telnet或nc测试TCP连通性。如果连接成功但请求被拒绝,通常说明NSClient++服务未运行、allowed hosts配置不正确或密码不一致。此时可以查看C:\Program Files\NSClient++\nsclient.log日志文件,该文件会记录连接失败和认证失败的具体原因。
二、Nagios服务器端命令与主机服务配置
Nagios服务器需要先定义插件命令,再定义主机和服务对象。check_nt插件默认位于Nagios插件目录中,通常与check_nrpe、check_ping等插件放在一起。命令定义要写入commands.cfg或类似的自定义配置文件,下面是一个标准check_nt命令对象。
define command {
command_name check_nt
command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -s $ARG1$ -v $ARG2$ $ARG3$
}
check_nt命令的第一个参数$ARG1$是密码,必须与NSClient++中的password一致;$ARG2$是检查类型,例如CPULOAD、MEMUSE、USEDDISKSPACE、SERVICESTATE;$ARG3$用于传递阈值或检查对象。调用时各个参数通过感叹号分隔,例如check_nt!mytoken!CPULOAD!-l 5,90,95。这里的-l 5,90,95表示CPU负载的警告阈值为5,严重阈值为90和95。
主机对象中需要指定Windows服务器的地址、主机名和使用的模板。服务对象则通过check_command引用前面的check_nt命令,并传入不同的检查参数。下面是一个包含CPU、内存、磁盘和Windows服务状态的配置示例。
define host {
use windows-server
host_name winserver01
alias Windows Server 2022
address 192.168.1.50
}
define service {
use generic-service
host_name winserver01
service_description CPU Load
check_command check_nt!mytoken!CPULOAD!-l 5,90,95
}
define service {
use generic-service
host_name winserver01
service_description Memory Usage
check_command check_nt!mytoken!MEMUSE!-w 85 -c 95
}
define service {
use generic-service
host_name winserver01
service_description Disk C Usage
check_command check_nt!mytoken!USEDDISKSPACE!-l C -w 85 -c 95
}
define service {
use generic-service
host_name winserver01
service_description Print Spooler
check_command check_nt!mytoken!SERVICESTATE!-l Spooler
}
CPULOAD检查CPU负载时,如果只有单个CPU,返回平均负载;如果是多核CPU,默认返回总体负载。MEMUSE检查内存使用百分比,USEDDISKSPACE检查指定盘符的使用率,SERVICESTATE检查指定Windows服务是否处于运行状态。Nagios根据插件返回码判断状态:0为OK,1为WARNING,2为CRITICAL,3为UNKNOWN。配置完成后执行nagios -v /usr/local/nagios/etc/nagios.cfg检查语法,再重新加载Nagios服务即可生效。
check_nt适合固定监控项,但在处理复杂逻辑时能力有限。例如需要监控某个进程句柄数、某个事件日志错误数量,或者需要执行一段PowerShell脚本,check_nt就无法直接完成。这时应当启用NRPE协议,通过NSClient++执行自定义命令。
三、使用NRPE和PowerShell扩展监控能力
NRPE允许Nagios服务器请求NSClient++执行任意已定义命令,不再局限于check_nt内置的检查类型。NSClient++的CheckExternalScripts模块可以调用PowerShell、VBScript或批处理脚本,然后把输出和退出码返回给Nagios。要使用这个能力,需要在nsclient.ini中定义命令别名,将别名映射到具体的PowerShell命令或脚本。
[/settings/external scripts] allow arguments = 1 allow nasty_meta chars = 1 [/settings/external scripts/scripts] check_disk_powershell = powershell.exe -ExecutionPolicy Bypass -File C:\Program Files\NSClient++\scripts\check_disk.ps1 $ARG1$
上面的配置定义了一个名为check_disk_powershell的命令,它调用C:\Program Files\NSClient++\scripts\check_disk.ps1脚本,并把$ARG1$作为第一个参数传入。脚本需要保存到对应目录,并且保证NSClient++服务账户有读取和执行权限。下面是一个检查磁盘使用率的PowerShell脚本示例。
param([string]$drive = 'C:')
$driveName = $drive.TrimEnd(':')
$volume = Get-PSDrive -Name $driveName -PSProvider FileSystem
$freeGB = [math]::Round($volume.Free / 1GB, 2)
$usedGB = [math]::Round($volume.Used / 1GB, 2)
$totalGB = $freeGB + $usedGB
$percent = [math]::Round(($usedGB / $totalGB) * 100, 2)
if ($percent -gt 90) {
Write-Host "CRITICAL: $drive is $percent% used"
exit 2
} elseif ($percent -gt 80) {
Write-Host "WARNING: $drive is $percent% used"
exit 1
} else {
Write-Host "OK: $drive is $percent% used"
exit 0
}
该脚本接收盘符作为参数,计算使用率,并根据阈值返回不同退出码。Nagios服务器端需要定义check_nrpe命令,然后在服务对象中通过别名调用外部脚本。check_nrpe命令的定义如下。
define command {
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -p 5666 -c $ARG1$ -a $ARG2$
}
调用方式可以写成check_nrpe!check_disk_powershell!C:,其中check_disk_powershell是NSClient++中定义的别名,C:是传给脚本的参数。NRPE默认不允许传递参数,因此必须在nsclient.ini中配置allow arguments = 1。如果参数中包含特殊字符,还需要开启allow nasty_meta chars = 1,否则NSClient++会拒绝执行。开启参数传递会增加一定安全风险,因此allowed hosts和password配置必须同步收紧。
与check_nt相比,NRPE加PowerShell的组合更加灵活,可以采集事件日志、IIS请求数、SQL Server状态甚至业务系统自定义指标。缺点是脚本需要单独维护,脚本超时和权限问题也会增加故障点。对于标准化监控场景,check_nt足够稳定;对于深度监控和业务指标采集,优先选择NRPE。
四、常见问题排查
Nagios与NSClient++通信失败时,首先要定位瓶颈点。可以在Nagios服务器上执行插件命令进行手工测试,观察返回信息。例如测试check_nt连接和认证是否正常,可以使用下面命令。
/usr/local/nagios/libexec/check_nt -H 192.168.1.50 -p 12489 -s mytoken -v CPULOAD -l 5,90,95
如果返回Connection refused或timed out,说明TCP连接没有建立,需要检查NSClient++服务是否运行、12489端口是否监听、Windows防火墙是否放行。可以在Windows上运行netstat -ano | findstr 12489查看端口监听状态,如果没有任何输出,说明服务未监听该端口。如果端口正常但Nagios返回Server answer invalid,通常是密码错误或allowed hosts没有包含Nagios服务器地址。
NRPE测试命令类似,执行check_nrpe -H 192.168.1.50 -p 5666 -c check_disk_powershell -a C:。如果返回ExternalCommands failed或failed to create process,通常是PowerShell脚本路径错误、脚本不存在或执行策略禁止运行。此时可以打开C:\Program Files\NSClient++\nsclient.log查看详细错误。日志中会记录命令执行失败的原因,例如脚本文件未找到、访问被拒绝或参数格式错误。
另一个容易被忽略的问题是NSClient++服务账户权限。默认以本地系统账户运行时通常可以读取大多数系统指标,但如果脚本需要访问网络共享、SQL Server或某些注册表项,可能需要改用具备相应权限的域账户运行服务。修改服务账户后需要重启服务,并重新检查脚本执行结果。通过日志和手工命令结合排查,基本可以解决绝大多数Windows服务器接入Nagios时遇到的问题。
NagiosWindows服务器监控NSClient++修改时间:2026-08-25 15:46:34