刚干弱电运维那会儿,最怕的就是半夜手机响。用户那边说“机房空调好像不转了”“摄像头全离线了”“门禁刷卡没反应”,你还得先判断是真故障还是误报,然后背着笔记本开车过去,到现场一测,往往是早就坏了的设备因为没人盯才拖成了紧急事件。干这行久了你就会发现,弱电运维最大的需求根本不是修设备,而是“早点知道哪里不正常”。
这篇文章要聊的就是这么一套东西:一台普通的Linux服务器,装上开源监控软件,把摄像头NVR、门禁控制器、网络交换机、UPS、机房温湿度全部纳入统一监控,设备离线、负载过高、温度越线、电池低压,全都自动推送到手机。我自己在几个项目上用的主力组合是Zabbix加Grafana,整套软件免费,部署也简单,很适合做不了大预算商业平台的弱电项目。如果你也是每天跑现场、靠用户报障才知道出问题的运维人员,这套方案值得花半小时看看。
1. 先盘清楚弱电运维到底在监控什么
1.1 弱电运维的设备清单与监控需求
很多人一提到弱电运维,脑子里浮现的就是“拉网线、装摄像头、刷卡门禁”。真干起来才会发现,弱电系统的设备种类远比想象中杂。
我经手的项目里,最典型的弱电机房通常包含这么几类设备:网络部分有核心交换机、接入交换机、路由器和防火墙;安防部分有NVR、摄像头、门禁控制器、报警主机;基础环境部分有UPS、精密空调或普通空调,还有温湿度传感器。这些设备分布在办公楼的不同楼层、园区的好几栋楼里,有的甚至跨了几个物理位置。数量不大,但位置分散,而且很多没有专门的网管软件,平时全靠人工巡检和用户反馈。
监控需求其实也很直白,就三个层次。
第一个层次是“在不在线”。NVR是否离线、门禁控制器能否ping通、交换机的某个端口是否down了、UPS是否还在正常输出。这些属于最基础的存活监控,但恰恰是弱电故障里最影响用户体验的部分。摄像头黑屏、门禁刷不了卡,用户第一时间就能感知到,等你接到报障往往已经过去几个小时。
第二个层次是“指标是否正常”。交换机的CPU和内存使用率、端口流量是否突然飙高、UPS的电池电量下降到什么程度、机房温湿度是否在合理范围。这些指标不像在线状态那么直观,但它们往往是故障的前兆。UPS电池电压一路走低,接下来可能就是机房断电;交换机CPU持续高负载,下一步可能就是整个网络卡死。
第三个层次是“变化趋势和联动”。白天办公高峰期的网络流量大概多少,晚上值守时段的温湿度波动有多大,这些历史数据看着不起眼,但在排查“为什么这个月电费涨了”或者“冰箱冷柜为什么反复停机”这类问题时会非常有用。Zabbix自带的趋势存储功能,天然就是为这类需求准备的。
1.2 为什么我最终选择开源Linux监控方案
弱电项目里常见的监控方案有两种:商业网管平台和开源监控软件。商业平台不是不好,Splunk、SolarWinds、国内一些厂商的网管系统我都接触过,功能确实完整,开箱即用,但拿到弱电项目里往往有三个过不去的坎。
一是价格。商业平台大多按设备数量或IP数量授权,一套下来几十个点位的费用可能就顶得上一个弱电小项目的利润。业主那边预算卡得紧,方案写上去基本就是陪跑。
二是协议封闭。弱电项目里总有那么几台设备是“有点怪”的,可能是某品牌的老旧NVR,也可能是定制过的门禁控制器。商业平台对主流的SNMP设备、Windows服务器监控得很好,但遇到非标设备想加指标,就得看厂商愿不愿意帮你做定制,流程长、响应慢。
三是部署环境。商业平台通常要求独立服务器、专用数据库,甚至有自己的一套操作系统依赖。弱电机房的环境大家都懂,很多项目就是一台工控机或者一台淘汰下来的PC做管理服务器,你让它跑厚重的商业平台实在勉为其难。
开源Linux监控方案的好处正好对应以上三个问题:免费,整个软件栈不用花一分钱授权费;开放,只要设备能提供数据,不管是SNMP、PING、HTTP还是自定义脚本,都能接入;轻量,一台2核4G的机器跑Zabbix加Grafana,同时监控几百个点位完全没压力。
1.3 主力选型:Zabbix负责采集,Grafana负责展示
开源监控软件不是只有一款,我一开始也纠结过。Nagios、Prometheus、Zabbix、Grafana,各有各的长处,但放在弱电运维这个具体场景下,我的结论很明确:采集端用Zabbix,展示端用Grafana,Prometheus作为可选补充。
| 监控平台 | 弱电场景优势 | 弱电场景短板 |
|---|---|---|
| Zabbix | 自带SNMP、ICMP、Agent多种采集方式,模板丰富,中文资料多,适合非开发背景的运维 | 界面偏传统,出图不够美观 |
| Prometheus | 指标模型先进,拉取式采集适合云原生环境 | 原生不支持SNMP和简单PING,需要额外Exporter,非标设备接入门槛高 |
| Nagios | 配置文件逻辑清晰,插件机制灵活 | 界面老化,配置门槛较高,新手上手慢 |
| Grafana | 仪表盘极其漂亮,适合做数据展示大屏 | 只做展示,本身不采集数据,需要配合数据源 |
Zabbix在弱电场景里最打动我的一点是“模板化思路”。官方模板库里能直接找到针对常见网络设备、UPS、温湿度的监控模板,导入即用,不用自己从零造轮子。而且Zabbix的自动发现功能很强,你把一个网段丢给它,它能自动扫出设备、套用模板、开始采集,这在设备数量多的园区项目里能省下大量手工配置时间。
Grafana则是用来解决“给领导汇报”这件事的。Zabbix虽然能画图,但风格偏工程化;Grafana把数据接进来之后,色彩、布局、刷新频率都更像专业大屏。我一般是让Zabbix在后台老老实实采集和告警,Grafana专门做可视化页面,投到机房门口的电视屏上,效果非常好。
2. 半小时部署一套Linux监控环境
2.1 硬件要求与系统准备
先说硬件。Zabbix Server本身并不吃配置,监控点位在500个以内、采集间隔适当拉长的情况下,一台2核CPU、4GB内存的机器就能跑得很稳。如果是纯虚拟机,也可以;存储上建议给/var/lib/mysql单独分个区,因为历史数据会慢慢变大,单独分区方便后续扩容和备份。
我实际部署时用的是Ubuntu Server 22.04 LTS,Rocky Linux 9也完全可以,看个人习惯。安装完系统后第一件事是设好静态IP,然后确保这台服务器的防火墙放行必要端口。Zabbix Server默认监听10051端口,Web前端通过Nginx或Apache提供服务,常用8080端口,Zabbix Agent默认监听10050端口。如果你的监控服务器和弱电设备在同一个内网,直接通就行,跨网段的话要提前在交换机上做ACL放行。
2.2 用官方仓库装好Zabbix Server
部署Zabbix优先用官方仓库,因为软件包更新及时,依赖关系也处理得很好。以Ubuntu 22.04、Zabbix 6.4为例,安装过程主要是几条命令的事。
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_6.4+ubuntu22.04_all.deb dpkg -i zabbix-release_latest_6.4+ubuntu22.04_all.deb apt update apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent这里有个细节值得说明:Zabbix的数据默认存在MySQL/MariaDB里,装好之后要手动建库、建用户、导入初始Schema。直接用root操作即可,但在生产环境建议单独建一个zabbix账号,密码不要用默认的。
mysql -uroot -p create database zabbix character set utf8mb4 collate utf8mb4_bin; create user zabbix@localhost identified by '你的密码'; grant all privileges on zabbix.* to zabbix@localhost; set global log_bin_trust_function_creators = 1; quit;然后导入初始数据:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix导入完成后,把数据库密码写进Zabbix Server的配置文件里。
vim /etc/zabbix/zabbix_server.conf # 找到 DBPassword 这一行,改成刚才设置的密码然后启动服务:
systemctl restart zabbix-server zabbix-agent systemctl enable zabbix-server zabbix-agent2.3 初始化设置:改密码、调时区、配数据库
安装完成后,打开浏览器访问 http://你的服务器IP:8080,会看到Zabbix的Web安装向导,按提示填上数据库信息,走到最后一步就能登录了。默认账号是Admin,默认密码是zabbix,登录后第一件事就是把密码换掉,这个真的不要偷懒。
初始化阶段还有两个地方容易被忽略。
第一个是时区。Zabbix Web界面右上角的用户头像菜单里,点“User settings”,把时区改成Asia/Shanghai,不然后面看的告警时间和手机通知时间对不上,排查故障时时间线都错乱了。
第二个是PHP的时区配置。如果Zabbix页面提示时区未设置,需要修改/etc/zabbix/nginx.conf或者PHP-FPM的配置,加上date.timezone = Asia/Shanghai,然后重启Nginx和PHP-FPM。这个问题在全新安装时特别常见,装完顺手做了能省后面很多麻烦。
2.4 装个Grafana把监控大屏弄漂亮点
Zabbix自带的图形功能能用,但样子确实比较工程化。给客户汇报故障处理情况时,一屏五颜六色、图例清晰的数据面板带来的信任感,跟一屏密密麻麻的折线图完全不一样。所以我第二件事就是装Grafana。
Grafana安装很简单,直接用官方仓库:
apt install -y software-properties-common add-apt-repository "deb https://packages.grafana.com/oss/deb stable main" apt update apt install -y grafana systemctl enable grafana-server systemctl start grafana-server装好之后,在Grafana里添加数据源,类型选Zabbix,填上Zabbix Server的地址、API地址和登录账号。Zabbix提供了官方插件,装好后你在Grafana里就能直接选择Zabbix中已有的主机、监控项,拖拽生成仪表盘,不用再手动写查询语句。这一步做完,整个监控体系就有了一个像样的“门面”。
3. 把弱电设备接进监控的三类主流方法
3.1 有网管口的设备:用SNMP统一采集
弱电项目里的网络交换机、路由器、UPS,大多支持SNMP协议。SNMP简单理解就是设备内置了一个“数据报表接口”,你用监控软件去读取这个接口上的信息,就能拿到CPU利用率、内存使用率、端口状态、UPS剩余电量这些指标。
配置SNMP监控时,我一般分四步走。
第一步,在设备上开启SNMP。不同品牌设备的配置方式不一样,但基本都是设一个“读社区字符串”,默认通常是public。这里我给个建议:别用默认public,项目里所有设备改成自定义字符串,避免隔壁网段的设备被别人扫出来。改成什么不重要,重要的是不要全网一个默认口令。
第二步,用snmpwalk命令验证一下。在监控服务器上执行:
snmpwalk -v2c -c 你的社区字符串 192.168.10.1 system如果返回了一堆类似SNMPv2-MIB::sysDescr的信息,说明设备和监控服务器之间的SNMP通道是通的。如果提示timeout,就要检查IP地址、VLAN路由、防火墙UDP 161端口。
第三步,在Zabbix里创建主机。主机名建议用实物标签一致的名字,比如“SW-CORE-1F”“NVR-3F-B”,方便后续告警时快速定位设备位置。IP地址填设备管理IP,添加SNMP接口,端口默认161。
第四步,关联模板。Zabbix自带很多常用模板,网络设备可以选“Generic by SNMP”,UPS可以选“UPS by SNMP”,温湿度传感器可以选“Temperature and Humidity by SNMP”。添加模板之后,Zabbix会自动创建一批监控项和触发器,基本上不用再手动逐条配置。
3.2 不支持SNMP的设备:用Ping方式盯在线状态
弱电项目里不是所有设备都支持SNMP。有些老款NVR、门禁控制器、IP广播终端,厂家压根没开放SNMP功能,你能得到的探测手段只有一个——Ping。这种情况很常见,处理方式也没什么高深的,就是用Zabbix的“简单检查”里的ICMP Ping监控项。
在Zabbix里新建主机时,“类型”选择“Zabbix agent(被动)”,但其实我们并不会真的去装Agent,而是手动加一个监控项。键值选择“icmpping”,参数填目标设备的IP地址。这个监控项每秒返回1或0,分别表示通和不通。
关键点是别直接用这个键值做触发器。因为网络抖动可能只是几个包丢了,设备不一定真离线。我习惯的做法是加一个基于聚合的触发器,比如连续5分钟都ping不通才确认故障。触发器表达式可以写成:
max(/设备名/icmpping,#3)=0意思是最近3次检测结果都是0(不通)才触发告警。这个“连续几次”的阈值在弱电场景下很实用,能过滤掉一大半误报。
用Ping监控的另一个好处是不用改设备任何配置,只要网络能通就行。我在项目里甚至用这个方法监控了一些IP摄像头、门禁读卡器的控制器,反正只要它能响应Ping,我就能掌握它的在线状态。
3.3 门禁、温湿度、NVR这类设备:写脚本解决
弱电设备最让人头疼的是“非标”。门禁控制器的厂家很多,通讯协议五花八门,有的支持Modbus TCP,有的只提供私有API,还有的干脆啥也不提供,就一个网页管理后台。这时候,唯一靠谱的办法就是写脚本。
Zabbix提供几种扩展采集方式,我经常用的有两个。
一个是“外部检查”。就是Zabbix Server周期性执行服务器上的某个脚本,把脚本输出作为监控结果。比如我写过这样的脚本,用来检测某品牌门禁控制器的在线状态,因为它的管理端口是443,但实际用普通Ping有时候会被设备自身的防火墙吞掉:
#!/bin/bash HOST=$1 PORT=$2 nc -z -w5 "$HOST" "$PORT" >/dev/null 2>&1 echo $?把这个脚本放到Zabbix Server的external scripts目录,然后在监控项配置里写:
dajin_online.sh["192.168.50.10", 443]返回0代表端口能通,1代表不通。触发器写:last(/门禁控制器/dajin_online.sh["192.168.50.10", 443])<>0。
另一个方式是“Zabbix Sender上报”。对于没法主动拉取的设备,在设备旁边放一台采集小盒子,或者复用已有的运维终端,让它周期性地执行采集命令,再把数据推给Zabbix Server。温湿度传感器就是这么做的,我用一个USB温湿度计接在Linux工控机上,写一段Python脚本定时读取数据,然后用zabbix_sender把数值发过去。
#!/usr/bin/env python3 import subprocess import tempfile # 伪代码示意,具体读取方式取决于传感器型号 temp = read_temp_from_usb() humidity = read_humidity_from_usb() subprocess.run(['zabbix_sender', '-z', '监控服务器IP', '-s', '机房温湿度', '-k', 'temp', '-o', str(temp)]) subprocess.run(['zabbix_sender', '-z', '监控服务器IP', '-s', '机房温湿度', '-k', 'humidity', '-o', str(humidity)])Zabbix Server那边,只要在监控项里对应地建好“temp”和“humidity”这两个键值,收到的数据就会自动存进数据库,画面和触发器都跟普通监控项一样用。这个方案的优点是你根本不用管设备支不支持SNMP,只要有办法读到数据,就能进监控。
3.4 自动发现规则:新设备接入自动进监控
弱电项目是动态的。今天这里装一台新摄像头,明天那里加一台门禁控制器,如果每次都要手动去Zabbix里建主机,运维就变成机械劳动了。Zabbix的自动发现功能能解决这个问题。
配置位置在“配置 → 动作 → 自动发现”,规则按网段来。比如我扫192.168.10.0/24这个网段,检测方式选SNMP,凡是返回了设备类型信息的,就自动加入主机,自动关联模板。这样只要设备接上网线、开了SNMP,Zabbix就会自动把它管起来。
不过自动发现也有一个要注意的地方:搞不好会把打印机、电脑、手机这些意料之外的终端全部扫进来,导致监控项数量爆炸。我一般只在明确划分的“弱电设备专用VLAN”里启用自动发现,办公网段坚决不这么干。
4. 告警通知配置:让监控真正帮你干活
4.1 告警媒介配置:邮件、企业微信机器人
监控采集到数据不是最终目的,把异常及时送到人手里才算闭环。Zabbix的告警媒介类型很多,邮件是最基础的,插件里有现成的SMTP媒介类型,填好邮件服务器地址和账号就能发。但说实话,在微信、钉钉都普及的今天,邮件告警的及时性已经不太够用了。更推荐用企业微信群机器人或者钉钉群机器人。
拿企业微信机器人举例。在群里添加一个机器人,会生成一个Webhook地址。你在Zabbix的“管理 → 报警媒介类型”里选择“企业微信”,然后把Webhook填进去。配置完成后,创建一个用户并关联这个媒介,就能在告警时把消息推到群里。
先用curl验证一下Webhook正常:
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你生成的key' \ -H 'Content-Type: application/json' \ -d '{"msgtype":"text","text":{"content":"Zabbix监控告警测试"}}'收到消息说明链路OK,就可以在Zabbix里配置告警动作了。
4.2 触发器表达式:几个可以直接抄作业的样例
Zabbix触发器表达式看起来有点吓人,其实套路固定。我把弱电项目里最常用的几个表达式列出来,直接复制改主机名就能用。
| 监控目标 | 触发器名称 | 表达式 |
|---|---|---|
| 设备离线(Ping) | PING不可达确认 | max(/设备名/icmpping,#3)=0 |
| UPS电池电量低 | UPS电池电量低于阈值 | last(/UPS名/ups.battery.charge.last())<20 |
| 机房温度过高 | 机房温度超过30℃ | last(/机房温湿度/temp)>30 |
| 交换机端口流量异常 | 入方向流量超过500Mbps | min(/交换机名/net.if.in[ifHCInOctets.1],5m)>500000 |
| 门禁控制器离线 | 门禁端口检测失败 | last(/门禁控制器/dajin_online.sh["192.168.50.10", 443])<>0 |
触发器写完之后一定要测试。Zabbix触发器可以设置“手动关闭/启用”,你可以故意停掉一台设备,看消息到底有没有发出来、内容是否清晰。这一步很多人偷懒跳过,结果真的出问题时才发现邮件根本没配好,那就完全失去意义了。
4.3 规避告警风暴:维护窗口与依赖关系
告警系统上线后,最让人崩溃的往往不是告警本身,而是“告警风暴”。举个例子:半夜机房空调故障导致温度升高,先是空调本身告警,然后UPS因为负载变化产生告警,接着网络交换机因为过热启动保护开始丢包,于是十几个摄像头联动离线,手机一个晚上响几十次。这些告警本质上是同一个根因引起的,但手机上看起来就像十几个故障同时发生。
规避告警风暴,我总结了三招。
第一招是设置维护窗口。在Zabbix的“配置 → 维护”里,可以指定某台设备或某个分组在特定时间段内不触发告警。我一般对夜间定期重启的设备、每季度检修的设备都提前设置维护窗口,检修期间的正常业务中断就不会刷屏。
第二招是设置依赖关系。Zabbix允许配置主机之间的依赖,比如某个摄像头的告警依赖于它接入的交换机的状态;如果交换机挂了,摄像头相关的告警就自动被抑制。这样根因设备告警,从属设备不重复报,排查起来一眼就能看到真正的问题源头。
第三招是区分告警级别。弱电设备的告警别全设成“严重”。比如UPS电池电量低设成“严重”,门禁控制器离线设成“警告”,温湿度偏离正常范围设成“一般”。不同级别对应不同的通知方式:严重告警直接推手机,警告告警只在工作时间内发邮件,一般告警只记录不上报。这样既能保证重要故障不遗漏,又不会被无关紧要的信息淹没。
5. 实战中踩过的坑与排障速查
5.1 SNMP采集不到数据的定位方法
SNMP采集不到数据,是接触Zabbix后最常遇到的第一个问题。我在项目里排查这个问题,基本按下面的顺序来。
先确认设备侧SNMP是否真的开启。很多网络设备默认SNMP是关闭的,尤其是一些国产品牌,需要登录Web管理界面手动勾选启用。这一条能排除掉一半以上的情况。
然后确认社区字符串是否正确。Zabbix里填的SNMP community,必须和设备端设置的一致,大小写敏感。用snmpwalk命令在监控服务器上直接访问一次,返回数据就是通的,返回timeout就要往下查。
接着查网络路径。SNMP走的是UDP 161端口,如果设备在不同VLAN,监控服务器跨VLAN访问时需要路由可达,并且交换机ACL没有阻断UDP 161。有些项目里安全人员会默认拦截非必要UDP端口,这一点经常被忽略。
最后才是查Zabbix配置。确认主机的SNMP接口IP没填错,模板确实关联上了,监控项没有被“禁用”状态。把Zabbix的日志打开:
tail -f /var/log/zabbix/zabbix_server.log然后去“监控 → 最新数据”里看这个监控项的值变化,哪里断了就修哪里。
5.2 有告警没数据:最容易被忽略的接口IP问题
有一次项目上线第二周,Zabbix突然开始报警,说某台NVR离线,但实际上去现场测试设备完全正常。排查了很久,最后发现是NVR主机在Zabbix里配了两个接口:一个Zabbix agent接口,一个SNMP接口。我填的SNMP接口IP是对的,但agent接口IP误填了另一个网段的地址。
Zabbix判断一个主机“离线”,依据的是该主机所有启用的接口中,只要有一个不可达就认为主机不可用。尤其当设备类型选的是“Zabbix agent(被动)”时,它会默认尝试连接10050端口,而这个端口在很多NVR上根本不开放,于是直接把主机状态判成了离线。
这个问题排查起来很烦,但预防很简单:你在新建主机时,如果只打算用Ping或SNMP,就一定要把“agent接口”删掉或者停用。这一条对我来说已经是条件反射了,现在我每建一台新主机,都要检查一遍接口列表,确保不会出现多余接口。
5.3 告警刷屏和服务器被打满的优化
Zabbix监控部署得越全,监控项数量就越多,随之而来的是数据库压力变大、历史数据膨胀。尤其在弱电项目里,设备多而杂,监控项动不动就上千个。我自己就踩过一次坑:监控服务器内存告警,查了一圈发现是history表已经涨到几十GB。
后来做了三件事,效果立竿见影。
第一个是调整采集间隔。默认的采集间隔是30秒,对弱电设备来说完全没必要这么频繁。我把网络设备的流量监控间隔改成60秒,把温湿度、UPS这类变化慢的指标改成5分钟一次。历史数据量直接下降了近一倍,告警的实时性并没有明显变差。
第二个是调整历史数据保留时间。Zabbix里“历史数据”保留时间控制的是原始数据保留多久,“趋势数据”保留时间控制的是经过聚合的每小时数据保留多久。弱电监控场景,原始历史数据保留7天就够了,趋势数据可以保留365天。这样既能看到长期变化趋势,又不会撑爆磁盘。
第三个是关掉不用的监控项。自动发现规则虽然方便,但会把设备里所有MIB信息都拉进来,很多数据对弱电运维毫无意义。我在每个模板上都手动禁用掉不需要的监控项,宁缺毋滥。让Zabbix只干它该干的事,服务器稳定运行才是第一位。
5.4 弱电分散项目的网络规划建议
我做的项目里有很多是园区多楼栋、分散现场的弱电系统。这类项目最容易踩的坑是监控服务器放在一个弱电网段,但要采集的设备分布在好几个网段,甚至有几个网段之间有防火墙隔离。
我的经验是:给监控体系单独规划一个“管理网段”或者至少把监控流量划到独立的VLAN。原因很简单,监控需要访问的设备端口包括SNMP的161、Agent的10050,如果跟办公网混在一起,容易被终端IP冲突、广播风暴影响,甚至被接入层的环路拖垮。独立VLAN之后,路由表清晰,ACL好写,问题排查路径也短得多。
另外,跨网段时一定注意Zabbix Server的“Source IP”设置。有些项目里监控服务器有多个网卡,默认出口IP可能不是设备能路由到的那一个。如果设备侧做了ACL只允许特定源IP访问,就需要在zabbix_server.conf里指定监听和访问的源IP地址,否则设备侧看到来源不对,直接把SNMP请求给丢了,现象就是“明明能ping通,但采集不到任何数据”。
最后再分享一点个人感受。监控系统这个东西,搭建其实不难,难的是坚持维护。设备清单会变、IP会变、业务会变,如果不定期更新Zabbix里的主机和维修窗口,时间长了告警就慢慢变“狼来了”,到那时就真的形同虚设了。我自己的习惯是每个季度抽半天时间,把Zabbix里的主机列表跟现场设备台账核对一遍,关掉已经拆除设备的监控项,调整新上线设备的模板。别小看这半天,它能保证你那套监控系统在关键时刻真的管用。