我们办公室墙上有块显示屏,一直滚动着几十台网络设备的状态:核心交换机、路由器、防火墙、服务器、网络打印机、摄像头网关。绿色代表一切正常,红色出现的时候,基本没人心情是好的。这套东西最初就是用 OpenMontage 搭起来的。如果你也想用一套轻量、开源、部署完半小时就能看到效果的网络监控工具,它在很多场景下比 Zabbix、Nagios 这种全家桶更顺手。我把从选型、部署、配置到日常踩坑的整个过程整理出来,给准备上手的朋友做个参考。
先说清楚我的需求背景和选型过程,再一步步还原部署和配置细节,最后把我在实际运维里遇到的坑和解决办法一并列出来。内容不端着,直接按我动手的过程来写。
1. 先交代背景:为什么我没上 Zabbix 和 Nagios
1.1 当时的监控需求
我负责的这片网络不算大,但设备杂。核心交换机一台,接入交换机四五台,业务 Linux 服务器两台,Windows 工作站十几台,还有网络打印机、摄像头网关和几个 IoT 设备。之前是每天上班先手动 ping 一圈,节假日心里完全没底。设备要是半夜挂了,得到第二天早上用户报障才知道。
我的核心需求其实很朴素:
- 能定时探测设备在线状态,异常时第一时间通知我
- 把历史可用性数据存下来,方便出问题后回看
- 有个网页面板,让同事也能看到整体状态,不用来问我
- 部署和维护成本要低,不要 agent,不要庞大的依赖
这个需求不复杂,但市面上的工具都往重了做,这就很尴尬。
1.2 OpenMontage 与传统监控方案的真实差距
Zabbix 和 Nagios 当然强大。它们有 agent 机制、主动/被动模式、模板系统、复杂的告警依赖关系。但要落地这套东西,你得先学概念,再配 agent,再调告警规则。小团队没有专职运维的话,光把 Zabbix Server 装好、模板导入、agent 装到各个设备上,可能就要折腾两三天。而我的设备里还有不少是没法装 agent 的:交换机、打印机、摄像头,它们只支持 SNMP 或者干脆只响应 ICMP。
OpenMontage 的思路很直接:像一个门口值班员,定时拿手电筒照一圈设备,然后在黑板上记录状态。它默认就走网络探测这条路,不依赖目标机器上装任何东西。这种设计决定了它的优点:部署快、逻辑简单、资源占用小、页面直观。
它也不是什么都要管。它不做 CPU 负载采集,不做磁盘容量监控,不做日志分析。它就专注网络可达性——设备活着没、端口开着没、HTTP 返回正常没。如果你需要的恰好是这些,OpenMontage 会非常省心;如果你需要更细的指标,那还是去用 Zabbix。想清楚边界再选型,就不会后面天天抱怨。
另外一个选它理由是技术栈。OpenMontage 基于 PHP,这在很多老服务器上几乎是零门槛。无论你手头是装过 LAMP 还是 LNMP 的机器,PHP 环境跑起来就能用,MySQL 做数据存储。我手头正好有一台闲置的 Ubuntu 20.04,配好 LAMP,二十分钟就能把服务架起来。
2. 部署前环境准备与安装流程还原
2.1 环境依赖与目录规划
OpenMontage 本身是个 Web 应用加命令行采集脚本的组合,需要的环境就三样:PHP、MySQL、Web 服务器。我用的是 PHP 7.4 + MariaDB 10.3 + Apache 2.4,这三个都是 Ubuntu 20.04 自带的软件源版本,稳定够用。
建议装这些 PHP 扩展,缺了后面会有问题:
- php-cli:命令行执行采集脚本的核心
- php-mysql:连数据库
- php-curl:HTTP 探测时需要
- php-json:和前端接口交换数据时用
目录规划方面,我的做法比较干净:
/var/www/openmontage:Web 站点代码目录/etc/openmontage/:存放配置文件,不放站点目录里,方便备份/var/log/openmontage/:记录采集日志/var/lib/openmontage/:存放临时数据和缓存
之所以把配置和代码分开,是因为后面升级代码时不会覆盖你的配置。这点在开源项目里很重要。
2.2 从拉取代码到跑通首页的完整步骤
第一步:从 GitHub 拉取代码到指定目录。
sudo git clone https://github.com/OpenMontage/OpenMontage.git /var/www/openmontage如果网络比较慢,也可以把 tarball 下载下来解压。拉完代码后注意看一下目录权限,Apache 要对这个目录有读取权限,采集脚本要有执行权限。
第二步:创建数据库和用户。
mysql -uroot -p CREATE DATABASE openmontage DEFAULT CHARACTER SET utf8mb4; CREATE USER 'montage'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON openmontage.* TO 'montage'@'localhost'; FLUSH PRIVILEGES;项目里一般自带数据库初始化脚本,比如schema.sql,直接导入:
mysql -umontage -p openmontage < /var/www/openmontage/schema.sql如果找不到 schema.sql,就翻一下 README,看它推荐的数据表创建方式。我用的版本里数据表不多,核心就几张开:节点表、探测结果表、用户表。
第三步:修改配置。
OpenMontage 的配置方式比较有特色:它不是 INI 文件,而是直接一个 PHP 数组文件。比如config.php里会有数据库连接信息、探测参数、调度设置。如果你不熟悉 PHP,也别怕,结构大概是这样的:
<?php return [ 'db' => [ 'host' => 'localhost', 'name' => 'openmontage', 'user' => 'montage', 'pass' => 'your_password', ], 'monitor' => [ 'timeout' => 5, 'retries' => 2, ], ];把数据库密码填进去,保存。
第四步:跑一次采集脚本,验证数据库连通。
OpenMontage 的采集入口一般是命令行脚本,类似:
php /var/www/openmontage/bin/montage.php --config /etc/openmontage/config.php如果你还没添加任何监控节点,这一步可能输出空结果,但只要没有报数据库连接错误,就说明配置正确。
第五步:配置 Apache 站点。
创建一个虚拟主机配置文件,指向/var/www/openmontage/public(视项目版本而定,也可能是 Web 根目录)。注意要开启 PHP 模块,并把AllowOverride All打开,因为项目用 Apache 的 rewrite 规则处理路由。
<VirtualHost *:80> ServerName montage.example.com DocumentRoot /var/www/openmontage/public <Directory /var/www/openmontage/public> AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/openmontage_error.log </VirtualHost>第六步:访问首页。
浏览器打开http://服务器IP/,应该能看到登录页面。默认管理员账号密码在 README 里会有说明,通常首次登录后会提醒你修改密码。到了这一步,Web 端就算跑通了。
3. 监控项配置:Ping、端口与 HTTP 探测的写法和原理
3.1 节点配置格式与管理界面
OpenMontage 提供了 Web 管理界面来添加节点,不用手写配置文件去定义监控目标。这一点比早期 Nagios 友好太多。添加节点时,核心字段大概是这几个:
- 节点名称:给自己看的,最好按用途命名,比如"核心交换机 A"
- 探测地址:IP 或域名
- 探测方式:ping、TCP 端口、HTTP
- 目标端口和路径:根据探测方式不同而不同
- 探测间隔:多少秒跑一次,默认可以用 60 秒
- 超时时间:单次探测等待多久算失败
我通常会在命名上统一加前缀:网络设备、服务器、终端、特殊设备,这样后面在面板上做筛选时非常方便。
3.2 三种探测方式的适用场景
OpenMontage 常见有三种探测方式,它们的原理和适用场景差别很大,不能乱用。
| 探测方式 | 原理 | 适用场景 | 注意事项 |
|---|---|---|---|
| Ping | 发送 ICMP Echo 请求,等待目标回包 | 判断设备存活,适合交换机、路由器、IPC | 有些设备禁 ICMP,会误报 |
| TCP 端口探测 | 建立 TCP 连接到指定端口 | 判断服务是否在监听,如 SSH 22、Web 80 | 只证明端口通,不证明业务健康 |
| HTTP 探测 | 发 HTTP 请求,检查返回状态码或内容 | Web 服务健康检查,可配合特定路径 | 比 TCP 多一步,能发现 502/504 |
举几个实际例子。
核心交换机配 Ping 探测,因为我只关心它活着没;如果它挂了,全网都完了,这比探测某个具体端口更有代表意义。
Web 服务器配两种:TCP 80 端口探测,用来确认 Nginx 进程还在;再加一个 HTTP 探测,路径指向/health,状态码必须是 200。这样能区分两种情况:机器死了,还是服务返回错误页。
数据库服务器我除了 Ping,还加了一个 TCP 3306 探测。有一次机器本身活着,但 MySQL 进程挂了,Ping 一点问题没有,要不是端口探测及时发现,第二天业务崩溃时才排查就完了。
3.3 调度频率与数据采集节奏
OpenMontage 不靠常驻进程,而是靠系统 cron 定时执行采集脚本。我用的 crontab 配置是这样:
*/1 * * * * /usr/bin/php /var/www/openmontage/bin/montage.php --config /etc/openmontage/config.php >> /var/log/openmontage/montage.log 2>&1这里就有一个关键问题:一分钟跑一次,但任务本身能不能在一分钟内完成?
如果监控节点只有十来个,spin 很快;但到了几十上百个,串行探测一轮可能超过 60 秒。这时候就会出现任务堆积——上一个进程还没跑完,下一个又启动了,数据库连接数暴涨、日志越来越大、结果时间戳混乱。
我的处理办法有两个。第一,把探测间隔拉开,不是所有节点都一分钟一次:核心设备 30 秒,边缘设备 120 秒。第二,如果节点很多,可以在脚本配置里开启并发探测,让一个任务内、多个目标同时探测,而不是一个个排队。这个逻辑本质是并发数和任务周期的平衡,空间换时间。
另外,cron 脚本输出一定要重定向到日志,不然系统每天会狂发邮件(如果你装了 postfix),或者 cron 日志里报错你完全看不到。我遇到过脚本因为 PHP 通知级别警告输出太多,把日志文件撑到好几个 G 的惨案。这个后面讲坑的时候细说。
4. Web 面板和状态大屏的实战细节
4.1 主面板的字段含义与快速定位故障
OpenMontage 的 Web 面板主打“一眼看清状态”。每个节点是一个状态卡片,绿色表示在线,红色表示离线(或服务异常),黄色一般表示历史数据缺失或还未采集过。除了颜色,卡片上还会显示:
- 可用性百分比:过去 24 小时或 7 天的在线率
- 平均响应时间:最近探测的 RTT(往返延迟)
- 最后探测时间:数据的新鲜度,如果时间停在几分钟前说明采集任务可能卡了
我有次半夜收到告警邮件,登录面板看发现核心交换机是红色。但仔细一看响应时间那一栏是空的,最后探测时间停在了二十分钟前——这不是设备挂了,是采集任务本身卡死在某个 DNS 解析上。所以看面板不能只看颜色,还要看数据新鲜度。
面板上通常会按分组或者列表展示节点。状态变更记录是个很实用的模块,它会把每个节点状态从 up 到 down 的变化时间记下来。这个记录的价值在于,事后你可以把故障时间段和交换机日志对上。
4.2 用户认证与权限配置
OpenMontage 自带简易用户管理,可以建立管理员和普通用户两种角色。管理员能增删节点、修改探测配置、查看管理后台;普通用户只有查看面板的权限。
在我这个场景里,办公室同事用普通账号查看面板足够。你不想大半夜所有人收到告警邮件的话,告警订阅也是可以按用户配置的,不是一刀切全部发。
如果团队已经有 LDAP 或统一认证,OpenMontage 自带功能可能不够。我当时的做法是写了一个简单的认证跳转:用统一的登录入口校验身份,校验通过后把用户信息用 HTTP header 传给 OpenMontage,再由它内部映射成本地账号。这个方案对非技术用户透明,但需要一点 PHP 开发能力。多数小团队直接用自带用户管理就够了。
4.3 从“能看”到“好看”:展示层的自定义
面板默认样式比较朴素,但胜在干净。我做了两个小调整,体验提升很大。
第一个是自定义 Logo。把公司 Logo 放到指定图片目录,在配置里指定 URL,登录页和页眉就能换成自己的品牌。
第二个是大屏模式。办公室墙上的显示屏,我用浏览器全屏模式打开面板页面,再在 CSS 里把字号调大、卡片间距加大。这样从远处看,颜色块非常清楚。红色一亮,值班的人老远就能看到。这个看似不起眼的调整,对“状态可视”这个目标特别重要。
如果还想更直观,可以画一张简单的网络拓扑地图,把节点按区域位置摆上去。OpenMontage 的这类扩展不一定默认就有,需要根据版本看支持情况。没有现成地图视图时,退而求其次用分组列表也能接受,至少信息不缺。
5. 告警通知与故障排查实战
5.1 告警机制原理与配置
OpenMontage 的告警基于探测结果判定。每次采集脚本跑完,会把每个节点的探测结果写入数据库,同时对照之前的状态,判断有没有发生状态变化。如果节点从 up 变成 down,就产生一条告警事件,再按用户配置的通知方式发出去。
我用的通知方式主要两类:邮件和 Webhook。
邮件是老牌方案,配置 SMTP 服务器信息即可。如果你手头有现成的企业邮箱,填上账号密码就能发。要注意的是,很多 SMTP 服务器对发信频率有限制,告警风暴时容易被拉黑。所以我在逻辑上加了限制:同一个节点,五分钟内最多发一次告警,防止系统反复抖动时把邮箱灌爆。
Webhook 是我后来加的。利用一个简单的 PHP 脚本,把告警事件 POST 到企业微信或钉钉的机器人接口,实现手机实时收到消息。这个体验比邮件好很多,尤其是半夜。
5.2 我遇到过的误报与排查根因
告警配置好之后,第一个月我被误报折腾了三次,每次都是半夜,非常酸爽。逐个分析下根因。
第一次误报:网线接触不良,但监控端看起来是“设备三秒掉线,三秒恢复”。OpenMontage 判定 down 的条件是单次探测失败,于是告警触发。但等我爬起来看日志,它早就恢复了。根因是我没有设置“连续失败 N 次才算 down”的阈值。单次超时可能只是网络抖动,不一定代表设备真的挂了。这个教训让我明白:告警必须做去抖,连续 3 次失败再发通知,基本能滤掉大部分假警。
第二次误报:目标服务器本身很忙,CPU 跑满,网络正常但 ping 响应时间从 1ms 飙到 800ms,超过我设的超时阈值,被判定失败。其实在这台服务器上,CPU 满载几个小时都不影响业务响应(它是离线计算节点)。根因是我对所有节点用了同一套超时参数。后来我调整策略:对关键网络设备用统一的严格参数;对已知高负载服务器单独放宽超时时间。
第三次误报不是探测端的问题,是数据库问题。采集脚本连 MySQL 时因为负载高等待超时,导致探测数据根本没写入,面板显示“无数据”,告警判断依据缺失,误报了一片。根因是采集数据库和 Web 共用一台服务器,没有做资源隔离。后来把历史数据清理掉一批,数据库压力降下来,才彻底稳定。
5.3 怎么验证监控数据是准的
面对误报,仅靠嘴上说“修好了”不够,要做验证。我的方法是对拍。
比如怀疑 ping 探测延迟不准,就在监控服务器上同时用tcpdump抓 ICMP 包:
sudo tcpdump -i eth0 icmp同时手动 ping 目标设备,看 OpenMontage 记录的响应时间是否和抓包结果吻合。如果偏差在阈值范围内,说明探测链路没问题,问题出在判定逻辑上。
再比如验证 HTTP 探测,我直接用 curl 模拟:
curl -s -o /dev/null -w "%{http_code} %{time_total}\n" http://target/health然后用同样参数看 OpenMontage 探测记录里的状态码和耗时。理论上应该一致,如果不一致,就要检查探测脚本里是不是设置了不同的超时或重试逻辑。
验证的目的不是证明工具没问题,而是让你下次告警来时,有底气判断它是真的还是假的。这个信任感很重要,不然最后你会变成“狼来了”的反面——真挂了反而不当回事。
6. 日常运维中踩过的坑与优化建议
6.1 PHP 环境脚本静默失败的排查
第一个坑来自 PHP 扩展缺失。我当时迁移环境到新服务器,OpenMontage 的采集脚本不报错也不写数据,面板一片空白。排查思路是这样的。
先用命令行手动跑采集脚本,加 verbose 参数看输出。结果看到一个错误:Call to undefined function curl_init()。原来新的服务器上 PHP 没装 php-curl 扩展,HTTP 探测直接报错,但脚本可能在 try-catch 里把这个异常吞了,导致“看起来一切正常,其实什么都没发生”。
这个经验说明:开源监控工具装好之后,一定要先手动跑一次采集命令,看着输出正常,再交给 cron。千万别直接配完 crontab 就不管了,不然问题会在几天后才暴露。
另外,PHP 版本差异也可能带来问题。老项目在 PHP 7.4 下正常,切到 PHP 8.0 之后,有些废弃函数可能导致脚本报错。我的建议是:能锁定版本就锁定版本,不要在生产机上升级 PHP 小版本后就不管项目兼容性。
6.2 数据库表增长、慢查询与任务堆积
OpenMontage 默认把每次探测结果都往 MySQL 里写,一天下来数据量不小。我跑了三个月后,发现两个问题:
一是probe_results之类的历史表膨胀。几百万行数据后,插入和查询都变慢,面板加载历史图表时明显卡顿。二是数据库一旦卡顿,采集脚本写不进去,又会连环导致探测定时不准。
我的优化手段有这些:
- 定期清理历史数据:只保留最近 30 天的明细数据,更早的只保留小时级别的聚合数据
- 给节点表和结果表加索引:以时间为条件查询时效果非常明显
- 把采集数据库独立到单独实例,或者至少单独建库,避免和 Web 业务库共享资源
用 cron 定期清理是个简单有效的办法:
mysql -umontage -p openmontage -e "DELETE FROM probe_results WHERE created_at < NOW() - INTERVAL 30 DAY;"再加一条清理聚合表,一个月跑一次,数据库体积能控制得很稳定。
6.3 大规模监控的扩展思路:从单机到多探针
如果你的监控节点从几十个涨到几百个甚至更多,单机方案迟早会撑不住。这时候可以做两件事。
第一,把采集和展示拆开。OpenMontage 的 Web 界面和采集脚本其实可以跑在不同的机器上,只需要让采集机器和 Web 机器连接同一个 MySQL 数据库。这样即使采集压力大,Web 面板的展示性能不受影响。
第二,多探针部署。在多个地域分别部署采集脚本实例,各自负责本区域的节点探测,然后统一把结果写入同一个数据库。这样既分散了网络延迟对探测结果的影响,也提高了容错能力——一个探针挂了,其他区域的监控还在。这个思路其实是用多角色采集端换监控系统自身的可靠性。
不过多探针部署会增加运维复杂度,前提是你已经确定节点规模确实需要。如果你只有几十台设备,老老实实用单机是最好的选择,别为了扩展性而扩展。
最后再分享一个亲测好用的技巧:把 OpenMontage 的 Web 界面做成 kiosk 模式,在办公室电视上长期显示,设备状态就是整个团队随时能看到的公共信息。再配合一个简单的 Webhook 脚本,把告警同步到公司群。半年下来,这套组合帮我抓出了好几次夜里交换机端口自动 down 又自动恢复的问题,都是靠告警记录和面板时间线锁定的位置。监控工具不怕“简单”,怕的是“复杂到没人愿意维护”。OpenMontage 对我来说,恰好是在这个平衡点上。