☰
Cacti流量监控系统在CentOS 7上的部署与配置实践
2026/10/24 2:48:00 网站建设 项目流程

做运维的朋友应该都遇到过这个场景:业务那边反馈“服务器访问特别慢”,你登上去用ifconfig看了一眼,入方向流量确实跑满了,但要你说清楚是哪个时段开始的、持续了多久、是哪些端口在占,一时半会还真拿不出来。流量这个事,临时看一眼容易,持续盯住难。手上这个项目记录标题写的是“cati网络流量监控搭建部署for centos7x”,其实说的就是大名鼎鼎的开源网络流量监控系统Cacti在 CentOS 7 上的部署。借这个机会,我把从零搭建 Cacti 的完整过程整理出来,包含架构思路、一步步的安装命令、设备接入、告警配置,还有我踩过的几个坑,希望能让想搭流量监控的朋友少走点弯路。

Cacti 最擅长的事,就是通过 SNMP 协议周期性抓取网络设备或服务器的端口流量,然后把数据存进 RRD 文件,用网页画出趋势图。你不用自己在命令行里敲awk去数包,也不用守着终端按 F5,只要配好后,浏览器里随时能看到任意时间段的带宽曲线。这东西适合谁?适合机房里管着一堆服务器和交换机的运维同学,也适合刚接触网络监控、想找一套轻量方案练手的新人。

1. 整体设计与选型思路

1.1 为什么选 Cacti 而不是别的监控

很多人一听“监控”就想到 Zabbix、Prometheus 这类重武器。确实,它们功能很强,但引入成本也不低:Zabbix 要装 Agent、要设计主机组和触发器模板;Prometheus 要理解 pull 模型、exporter 概念,还要搭 Grafana。

Cacti 的定位非常纯粹:它的核心场景就是“取流量数据 + 画趋势图”。你给它一个 IP 和 SNMP 社区名,它就能在几分钟内把端口流量图跑起来。它不追求大数据告警分析,也不做分布式链路追踪,但恰恰是这种“小而专”让它在一票传统运维团队里活了十几年。

在 CentOS 7 上部署,还有一个现实原因:Cacti 依赖 LAMP 环境(Apache、MySQL/MariaDB、PHP),这些组件在 CentOS 7 自带源里都有,不用编译源码,装起来非常顺。相比动不动要装一堆 Go 二进制、调配置文件的现代监控栈,Cacti 的部署曲线对老运维来说几乎没有坡度。

1.2 监控架构里的四个角色

整个 Cacti 体系说白了是四件套配合,我习惯用一个比喻来讲:

  • SNMP 是“报数员”。被监控的设备(服务器、交换机)通过 SNMP 协议对外提供各种计数器,比如接口字节数、CPU 使用率、系统运行时间。Cacti 自己不发明数据,它只是按周期去问设备“你现在的接口计数是多少”。
  • Cacti 的 poller(轮询器)是“调度员”。它按照设定的时间间隔(默认 5 分钟)去执行采集动作。采集到的原始计数器由它算出差值、再转换成速率,这个过程叫“归一化”。
  • MySQL 是“档案室”。设备清单、图形模板、阈值规则、用户权限这些元数据都存在 MySQL 里。注意,真实的流量时序数据其实不存 MySQL,而是存 RRD 文件。
  • RRDtool 是“画图师”。它把采集到的时序数据写进后缀.rrd的文件,并在你打开网页看图时,根据你选的时间范围动态生成 PNG 图片。RRD 文件的优秀之处在于它能用固定大小把无限时间段的数据压缩保存,代价是旧数据会被自动降精度。

一个典型的数据流是这样的:cron 每 5 分钟触发一次poller.php,poller 读取 MySQL 里记录的设备列表,通过 PHP 的 SNMP 函数或外部命令去抓取各设备的接口 OID 值,新数据写入 RRD 文件,同时在 MySQL 里记录本次轮询的状态。你访问网页时,控制台从 MySQL 查出设备信息,再调用 RRDtool 生成图形返回浏览器。

1.3 部署前的规划清单

