告别监控盲区!KeyarchOS安装nrpe-3.2.1-8,远程主机指标采集开箱即用监控盲区这四个字,伺候过大规模服务器的同学应该都懂。你辛辛苦苦把监控平台搭起来,CPU、内存、磁盘看个一目了然,偏偏到了某些非标准部署、临时扩容或者新接入的机器上,监控数据就是不出现,机房那边报“服务器负载高”,你这边图上一片空白,只能靠SSH上去敲命令碰运气。前阵子我们这边处理一批新上线的KOS服务器,就碰到了同样的问题。最终让我把监控盲区彻底填平的,是NRPE 3.2.1-8这套远程指标采集方案。NRPE全称是Nagios Remote Plugin Executor,说人话就是一套监控代理:它在被监控主机上驻留一个轻量守护进程,外部监控中心通过check_nrpe插件发指令给它,它再调本地插件把CPU、内存、磁盘、进程数这些指标取回来回传。整个过程不要求被监控机器上装完整监控平台,也不用打开一堆额外端口,只要能跑一个Agent就够了。这篇就记录一下我在KOS上从零装好NRPE、配置出有效监控数据的完整过程,包括踩过的坑、验证方法和监控端对接配置,希望可以帮你绕开那些文档里根本不会写的细节。1. 项目背景与监控痛点1.1 当我们说“监控盲区”时,到底指什么所谓“监控盲区”,可以理解为监控平台对某台主机完全无感知的状态。举个例子,某公司有一套运行多年的应用集群,监控端一直沿用Nagios体系,绝大多数节点都纳管得很好。但新来的那批KOS服务器因为上架时间紧、又赶上架构调整,一直没有纳入监控体系。表面上看服务器在正常跑业务,实际上内存快耗尽、磁盘即将打满、进程数量异常飙升这些隐患,监控平台一概不知道。等业务同事反馈“这台机器好卡”的时候,再上去看往往已经晚了。在这种情况下,给每台机器补一个轻量级采集代理,是成本最低、见效最快的方案。NRPE正好就是这个角色。它只负责“被监控端指标的采集与回传”,不承担告警判定和数据存储,把采集能力补齐,监控平台原有的告警策略就能立刻生效。这个定位非常清晰,也比较稳妥地解决了“不想为监控改造业务机器,但又要看到数据”的矛盾。1.2 为什么选NRPE而不是其他采集方式现在远程指标采集的方案并不少,常见的有SNMP、Agent模式、SSH远程执行,还有各类商业Agent。我在KOS上选NRPE,主要基于四点考虑。方案资源占用部署复杂度可定制性与现有监控平台契合度SNMP较低中,需要配置MIB和告警映射一般需要改监控逻辑远程SSH执行无Agent低,但频繁拉起SSH会话高对监控端压力大,易触发安全策略NRPE Agent很低低,单个守护进程高,可自由扩展命令与Nagios/兼容平台原生契合商业Agent中等中高,依赖专有控制面受厂商限制需要额外平台支撑对大多数内部运维场景来说,NKOS服务器数目一般不会到几十台上百台那种规模,SNMP的监控映射表反而成了负担;SSH方式则在网络策略严格的环境里经常被堡垒机拦下来。NRPE只占用一个5666端口,配置也简单,且完全兼容我们正在用的监控平台,所以最终选了它。这个选择还有一个隐性好处:NRPE插件返回的都是纯文本格式,比如OK - CPU load average: 0.20, 0.15, 0.10|load1=0.200;4.000;6.000;0;这种,监控端可以直接解析性能数据,无需额外开发适配层。后面你会看到,这一步能省下大把时间。2. 环境准备与安装前置知识2.1 KOS下需要准备的依赖清单NRPE虽然叫“代理”,但它本质上一个C编写的守护进程加一组二进制插件集合。编译安装前需要确认系统里有几个基础组件。我在KOS上实测,重点检查的是gcc、make、openssl及其开发头文件。# 检查基础编译环境 gcc --version make --version # 检查OpenSSL开发库 rpm -qa | grep openssl-devel # 如果缺少,使用系统包管理器补齐 yum install -y gcc glibc glibc-common make openssl-devel很多人在编译NRPE时卡住,报openssl/ssl.h: No such file or directory,就是漏装了openssl-devel。这个头文件包和命令行的openssl并不是一回事,命令行客户端装了不代表开发头文件也齐了,务必单独确认。另外,因为监控中心与NRPE通信时会用到SSL加密,KOS自带的OpenSSL版本一般都能直接满足NRPE 3.2.1-8的编译需求,不用额外升级。2.2 两种安装方式怎么选:rpm包与源码编译根据标题里的版本号“nrpe-3.2.1-8”,不少KOS软件源里可能已经收录了对应的rpm包。优先建议先查一下:# 优先尝试软件源安装 yum list nrpe yum info nrpe如果仓库里确实有现成的nrpe-3.2.1-8,直接yum install -y nrpe也是最省事的路径,依赖关系由包管理器自动处理,装完就能用。不过实际环境里经常会碰到软件源没有这个包、或者版本偏旧、或者需要自己指定编译参数的情况,这时候就得走源码编译。源码编译的好处在于:可以自己控制安装路径、指定插件目录、调整SSL参数,而且不污染系统原有的包管理状态。缺点是要手动处理依赖。考虑到不少内网环境的软件源同步并不及时,我最终选择的是源码编译,下面完整记录的就是这条路径。2.3 源码包几个关键编译参数的含义NRPE源码编译的核心命令是./configure,不是每项参数都要动,但有几个必须弄明白:./configure \ --prefix=/usr/local/nrpe \ # NRPE安装根目录 --with-nagios-user=nrpe \ # 守护进程运行用户 --with-nagios-group=nrpe \ # 守护进程运行用户组 --with-ssl \ # 启用SSL加密传输 --with-ssl-lib=/usr/lib64 \ --enable-command-args \ # 允许监控端传入参数 --with-ssl-inc=/usr/include/openssl--enable-command-args这一项特别重要。如果不加,监控端调用某个NRPE命令时不能附带额外参数,灵活性会大打折扣。虽然安全上会有一定风险,但在内网监控环境里,这个开关的便利性远大于风险。处理办法是把allowed_hosts严格限定为监控中心服务器的IP,而不是开给全网段。3. NRPE安装与配置实操3.1 第一步:准备专用账号并下载源码包安全配置的第一原则就是:运行服务用的账号权限越小越好。NRPE官方文档也推荐创建专用账号,而不是用root直接跑守护进程。采集指标的过程中会执行一些本地脚本,虽然某些插件确实需要读系统文件,但绝大多数场景下普通用户权限就够用了。# 创建专用运行账号 useradd -r -s /sbin/nologin nrpe这里用了-r创建系统账号,-s /sbin/nologin则防止该账号被用于交互登录。即使NRPE被利用,攻击者能拿到的也是一个受限shell,降低风险。源码包可以从NRPE官网或镜像站下载,注意选择nrpe-3.2.1.tar.gz这个稳定版本。下载后务必做两项检查:一是校验文件的SHA256值是否与官方公布一致,防止下载过程被篡改;二是确认源码包完整性,解压后能看到configure脚本才可以继续。# 下载并解压源码包 wget https://github.com/NagiosEnterprises/nrpe/releases/download/nrpe-3.2.1-8/nrpe-3.2.1.tar.gz sha256sum nrpe-3.2.1.tar.gz tar -xzf nrpe-3.2.1.tar.gz cd nrpe-3.2.13.2 第二步:编译安装NRPE环境确认无误后,执行配置和编译。建议在./configure之后先看一眼输出摘要,确认SSL和Command Args都处于enabled状态,再进行下一步。# 生成Makefile ./configure \ --prefix=/usr/local/nrpe \ --with-nagios-user=nrpe \ --with-nagios-group=nrpe \ --with-ssl \ --with-ssl-lib=/usr/lib64 \ --with-ssl-inc=/usr/include/openssl \ --enable-command-args # 编译并安装 make all make install make install-plugin make install-daemon make install-config make install-init这一步输出内容非常多,容易让人忽略隐含错误。我的习惯是用echo $?检查上一条命令的退出码,只要返回结果是0再继续往下走。四步install分别做了不同的事:install-daemon复制NRPE主程序,install-plugin复制监控插件脚手架,install-config生成默认配置样例,install-init注册系统服务脚本。缺哪个,后面的服务就可能起不来或者配置找不到。安装完成后,NRPE主程序路径一般在/usr/local/nrpe/bin/nrpe,插件目录则在/usr/local/nrpe/libexec下。可以用下面命令确认核心文件已经就位:ls -l /usr/local/nrpe/bin/nrpe ls -l /usr/local/nrpe/libexec/ | head3.3 第三步:配置nrpe.cfg配置NRPE,本质就是告诉守护进程三件事:监听哪个地址、允许谁来连接、开放哪些采集命令。默认配置模板在安装时已经生成,但内容比较杂,建议直接清理掉注释重写核心段。# /usr/local/nrpe/etc/nrpe.cfg # 监听本机所有接口,可根据需要指定内网IP server_address=0.0.0.0 # 关键安全项:只允许监控中心连接 allowed_hosts=127.0.0.1,192.168.10.10 # NRPE以独立进程模式运行时的端口 server_port=5666 # 守护进程运行身份 nrpe_user=nrpe nrpe_group=nrpe # 插件命令统一放这里,nginx等自定义命令往后追加 command[check_load]=/usr/local/nrpe/libexec/check_load -w 4,3,2 -c 6,5,4 command[check_disk]=/usr/local/nrpe/libexec/check_disk -w 20% -c 10% -p / command[check_users]=/usr/local/nrpe/libexec/check_users -w 10 -c 20 command[check_mem]=/usr/local/nrpe/libexec/check_mem -w 80% -c 90% command[check_swap]=/usr/local/nrpe/libexec/check_swap -w 50% -c 30%特别注意allowed_hosts的写法。多个地址之间用英文逗号分隔,不能有空格。曾经因为写成了192.168.10.10, 192.168.10.11多留了一个空格,NRPE启动时直接不识别后半段,导致另一台监控机器连不上。监控端调用的命令名以check_load、check_disk这类中括号里的标识符为准,不一定非得和插件文件名一致,但建议保持一致,排障时不容易绕晕。命令路径务必写绝对路径,因为NRPE进程环境里的PATH通常很简单,找不到插件是高频故障。3.4 第四步:启动NRPE守护进程安装时已经生成了init脚本,启动方式很直接:# 启动NRPE服务 service nrpe start # 或者 /usr/local/nrpe/bin/nrpe -c /usr/local/nrpe/etc/nrpe.cfg -d # 查看服务状态 ps -ef | grep nrpe ss -lntp | grep 5666-d参数表示daemonize,即让进程后台运行。如果看到5666端口有监听,说明守护进程已经起来了。防火墙这里是个高频隐患。KOS默认可能启用了firewalld,外部监控中心要访问这台机器的5666端口,需要放行:firewall-cmd --permanent --add-port=5666/tcp firewall-cmd --reload firewall-cmd --list-ports如果是在云环境或者公司内部有安全组策略的机房,还要在安全组/网络策略里同步放行这个端口,否则本地看到监听正常,但从监控中心就是连不上。3.5 第五步:验证NRPE本地与远程采集启动服务后,先在本机验证一次,排除自身问题再让监控端接入。NRPE自带一个测试工具check_nrpe,通常在监控服务端那边编译得到。我们在被监控机上也可以临时用NRPE源码包里的工具做个快速自测:# 在NRPE安装机器上自测 /usr/local/nrpe/libexec/check_nrpe -H 127.0.0.1正常返回结果是NRPE v3.2.1,表示协议握手成功。之后再测试具体的采集命令:# 在本机测试某个具体采集命令 /usr/local/nrpe/libexec/check_nrpe -H 127.0.0.1 -c check_load如果能返回类似OK - CPU load average这样的文本,说明NRPE能正确执行插件并把结果送回来。这也就是说,被监控端这一侧已经就绪了。3.6 第六步:服务端安装check_nrpe插件并配置命令被监控机上只装NRPE还不够,监控中心那边还需要一个check_nrpe插件充当“翻译员”。这个插件通常可以从Nagios插件库里获取,也可以直接用NRPE源码包里的src/check_nrpe.c编译。在监控服务端机器上,如果已经装过Nagios插件集,一般自带check_nrpe;没有的话,可以通过源码编译NRPE时顺带生成插件:# 在监控服务端解压同一个NRPE源码包,只编译check_nrpe工具 cd nrpe-3.2.1 make check_nrpe cp src/check_nrpe /usr/local/nagios/libexec/ chmod +x /usr/local/nagios/libexec/check_nrpe这样插件的路径就固定在了/usr/local/nagios/libexec/check_nrpe。接下来把NRPE命令注册给Nagios监控平台。以Nagios Core为例,在commands.cfg里定义check_nrpe命令:define command { command_name check_nrpe command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }然后在服务定义文件里引用它。假设我们要监控目标主机KOS-APP-01的磁盘、负载和内存使用情况:define service { host_name KOS-APP-01 service_description Check System Load check_command check_nrpe!check_load check_interval 5 retry_interval 1 max_check_attempts 3 contact_groups admins }这里的关键点是:check_command的第一个参数$ARG1$是NRPE配置里中括号中的命令名,也就是command[check_load]右边的标识符。监控端传什么值,NRPE就去执行对应的命令。3.7 自定义监控脚本如何接入NRPE的价值不局限于官方那十几个自带插件,自定义采集脚本接入也非常实用。比如我们要采集某个应用的连接数:在KOS机器上编写脚本/usr/local/nrpe/libexec/check_app_conn.sh,脚本用exit 0表示正常,exit 2表示异常,并输出一行结果文本。给脚本加执行权限:chmod +x /usr/local/nrpe/libexec/check_app_conn.sh在nrpe.cfg新增一行:command[check_app_conn]=/usr/local/nrpe/libexec/check_app_conn.sh -w 1000 -c 2000重启NRPE:service nrpe restart在监控端添加服务定义,check_command check_nrpe!check_app_conn这个套路几乎适配所有业务指标,只要你能用一行脚本输出“状态+文本+性能数据”。这样整套体系就从一个通用监控代理升级成业务侧的自定义采集框架了。3.8 监控平台对接配置的完整示例上面拆开讲了命令定义和服务定义,这里补一个完整的示例片段,方便直接参考修改。Nagios Core的commands.cfg追加:# NRPE remote check commands define command { command_name check_nrpe command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }Nagios Core的监控主机关联配置:define host { host_name KOS-APP-01 alias KOS Application Server address 192.168.10.25 check_command check-host-alive max_check_attempts 5 check_period 24x7 contact_groups admins notification_interval 60 notification_period 24x7 }Nagios Core的服务定义追加:define service { host_name KOS-APP-01 service_description CPU Load check_command check_nrpe!check_load check_interval 5 retry_interval 1 max_check_attempts 3 check_period 24x7 notification_interval 30 notification_period 24x7 } define service { host_name KOS-APP-01 service_description Disk Root check_command check_nrpe!check_disk check_interval 5 retry_interval 1 max_check_attempts 3 check_period 24x7 notification_interval 30 notification_period 24x7 }定义写好后,nagios -v /etc/nagios/nagios.cfg校验配置,没问题再重载:service nagios reload重载后过几分钟,Nagios界面里就能看到对应主机和服务的监控数据了。到这里,整条“监控中心 -> check_nrpe -> NRPE守护进程 -> 本地插件”的链路就完全打通了。4. 验证采集效果与常见问题排查4.1 从监控中心发起一次完整采集验证配置好之后,最快的验证方式是在监控中心机器上手动执行一次check_nrpe,模拟Nagios的每一次探测:/usr/local/nagios/libexec/check_nrpe -H 192.168.10.25 -c check_load如果返回OK - CPU load average: 0.08, 0.03, 0.01|load1=0.080;4.000;6.000;0;这类带性能数据的文本,说明链路完全通。再把-c换成check_disk、check_users逐一试一遍,HR看所有采集项都正常。另外一个值得注意的点是:Nagios界面里服务状态变绿只代表一次探测的返回值符合阈值定义,并不代表数据链路一直稳定。建议在对接初期把check_interval调成1分钟,观察一段时间确认无误后再恢复成5分钟或更长。4.2 常见问题速查表整套方案在实际部署中会遇到的问题,我整理成了一张速查表,基本覆盖了八成以上的故障场景:故障现象常见原因解决办法check_nrpe连接超时防火墙未放行5666端口放行端口,检查安全组策略连接被拒绝Connection refusedNRPE未启动或没监听启动服务,检查ss -lntpNRPE版本返回为空服务端与被控端协议不匹配确保双方使用NRPE 3.x版本UNKNOWN: No output from plugin命令路径写错,或插件未安装检查nrpe.cfg的command绝对路径配置了allowed_hosts仍被拒绝有逗号后面的空格,或多个IP未正确识别重写allowed_hosts,不要留空格SSL握手失败configure时未开启--with-ssl重新./configure加入SSL支持并重编译取到的数据为0或者空插件执行权限不足,脚本返回格式不对用nrpe用户手动执行脚本排查权限服务端检查配置报错Nagios配置语法错误,或命令定义缺失nagios -v校验配置文件还有一个容易被忽视的点:NRPE插件返回数据有时候在Nagios界面显示乱码或叹号,多数是插件输出文本编码问题。把插件里的中文提示改成纯英文输出,问题即消失。4.3 几个容易被忽略的坑第一,NRPE进程以nrpe用户运行时,对某些插件脚本可能没有执行权限。尤其是自己写的Shell脚本,如果在初始化代码里chmod 777或者放在root目录下,NRPE会执行失败。调试时可以先用su - nrpe -s /bin/bash -c "插件路径"模拟执行,看返回什么。第二,被监控主机的时钟漂移对监控平台影响很大。如果目标服务器时间和监控中心偏差太大,Nagios可能判定主机不可达,或者报警时间错乱。建议在KOS机器上配置NTP时钟同步,这虽然不是NRPE本身的职责,但监控数据的时间戳是否可信直接决定这套方案是否真正可靠。第三,command[check_mem]这类自定义命令依赖额外的内存监控插件,默认的NRPE安装包里可能根本没有check_mem插件。如果照抄网上配置后发现返回No output from plugin,先去/usr/local/nrpe/libexec/里确认对应插件文件是否存在,缺了就去插件库下载对应脚本放进去。第四,KOS自带防火墙如果开启了SELinux,也可能拦截NRPE的端口绑定。遇到启动正常但外部连不上,查一下SELinux状态:getenforce # 如果是Enforcing,临时调整策略或放行nrpe相关端口 setsebool -P nis_enabled 1这些坑单独看都很小,但任何一处卡住都会让人反复怀疑是前面的步骤做错了。4.4 性能与维护心得NRPE是典型的轻量级守护进程,常驻内存占用通常在几MB到十几MB之间,对业务服务器影响可以忽略不计。即便你在一台机器上定义了三四十个监控命令,也只在监控中心执行探测那一瞬间才有CPU开销,平时几乎无负载。维护层面的最大心得是:NRPE的配置变更需要重启进程才能生效,重启动作非常轻,不会中断业务。我的建议是每次改完nrpe.cfg后,做一个最小动作验证:# 使用内置语法检查 /usr/local/nrpe/bin/nrpe -c /usr/local/nrpe/etc/nrpe.cfg -t # 重载服务 service nrpe restart # 验证监听还在 ss -lntp | grep 5666-t参数只解析配置文件、不启动守护进程,配置有没有语法问题一目了然。比直接重启服务更安全,尤其适合写自定义命令比较多的场景。另外,把NRPE的配置和自定义脚本纳入版本管理是相当值得的投入。我们这边把所有KOS服务器的nrpe.cfg以及额外脚本放在一个专用Gitea仓库里,哪台机器配置漂移了,对比一下历史记录很快就能定位。像“监控盲区”这种问题,本质上不是某个单点故障,而是配置管理没跟上机器增量的节奏。NRPE只能解决采集通道问题,要让监控长期不出现盲区,配置的标准化和版本化才是治本的办法。以我这次在KOS上实际部署NRPE-3.2.1-8的感受来说,这套组合非常适合已有Nagios监控体系、又需要快速纳管新主机的场景。它没有引入额外重量级组件,也没有复杂的集群概念,填平盲区几乎是“装代理、写配置、定义服务”三步走。尤其当你面对几十台新主机批量纳入监控时,把安装命令和配置片段固化成一个脚本,配合合法主机名列表批量执行,不到半天就能把几十台机器的监控补全。最大的收获其实不是那条从监控中心到目标主机的连通链路,而是对每台机器资源状况的掌控感。等你也经历过一次磁盘打满前收到告警的体验,就会明白这个看似基础的能力到底有多重要。
告别监控盲区!KeyarchOS安装nrpe-3.2.1-8,远程主机指标采集开箱即用监控盲区这四个字,伺候过大规模服务器的同学应该都懂。你辛辛苦苦把监控平台搭起来,CPU、内存、磁盘看个一目了然,偏偏到了某些非标准部署、临时扩容或者新接入的机器上,监控数据就是不出现,机房那边报“服务器负载高”,你这边图上一片空白,只能靠SSH上去敲命令碰运气。前阵子我们这边处理一批新上线的KOS服务器,就碰到了同样的问题。最终让我把监控盲区彻底填平的,是NRPE 3.2.1-8这套远程指标采集方案。NRPE全称是Nagios Remote Plugin Executor,说人话就是一套监控代理:它在被监控主机上驻留一个轻量守护进程,外部监控中心通过check_nrpe插件发指令给它,它再调本地插件把CPU、内存、磁盘、进程数这些指标取回来回传。整个过程不要求被监控机器上装完整监控平台,也不用打开一堆额外端口,只要能跑一个Agent就够了。这篇就记录一下我在KOS上从零装好NRPE、配置出有效监控数据的完整过程,包括踩过的坑、验证方法和监控端对接配置,希望可以帮你绕开那些文档里根本不会写的细节。1. 项目背景与监控痛点1.1 当我们说“监控盲区”时,到底指什么所谓“监控盲区”,可以理解为监控平台对某台主机完全无感知的状态。举个例子,某公司有一套运行多年的应用集群,监控端一直沿用Nagios体系,绝大多数节点都纳管得很好。但新来的那批KOS服务器因为上架时间紧、又赶上架构调整,一直没有纳入监控体系。表面上看服务器在正常跑业务,实际上内存快耗尽、磁盘即将打满、进程数量异常飙升这些隐患,监控平台一概不知道。等业务同事反馈“这台机器好卡”的时候,再上去看往往已经晚了。在这种情况下,给每台机器补一个轻量级采集代理,是成本最低、见效最快的方案。NRPE正好就是这个角色。它只负责“被监控端指标的采集与回传”,不承担告警判定和数据存储,把采集能力补齐,监控平台原有的告警策略就能立刻生效。这个定位非常清晰,也比较稳妥地解决了“不想为监控改造业务机器,但又要看到数据”的矛盾。1.2 为什么选NRPE而不是其他采集方式现在远程指标采集的方案并不少,常见的有SNMP、Agent模式、SSH远程执行,还有各类商业Agent。我在KOS上选NRPE,主要基于四点考虑。方案资源占用部署复杂度可定制性与现有监控平台契合度SNMP较低中,需要配置MIB和告警映射一般需要改监控逻辑远程SSH执行无Agent低,但频繁拉起SSH会话高对监控端压力大,易触发安全策略NRPE Agent很低低,单个守护进程高,可自由扩展命令与Nagios/兼容平台原生契合商业Agent中等中高,依赖专有控制面受厂商限制需要额外平台支撑对大多数内部运维场景来说,NKOS服务器数目一般不会到几十台上百台那种规模,SNMP的监控映射表反而成了负担;SSH方式则在网络策略严格的环境里经常被堡垒机拦下来。NRPE只占用一个5666端口,配置也简单,且完全兼容我们正在用的监控平台,所以最终选了它。这个选择还有一个隐性好处:NRPE插件返回的都是纯文本格式,比如OK - CPU load average: 0.20, 0.15, 0.10|load1=0.200;4.000;6.000;0;这种,监控端可以直接解析性能数据,无需额外开发适配层。后面你会看到,这一步能省下大把时间。2. 环境准备与安装前置知识2.1 KOS下需要准备的依赖清单NRPE虽然叫“代理”,但它本质上一个C编写的守护进程加一组二进制插件集合。编译安装前需要确认系统里有几个基础组件。我在KOS上实测,重点检查的是gcc、make、openssl及其开发头文件。# 检查基础编译环境 gcc --version make --version # 检查OpenSSL开发库 rpm -qa | grep openssl-devel # 如果缺少,使用系统包管理器补齐 yum install -y gcc glibc glibc-common make openssl-devel很多人在编译NRPE时卡住,报openssl/ssl.h: No such file or directory,就是漏装了openssl-devel。这个头文件包和命令行的openssl并不是一回事,命令行客户端装了不代表开发头文件也齐了,务必单独确认。另外,因为监控中心与NRPE通信时会用到SSL加密,KOS自带的OpenSSL版本一般都能直接满足NRPE 3.2.1-8的编译需求,不用额外升级。2.2 两种安装方式怎么选:rpm包与源码编译根据标题里的版本号“nrpe-3.2.1-8”,不少KOS软件源里可能已经收录了对应的rpm包。优先建议先查一下:# 优先尝试软件源安装 yum list nrpe yum info nrpe如果仓库里确实有现成的nrpe-3.2.1-8,直接yum install -y nrpe也是最省事的路径,依赖关系由包管理器自动处理,装完就能用。不过实际环境里经常会碰到软件源没有这个包、或者版本偏旧、或者需要自己指定编译参数的情况,这时候就得走源码编译。源码编译的好处在于:可以自己控制安装路径、指定插件目录、调整SSL参数,而且不污染系统原有的包管理状态。缺点是要手动处理依赖。考虑到不少内网环境的软件源同步并不及时,我最终选择的是源码编译,下面完整记录的就是这条路径。2.3 源码包几个关键编译参数的含义NRPE源码编译的核心命令是./configure,不是每项参数都要动,但有几个必须弄明白:./configure \ --prefix=/usr/local/nrpe \ # NRPE安装根目录 --with-nagios-user=nrpe \ # 守护进程运行用户 --with-nagios-group=nrpe \ # 守护进程运行用户组 --with-ssl \ # 启用SSL加密传输 --with-ssl-lib=/usr/lib64 \ --enable-command-args \ # 允许监控端传入参数 --with-ssl-inc=/usr/include/openssl--enable-command-args这一项特别重要。如果不加,监控端调用某个NRPE命令时不能附带额外参数,灵活性会大打折扣。虽然安全上会有一定风险,但在内网监控环境里,这个开关的便利性远大于风险。处理办法是把allowed_hosts严格限定为监控中心服务器的IP,而不是开给全网段。3. NRPE安装与配置实操3.1 第一步:准备专用账号并下载源码包安全配置的第一原则就是:运行服务用的账号权限越小越好。NRPE官方文档也推荐创建专用账号,而不是用root直接跑守护进程。采集指标的过程中会执行一些本地脚本,虽然某些插件确实需要读系统文件,但绝大多数场景下普通用户权限就够用了。# 创建专用运行账号 useradd -r -s /sbin/nologin nrpe这里用了-r创建系统账号,-s /sbin/nologin则防止该账号被用于交互登录。即使NRPE被利用,攻击者能拿到的也是一个受限shell,降低风险。源码包可以从NRPE官网或镜像站下载,注意选择nrpe-3.2.1.tar.gz这个稳定版本。下载后务必做两项检查:一是校验文件的SHA256值是否与官方公布一致,防止下载过程被篡改;二是确认源码包完整性,解压后能看到configure脚本才可以继续。# 下载并解压源码包 wget https://github.com/NagiosEnterprises/nrpe/releases/download/nrpe-3.2.1-8/nrpe-3.2.1.tar.gz sha256sum nrpe-3.2.1.tar.gz tar -xzf nrpe-3.2.1.tar.gz cd nrpe-3.2.13.2 第二步:编译安装NRPE环境确认无误后,执行配置和编译。建议在./configure之后先看一眼输出摘要,确认SSL和Command Args都处于enabled状态,再进行下一步。# 生成Makefile ./configure \ --prefix=/usr/local/nrpe \ --with-nagios-user=nrpe \ --with-nagios-group=nrpe \ --with-ssl \ --with-ssl-lib=/usr/lib64 \ --with-ssl-inc=/usr/include/openssl \ --enable-command-args # 编译并安装 make all make install make install-plugin make install-daemon make install-config make install-init这一步输出内容非常多,容易让人忽略隐含错误。我的习惯是用echo $?检查上一条命令的退出码,只要返回结果是0再继续往下走。四步install分别做了不同的事:install-daemon复制NRPE主程序,install-plugin复制监控插件脚手架,install-config生成默认配置样例,install-init注册系统服务脚本。缺哪个,后面的服务就可能起不来或者配置找不到。安装完成后,NRPE主程序路径一般在/usr/local/nrpe/bin/nrpe,插件目录则在/usr/local/nrpe/libexec下。可以用下面命令确认核心文件已经就位:ls -l /usr/local/nrpe/bin/nrpe ls -l /usr/local/nrpe/libexec/ | head3.3 第三步:配置nrpe.cfg配置NRPE,本质就是告诉守护进程三件事:监听哪个地址、允许谁来连接、开放哪些采集命令。默认配置模板在安装时已经生成,但内容比较杂,建议直接清理掉注释重写核心段。# /usr/local/nrpe/etc/nrpe.cfg # 监听本机所有接口,可根据需要指定内网IP server_address=0.0.0.0 # 关键安全项:只允许监控中心连接 allowed_hosts=127.0.0.1,192.168.10.10 # NRPE以独立进程模式运行时的端口 server_port=5666 # 守护进程运行身份 nrpe_user=nrpe nrpe_group=nrpe # 插件命令统一放这里,nginx等自定义命令往后追加 command[check_load]=/usr/local/nrpe/libexec/check_load -w 4,3,2 -c 6,5,4 command[check_disk]=/usr/local/nrpe/libexec/check_disk -w 20% -c 10% -p / command[check_users]=/usr/local/nrpe/libexec/check_users -w 10 -c 20 command[check_mem]=/usr/local/nrpe/libexec/check_mem -w 80% -c 90% command[check_swap]=/usr/local/nrpe/libexec/check_swap -w 50% -c 30%特别注意allowed_hosts的写法。多个地址之间用英文逗号分隔,不能有空格。曾经因为写成了192.168.10.10, 192.168.10.11多留了一个空格,NRPE启动时直接不识别后半段,导致另一台监控机器连不上。监控端调用的命令名以check_load、check_disk这类中括号里的标识符为准,不一定非得和插件文件名一致,但建议保持一致,排障时不容易绕晕。命令路径务必写绝对路径,因为NRPE进程环境里的PATH通常很简单,找不到插件是高频故障。3.4 第四步:启动NRPE守护进程安装时已经生成了init脚本,启动方式很直接:# 启动NRPE服务 service nrpe start # 或者 /usr/local/nrpe/bin/nrpe -c /usr/local/nrpe/etc/nrpe.cfg -d # 查看服务状态 ps -ef | grep nrpe ss -lntp | grep 5666-d参数表示daemonize,即让进程后台运行。如果看到5666端口有监听,说明守护进程已经起来了。防火墙这里是个高频隐患。KOS默认可能启用了firewalld,外部监控中心要访问这台机器的5666端口,需要放行:firewall-cmd --permanent --add-port=5666/tcp firewall-cmd --reload firewall-cmd --list-ports如果是在云环境或者公司内部有安全组策略的机房,还要在安全组/网络策略里同步放行这个端口,否则本地看到监听正常,但从监控中心就是连不上。3.5 第五步:验证NRPE本地与远程采集启动服务后,先在本机验证一次,排除自身问题再让监控端接入。NRPE自带一个测试工具check_nrpe,通常在监控服务端那边编译得到。我们在被监控机上也可以临时用NRPE源码包里的工具做个快速自测:# 在NRPE安装机器上自测 /usr/local/nrpe/libexec/check_nrpe -H 127.0.0.1正常返回结果是NRPE v3.2.1,表示协议握手成功。之后再测试具体的采集命令:# 在本机测试某个具体采集命令 /usr/local/nrpe/libexec/check_nrpe -H 127.0.0.1 -c check_load如果能返回类似OK - CPU load average这样的文本,说明NRPE能正确执行插件并把结果送回来。这也就是说,被监控端这一侧已经就绪了。3.6 第六步:服务端安装check_nrpe插件并配置命令被监控机上只装NRPE还不够,监控中心那边还需要一个check_nrpe插件充当“翻译员”。这个插件通常可以从Nagios插件库里获取,也可以直接用NRPE源码包里的src/check_nrpe.c编译。在监控服务端机器上,如果已经装过Nagios插件集,一般自带check_nrpe;没有的话,可以通过源码编译NRPE时顺带生成插件:# 在监控服务端解压同一个NRPE源码包,只编译check_nrpe工具 cd nrpe-3.2.1 make check_nrpe cp src/check_nrpe /usr/local/nagios/libexec/ chmod +x /usr/local/nagios/libexec/check_nrpe这样插件的路径就固定在了/usr/local/nagios/libexec/check_nrpe。接下来把NRPE命令注册给Nagios监控平台。以Nagios Core为例,在commands.cfg里定义check_nrpe命令:define command { command_name check_nrpe command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }然后在服务定义文件里引用它。假设我们要监控目标主机KOS-APP-01的磁盘、负载和内存使用情况:define service { host_name KOS-APP-01 service_description Check System Load check_command check_nrpe!check_load check_interval 5 retry_interval 1 max_check_attempts 3 contact_groups admins }这里的关键点是:check_command的第一个参数$ARG1$是NRPE配置里中括号中的命令名,也就是command[check_load]右边的标识符。监控端传什么值,NRPE就去执行对应的命令。3.7 自定义监控脚本如何接入NRPE的价值不局限于官方那十几个自带插件,自定义采集脚本接入也非常实用。比如我们要采集某个应用的连接数:在KOS机器上编写脚本/usr/local/nrpe/libexec/check_app_conn.sh,脚本用exit 0表示正常,exit 2表示异常,并输出一行结果文本。给脚本加执行权限:chmod +x /usr/local/nrpe/libexec/check_app_conn.sh在nrpe.cfg新增一行:command[check_app_conn]=/usr/local/nrpe/libexec/check_app_conn.sh -w 1000 -c 2000重启NRPE:service nrpe restart在监控端添加服务定义,check_command check_nrpe!check_app_conn这个套路几乎适配所有业务指标,只要你能用一行脚本输出“状态+文本+性能数据”。这样整套体系就从一个通用监控代理升级成业务侧的自定义采集框架了。3.8 监控平台对接配置的完整示例上面拆开讲了命令定义和服务定义,这里补一个完整的示例片段,方便直接参考修改。Nagios Core的commands.cfg追加:# NRPE remote check commands define command { command_name check_nrpe command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ }Nagios Core的监控主机关联配置:define host { host_name KOS-APP-01 alias KOS Application Server address 192.168.10.25 check_command check-host-alive max_check_attempts 5 check_period 24x7 contact_groups admins notification_interval 60 notification_period 24x7 }Nagios Core的服务定义追加:define service { host_name KOS-APP-01 service_description CPU Load check_command check_nrpe!check_load check_interval 5 retry_interval 1 max_check_attempts 3 check_period 24x7 notification_interval 30 notification_period 24x7 } define service { host_name KOS-APP-01 service_description Disk Root check_command check_nrpe!check_disk check_interval 5 retry_interval 1 max_check_attempts 3 check_period 24x7 notification_interval 30 notification_period 24x7 }定义写好后,nagios -v /etc/nagios/nagios.cfg校验配置,没问题再重载:service nagios reload重载后过几分钟,Nagios界面里就能看到对应主机和服务的监控数据了。到这里,整条“监控中心 -> check_nrpe -> NRPE守护进程 -> 本地插件”的链路就完全打通了。4. 验证采集效果与常见问题排查4.1 从监控中心发起一次完整采集验证配置好之后,最快的验证方式是在监控中心机器上手动执行一次check_nrpe,模拟Nagios的每一次探测:/usr/local/nagios/libexec/check_nrpe -H 192.168.10.25 -c check_load如果返回OK - CPU load average: 0.08, 0.03, 0.01|load1=0.080;4.000;6.000;0;这类带性能数据的文本,说明链路完全通。再把-c换成check_disk、check_users逐一试一遍,HR看所有采集项都正常。另外一个值得注意的点是:Nagios界面里服务状态变绿只代表一次探测的返回值符合阈值定义,并不代表数据链路一直稳定。建议在对接初期把check_interval调成1分钟,观察一段时间确认无误后再恢复成5分钟或更长。4.2 常见问题速查表整套方案在实际部署中会遇到的问题,我整理成了一张速查表,基本覆盖了八成以上的故障场景:故障现象常见原因解决办法check_nrpe连接超时防火墙未放行5666端口放行端口,检查安全组策略连接被拒绝Connection refusedNRPE未启动或没监听启动服务,检查ss -lntpNRPE版本返回为空服务端与被控端协议不匹配确保双方使用NRPE 3.x版本UNKNOWN: No output from plugin命令路径写错,或插件未安装检查nrpe.cfg的command绝对路径配置了allowed_hosts仍被拒绝有逗号后面的空格,或多个IP未正确识别重写allowed_hosts,不要留空格SSL握手失败configure时未开启--with-ssl重新./configure加入SSL支持并重编译取到的数据为0或者空插件执行权限不足,脚本返回格式不对用nrpe用户手动执行脚本排查权限服务端检查配置报错Nagios配置语法错误,或命令定义缺失nagios -v校验配置文件还有一个容易被忽视的点:NRPE插件返回数据有时候在Nagios界面显示乱码或叹号,多数是插件输出文本编码问题。把插件里的中文提示改成纯英文输出,问题即消失。4.3 几个容易被忽略的坑第一,NRPE进程以nrpe用户运行时,对某些插件脚本可能没有执行权限。尤其是自己写的Shell脚本,如果在初始化代码里chmod 777或者放在root目录下,NRPE会执行失败。调试时可以先用su - nrpe -s /bin/bash -c "插件路径"模拟执行,看返回什么。第二,被监控主机的时钟漂移对监控平台影响很大。如果目标服务器时间和监控中心偏差太大,Nagios可能判定主机不可达,或者报警时间错乱。建议在KOS机器上配置NTP时钟同步,这虽然不是NRPE本身的职责,但监控数据的时间戳是否可信直接决定这套方案是否真正可靠。第三,command[check_mem]这类自定义命令依赖额外的内存监控插件,默认的NRPE安装包里可能根本没有check_mem插件。如果照抄网上配置后发现返回No output from plugin,先去/usr/local/nrpe/libexec/里确认对应插件文件是否存在,缺了就去插件库下载对应脚本放进去。第四,KOS自带防火墙如果开启了SELinux,也可能拦截NRPE的端口绑定。遇到启动正常但外部连不上,查一下SELinux状态:getenforce # 如果是Enforcing,临时调整策略或放行nrpe相关端口 setsebool -P nis_enabled 1这些坑单独看都很小,但任何一处卡住都会让人反复怀疑是前面的步骤做错了。4.4 性能与维护心得NRPE是典型的轻量级守护进程,常驻内存占用通常在几MB到十几MB之间,对业务服务器影响可以忽略不计。即便你在一台机器上定义了三四十个监控命令,也只在监控中心执行探测那一瞬间才有CPU开销,平时几乎无负载。维护层面的最大心得是:NRPE的配置变更需要重启进程才能生效,重启动作非常轻,不会中断业务。我的建议是每次改完nrpe.cfg后,做一个最小动作验证:# 使用内置语法检查 /usr/local/nrpe/bin/nrpe -c /usr/local/nrpe/etc/nrpe.cfg -t # 重载服务 service nrpe restart # 验证监听还在 ss -lntp | grep 5666-t参数只解析配置文件、不启动守护进程,配置有没有语法问题一目了然。比直接重启服务更安全,尤其适合写自定义命令比较多的场景。另外,把NRPE的配置和自定义脚本纳入版本管理是相当值得的投入。我们这边把所有KOS服务器的nrpe.cfg以及额外脚本放在一个专用Gitea仓库里,哪台机器配置漂移了,对比一下历史记录很快就能定位。像“监控盲区”这种问题,本质上不是某个单点故障,而是配置管理没跟上机器增量的节奏。NRPE只能解决采集通道问题,要让监控长期不出现盲区,配置的标准化和版本化才是治本的办法。以我这次在KOS上实际部署NRPE-3.2.1-8的感受来说,这套组合非常适合已有Nagios监控体系、又需要快速纳管新主机的场景。它没有引入额外重量级组件,也没有复杂的集群概念,填平盲区几乎是“装代理、写配置、定义服务”三步走。尤其当你面对几十台新主机批量纳入监控时,把安装命令和配置片段固化成一个脚本,配合合法主机名列表批量执行,不到半天就能把几十台机器的监控补全。最大的收获其实不是那条从监控中心到目标主机的连通链路,而是对每台机器资源状况的掌控感。等你也经历过一次磁盘打满前收到告警的体验,就会明白这个看似基础的能力到底有多重要。