Nagios如何监控Windows服务器?

来源:我的博客作者:椎名光头衔:网络博主
导读:本期聚焦于椎名光创作的《Nagios如何监控Windows服务器?》,敬请观看详情。想把Windows主机纳入Nagios监控体系,却卡在代理配置和命令调用上?Nagios监控Windows服务器通常依靠NSClient++作为被监控端代理,通过check_nt与check_nrpe两种协议采集CPU、内存、磁盘、服务状态等指标。本文从Windows端NSClient++安装、nsclient.ini配置、防火墙放行端口讲起,再到Nagios服务器端命令对象、主机对象与服务对象创建,给出完整可落地的配置步骤。同时对比check_nt与NRPE在取数能力和扩展性上的差异,说明如何用自定义PowerShell脚本实现更细粒度监控,并针对连接超时、密码校验失败、返回数据异常等问题给出排查思路。读完可以快速完成Windows服务器接入Nagios监控平台。

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

Nagios如何监控Windows服务器?

一、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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。