在动手敲命令之前,我建议先花几分钟做一个简单的规划,尤其是下面几项:

  • 版本选择:CentOS 7.6 到 7.9 都行,64 位系统。Cacti 选用 1.2.x 版本,因为 1.1.x 太老,PHP 5.4 时代的东西界面和插件兼容性都不如新版本。
  • PHP 版本:Cacti 1.2.x 建议 PHP 7.2 以上,CentOS 7 自带的 PHP 5.4 不够用,要额外配 Remi 源。
  • 防火墙策略:部署机和被监控机之间要放行 UDP 161 端口(SNMP 协议默认端口);网页访问需要放行 TCP 80 端口。
  • 数据分区:RRD 文件会持续增长,如果系统根分区空间紧张,最好把/var/www/html/cacti/rra目录放到空间充足的分区,用软链接挂过去都行。

2. 基础环境搭建与依赖安装

2.1 系统初始化:防火墙、SELinux、时间同步

CentOS 7 安装时我通常选 Minimal 最小化,省得带一堆用不到的东西。装完第一件事是把防火墙和 SELinux 处理好,否则后面 SNMP 和网页访问很容易莫名其妙失败。

# 关闭防火墙(测试环境图省事;生产环境请按需放行端口) systemctl stop firewalld systemctl disable firewalld # 临时关闭 SELinux setenforce 0 # 永久关闭:编辑 /etc/selinux/config,将 SELINUX=enforcing 改为 disabled

这里强调一下,生产环境不建议直接关防火墙,而是放行端口:

firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=161/udp firewall-cmd --reload

然后是时间同步。监控系统最怕时间乱跳,Cacti 记录的是带时间戳的采样点,被监控设备、监控服务器之间时间不一致,图上的曲线会对不齐,排查问题能让人怀疑人生。

timedatectl set-timezone Asia/Shanghai yum install -y ntpdate ntpdate pool.ntp.org # 建议再加一条 crontab 定期同步 echo "10 * * * * root /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1" >> /etc/crontab

2.2 Apache 与 MariaDB 安装

CentOS 7 自带源里直接装就行,不用从源码编译。

yum install -y httpd mariadb-server mariadb systemctl start httpd mariadb systemctl enable httpd mariadb

装完先执行一下数据库安全初始化,设置 root 密码,顺便把匿名用户和测试库清掉。别嫌这一步麻烦,后面 Cacti 建库建用户都得靠这个 root 密码。

mysql_secure_installation

MariaDB 在 CentOS 7 默认是 5.5 版本,跑 Cacti 完全够用。Cacti 1.2.x 支持 MySQL 和 MariaDB,不需要额外装什么引擎。

2.3 用 Remi 源安装 PHP 7.4

这一步是整个环境准备里最容易出问题的地方。CentOS 7 系统自带的 PHP 是 5.4,Cacti 1.2.x 装上也能跑,但会频繁遇到兼容性提示和乱码,所以我建议走 Remi 源装 PHP 7.4。

# 安装 EPEL 与 Remi 源 yum install -y epel-release rpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 安装 PHP 7.4 及扩展 yum install -y php74-php php74-php-mysqlnd php74-php-gd php74-php-xml php74-php-mbstring php74-php-posix php74-php-snmp php74-php-ldap

注意 Remi 源的 PHP 路径和系统自带的 PHP 不一样,可执行文件在/opt/remi/php74/root/usr/bin/php,配置文件在/etc/opt/remi/php74/php.ini。安装完成后用php -v验证一下:

/opt/remi/php74/root/usr/bin/php -v

如果输出显示 PHP 7.4.x,就说明装对了。为了让 Apache 能处理 PHP,还要确认 httpd 加载了正确的模块,最省事的办法是直接告诉 Apache 用 PHP 7.4 提供的配置文件:

cat > /etc/httpd/conf.d/php74.conf <<'EOF' <FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm74.sock|fcgi://localhost" </FilesMatch> EOF

实际上 Remi 源装完php74-php-fpm之后,会自带一个适用于 Apache 的配置文件,通常不需要手写。如果发现 PHP 解析不了,再把php74-php-fpm补上并启动即可;如果用的是 mod_php 模式,直接重启 httpd 就够了。

为了保险起见,我会在/var/www/html下放一个info.php测试文件:

<?php phpinfo(); ?>

浏览器访问http://服务器IP/info.php,看到 PHP 7.4 的信息页面,说明 LAMP 环境已经通了。测试完记得删掉这个文件,避免暴露环境信息。

2.4 SNMP 工具链安装

Cacti 是通过 SNMP 协议去抓数据的,所以监控服务器本身要装net-snmp-utils,用于手工测试和命令行验证。被监控对象(比如其他 Linux 服务器)则要装net-snmp服务端,并在配置里开放读权限。

yum install -y net-snmp net-snmp-utils

这里先把工具装好,后面我们会用snmpwalk来验证设备通不通。

3. Cacti 核心部署与初始化配置

3.1 下载安装包并调整权限

Cacti 官方发布页可以下到稳定版压缩包,我这边用的 1.2.22 版本是当前较稳的 1.2.x 分支。下载后解压到 Web 根目录:

cd /usr/local/src wget https://www.cacti.net/downloads/cacti-1.2.22.tar.gz tar -xzf cacti-1.2.22.tar.gz -C /var/www/html/ mv /var/www/html/cacti-1.2.22 /var/www/html/cacti # 目录属主设为 apache,保证写入 rra/log 目录时有权限 chown -R apache:apache /var/www/html/cacti

很多新手会漏掉最后一步chown。Apache 运行用户是apache,如果rra和log目录是 root 属主,poller 写数据时就会报权限错误,表现出来就是设备状态正常但图就是不出数据。

3.2 创建数据库并导入初始 SQL

回到 MySQL,创建一个名为cacti的库,并新建一个专用账号。给应用建独立账号比用 root 跑要稳妥,既方便权限管理,也能避免其他应用误操作。

mysql -uroot -p

在 MySQL 命令行里执行:

CREATE DATABASE cacti DEFAULT CHARACTER SET utf8mb4; GRANT ALL PRIVILEGES ON cacti.* TO 'cacti'@'localhost' IDENTIFIED BY 'your_strong_password'; FLUSH PRIVILEGES; EXIT;

然后用 cacti 账号导入官方初始 SQL,这一步会创建所有表结构并写入默认设备模板、图形模板等基础数据:

mysql -ucacti -p'your_strong_password' cacti < /var/www/html/cacti/cacti.sql

导入过程通常很快,没有报错就是成功。如果提示某个表已存在,别慌,十有八九是之前导入过一半,可以把库删了重建再导一次。

3.3 修改数据库连接配置

Cacti 的数据库连接信息写在include/config.php里。安装包里只有config.php.dist模板,我们需要复制一份再改:

cd /var/www/html/cacti cp include/config.php.dist include/config.php

用 vim 修改以下字段:

$database_type = 'mysql'; $database_default = 'cacti'; $database_hostname = 'localhost'; $database_username = 'cacti'; $database_password = 'your_strong_password'; $database_port = '3306';

这里除非你有特殊需求,否则hostname保持localhost就可以了,别手痒改成服务器的外网 IP,反而可能触发 MySQL 权限问题。

3.4 PHP 参数时区与性能配置

编辑 PHP 配置文件/etc/opt/remi/php74/php.ini,重点改这几项:

date.timezone = Asia/Shanghai memory_limit = 256M max_execution_time = 60

date.timezone尤其关键。默认情况下它是空的,Cacti 画图时会拿服务器时间和 UTC 对比,差 8 小时导致曲线错位。这种错位特别迷惑人,因为图能出来,但横轴时间和实际差半天,排查起来费劲。

改完配置记得重启 Apache:

systemctl restart httpd

3.5 配置 Cron 轮询器

Cacti 的采集是靠 cron 周期性执行poller.php来驱动的,这一步如果不配,整个系统就是死水一潭,设备能在网页里看到,但永远没有数据。

crontab -u apache -e

添加一行:

*/5 * * * * /opt/remi/php74/root/usr/bin/php /var/www/html/cacti/poller.php > /dev/null 2>&1

这里有几个细节值得说明:

  • 我用的是 Remi 的 PHP 全路径。因为/usr/bin/php指向的是系统自带的 PHP 5.4,参数和扩展都缺,直接用默认php命令可能导致 poller 跑不起来。
  • 采集周期默认是 5 分钟。Cacti 的 RRD 文件也是按这个周期写入的,所以图上的数据点粒度是 5 分钟一个。如果个别场景需要 1 分钟粒度,在Settings -> Poller里改轮询间隔,但 1 分钟轮询会显著增加被监控设备和本机负载,一般 5 分钟足够。
  • crontab 写完后,建议手工执行一次 poller,验证整个链路:
/opt/remi/php74/root/usr/bin/php /var/www/html/cacti/poller.php

第一次执行会输出一堆调试信息,比如OK: u:0.0000 ...,看到没有 FAILED 字样就算正常。

3.6 Web 安装向导

浏览器访问http://服务器IP/cacti/,会进入安装页面。首次安装选择 “New Install”,系统会自动检查 PHP 扩展、目录权限、MySQL 连接等前置条件。有红叉的地方照着提示改。

安装完成后的默认账号是admin,密码也是admin,登录后会强制要求修改密码。这一步很简单,但一定别偷懒直接用默认密码,因为 Cacti 的 Web 页面暴露在 80 端口上,默认密码等于把管理权限送给别人。

4. 接入监控设备并生成流量图

4.1 被监控端 SNMP 配置

Cacti 装好只是第一步,真正干活的是后面的被监控设备。假设我们监控一台 Linux 服务器,先在这台机器上安装配置 SNMP:

yum install -y net-snmp net-snmp-utils

编辑/etc/snmp/snmpd.conf,做一个最简单的只读配置:

rocommunity public 192.168.1.0/24

这里的含义是:允许 192.168.1.0/24 网段的机器用public这个只读社区名来查询本机 SNMP 信息。生产环境请把public换成复杂字符串,并限定到监控服务器的 IP。

启动服务并设为开机自启:

systemctl enable snmpd systemctl start snmpd

然后在 Cacti 所在的那台机器上测试能不能取到数:

snmpwalk -v2c -c public 192.168.1.10 ifDescr

如果返回一串网络接口的列表,比如IF-MIB::ifDescr.1 = STRING: lo之类的内容,说明 SNMP 通路没问题。如果卡住不动直到 timeout,先检查被监控机的防火墙是否放行了 UDP 161,再看看 community 是不是写对了。

如果是网络设备(比如交换机、路由器),配置思路一样:开放只读 SNMP 社区名,指定允许的管理站地址。不同品牌设备命令格式略有差异,但核心就这一件事。

4.2 在 Cacti 控制台添加设备

登录 Cacti,进入Console -> Devices -> Add:

  • Description:填一个容易识别的名字,比如web-server-01。
  • Hostname or IP:填被监控设备的 IP。
  • SNMP Version:一般选2,大部分设备支持 v2c;老旧设备只能用1,先确定设备支持再选。
  • SNMP Community:填刚才配置的只读社区名public。
  • SNMP Port:默认 161,不用动。
  • Host Template:如果是 Linux 服务器,选ucd/net SNMP Host,它能自动关联 CPU、负载等监控项;如果只是交换机,选Generic SNMP-enabled Host也可以,后面手动添加端口图。

填完先别急着保存,点页面下方的SNMP Information查询按钮,Cacti 会现场向设备发起一次 SNMP 请求。如果能正常返回系统名称、描述、设备类型,右边会显示绿色提示;如果失败,会明确告诉你 timeout 或者 no response。这一步能提前把 80% 的连接问题挡在门外。

4.3 创建设备的流量图

设备保存成功后,设备详情页会出现Create Graphs for this Host按钮。点击后会列出可选图形模板:

  • Interface - Traffic (bits/sec):经典的端口出入流量图,单位是 bits/s,这是最常用的。
  • Interface - Errors (errors/sec):端口错误包速率,排查链路质量时很有用。
  • System - CPU Usage和System - Load Average:Linux 主机监控必备。

选择你想监控的物理网卡和图形模板,点击创建。喜欢在图形树上分类管理的话,可以去Graph Management -> Tree里建一棵树,把设备分组,比如“线上 Web 集群”“办公区交换机”,这样在Graphs页面浏览时不会乱成一片。

4.4 等数据落盘并验证图形

创建完图形后,Cacti 并不会立刻有数据。RRDtool 是根据 poller 周期写入数据的,所以等第一个完整轮询周期跑完,页面上才会出现第一个点。通常 5 到 10 分钟后刷新Graphs页面,选择 1 小时时间范围,就能看到一条从刚才开始延伸的曲线。

如果图出来了但只有少量点,这是正常的,耐心等几个小时,趋势图就会变得丰满。Cacti 默认支持 5 分钟、30 分钟、2 小时、1 天、1 周等不同精度的时间范围,点右上角时间按钮可以切换。

5. 阈值告警与模板进阶

5.1 安装 Thold 插件

Cacti 默认只负责“看”,不负责“喊”。流量突然飙高或者接口 down 了,系统不会主动通知你。要想收到告警,得装 Thold 插件,它是 Cacti 社区使用最广泛的阈值监测插件。

下载插件源码并放到 Cacti 的 plugins 目录:

cd /var/www/html/cacti/plugins wget https://github.com/Cacti/plugin_thold/archive/refs/tags/v1.4.3.tar.gz tar -xzf v1.4.3.tar.gz mv plugin_thold-1.4.3 thold chown -R apache:apache thold

然后进入 Cacti 的Console -> Plugin Management,找到 Thold 点击Install再Enable。装完后左侧菜单会多出 “Thresholds” 相关项。

5.2 配置流量阈值与邮件通知

在Console -> Thresholds里定义规则。给某台设备的某个端口设置阈值时,可以选择持续条件,比如端口入流量连续 2 个轮询周期超过 90% 带宽就告警。

告警方式在生产环境最常用的是邮件。在Console -> Settings -> Alerting/Notifications里配置 SMTP 服务器地址、端口、认证账号和接收人邮箱。没有独立邮件服务器的,用企业邮箱的 SMTP 也能发,记得把发件地址填成真实的邮箱账号,避免被对方服务器拒收。

我比较推荐一段时间的流量基线,比如先把图跑两周,观察正常峰值的范围,再设定“持续超过峰值 20%”之类的阈值,而不是随便填一个带宽百分比。流量监控的告警值应该来自业务实际,而不是拍脑袋。

5.3 自定义图形模板的思路

Cacti 能火这么多年,靠的是海量模板生态。除了端口流量,你还能监控接口丢包率、设备温度、光模块收发光功率等。官方模板库里没有的指标,就需要自己定制。

大概思路是:

  • 在Console -> Templates -> Data Queries里新建一个数据查询,本质是定义一个 XML 文件,告诉 Cacti 要抓哪些 OID、如何遍历实例。
  • 在Data Templates里创建对应的数据模板,设置数据源类型(GAUGE、COUNTER、DERIVE)和单位。
  • 在Graph Templates里把数据模板画出来,配置线型、颜色、图例。

这个过程第一次接触会觉得繁琐,我的建议是先复制一个最接近的现有模板,比如复制Interface - Traffic,在副本上改 OID 和单位,多试几次就明白了。比从零摸索强得多。

6. 常见问题与排查技巧实录

6.1 图不出数据,日志怎么查

这是新手遇到最多的问题。设备添加了、图也建了,但页面上空白一片,曲线压根不出现。

第一步不是怀疑设备,而是去查 Cacti 自己的日志,路径在/var/www/html/cacti/log/cacti.log。日志会记录每次 poller 的结果,比如Device ... is up, but Data Query ... returned no records,这种提示就直接告诉你问题出在数据查询上了。

第二步看 cron 有没有真正跑起来。先手工执行一次 poller:

/opt/remi/php74/root/usr/bin/php /var/www/html/cacti/poller.php -d -f 0

加上-d参数会输出调试信息,能看到每个设备的采集结果。常见的情况是 cron 里写的 PHP 路径不对,或者是权限问题导致 poller 跑不了一部分设备。

第三步检查/var/www/html/cacti/rra目录里有没有对应的.rrd文件生成。如果有文件但页面无图,多半是 PHP 的 gd 扩展没装好,或者是 web 目录无权限。

6.2 SNMP 时报超时,先别急着怀疑设备

用snmpwalk手工测试时报 timeout,很多人第一反应是“设备是不是挂了”。不一定。先按这个顺序排查:

  • 被监控设备上 SNMP 服务是否启动,systemctl status snmpd看一眼。
  • UDP 161 端口是否被防火墙拦了,firewall-cmd --list-all查看。
  • community 是否正确,注意大小写敏感,public和Public是两个不同的串。
  • SNMP 版本是否匹配,设备禁用 v2c 的话,老老实实用 v1 或 v3。
  • 设备上有没有做 ACL 限制来源 IP,比如只允许某个管理网段查询。

我之前遇到过一台设备,其他监控都正常,唯独 snmpwalk 超时,查了半天发现是设备上同时配了 IPv6 地址,SNMP 服务监听了 IPv6 的 161 端口,IPv4 的 161 没开。这种冷门问题不看ss -ulnp根本发现不了。

6.3 数据库连接报错的处理

登录 Cacti 页面时如果弹出数据库连接错误,通常是config.php里的密码和实际账号密码对不上,或者导入 SQL 步骤出了问题。用命令行手动连一下就能验证:

mysql -ucacti -p'your_strong_password' cacti -e "show tables;"

能列出表就说明连接没问题,问题在 PHP 侧的配置文件。还有一种可能是我前面提到过的,localhost在 MariaDB 里默认走 socket 认证,如果 Cacti 所在机器的 PHP 没有 socket 权限,也会报连接错误。这种场景下,明确指定 TCP 端口3306并且为 cacti 账号增加'127.0.0.1'来源授权即可解决。

6.4 轮询超时和负载过高

设备数量多起来之后,默认的cmd.php轮询方式会变得力不从心。它每 5 分钟启动一个 PHP 进程,逐个设备去查询,设备一多,整个轮询时间会拉长,甚至还没跑完下一轮又开始了,CPU 直接飙高。

官网推荐的方案是换用spine,这是用 C 语言写的高性能轮询器。在Settings -> Poller里把轮询方式从 cmd.php 改成 spine,并在Paths里指定 spine 二进制路径。spine 支持多线程采集,单台监控服务器撑几百台设备问题不大。

如果暂时不想换 spine,另一个缓解办法是开启Poller Interval的“伪并发”思维:把设备按数量均分成多个轮询组,错开几秒执行。但说实话治标不治本,设备量过百就果断上 spine。

6.5 容易被忽略的其他坑

  • 磁盘空间打满:rra 目录会随着时间膨胀,尤其是长期保存 1 分钟精度的数据,磁盘占用比想象中快。建议给 rra 目录所在分区预留充足空间,或者用软链接指向独立数据盘。
  • PHP 时区没设:曲线横轴时间差 8 小时是时区问题,不是采集问题。
  • Web 登录后白屏:多数情况是 PHP 扩展缺失,回头查一下php -m里有没有gd、xml、snmp、mbstring。
  • 被监控设备的接口名变化:网卡名在系统重启后可能从eth0变成ens33,Cacti 按接口索引绑定,注意重新关联。
  • SNMP 返回“no such object”:说明设备上根本没有这个 OID,很多老设备不支持新 MIB,先在设备上用snmptranslate确认目标对象存在。

为了查阅方便,把最常遇到的几个问题整理成表:

现象常见原因快速排查
图空白rra 目录权限不足 / poller 没跑手工跑 poller,查看 cacti.log
设备显示 down 但 ping 通SNMP 未启动 / community 错误snmpwalk 手工测试
图有时间差php.ini 时区未设检查 date.timezone
Web 登录报数据库错误config.php 密码不对mysql 命令行验证连接
poller 执行时间过长设备多、cmd.php 效率低换 spine 或拆分轮询组
CPU 负载飚高轮询间隔过短增大轮询周期

最后分享一个我个人的操作习惯:每次新搭建一套 Cacti,我不会直接去 Web 页面里逐项点配置,而是先在命令行把被监控设备都snmpwalk通一遍,再进控制台添加设备。这一步能过滤掉大量网络层问题,不是 Cacti 的锅就不用让 Cacti 背锅。另外就是每隔一段时间去Graph Management里翻一翻有没有长时间“平线”的图形,平线往往意味着设备有问题或者采集断了,比告警邮件来的还直观。流量监控这东西,搭起来不难,难的是保持长期稳定运行,平时多看一眼日志和数据文件,比出事后再排查省心得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询