Cacti是一个开源的基于Web的网络监控工具,可以用于监控系统的CPU、内存、进程数和网络带宽利用率等图形数据。使用Cacti我们可以通过SNMP监控路由器或交换机的网络流量。本文将介绍如何在CentOS 8/RHEL 8上安装Cacti。


STEP 1. SELinux设定

将Selinux设置为permissive模式

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

STEP 2. 环境准备

安装最新EPEL库:

[root@localhost ~]# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

安装SNMP和RRDTool,RRDTool为Cacti数据轮询工具:

[root@localhost ~]# yum install -y net-snmp net-snmp-utils net-snmp-libs rrdtool

安装MariaDB数据库:

[root@localhost ~]# yum install -y mariadb-server mariadb

安装PHP组件:

[root@localhost ~]# yum install -y php php-xml php-session php-sockets php-ldap php-gd php-json php-mysqlnd php-gmp php-mbstring php-posix php-snmp php-intl

启用相关服务:

[root@localhost ~]# systemctl start httpd snmpd mariadb php-fpm
[root@localhost ~]# systemctl enable httpd snmpd mariadb php-fpm

STEP 3. 数据库调优

建议更改MySQL参数以获得更好的性能,参数请根据系统详细参数调整。

vi /etc/my.cnf.d/mariadb-server.cnf

在[mysqld]部分添加以下参数:

collation-server=utf8mb4_unicode_ci
character-set-server=utf8mb4
max_heap_table_size=32M
tmp_table_size=32M
join_buffer_size=64M
# 25% Of Total System Memory
innodb_buffer_pool_size=1GB
# pool_size/128 for less than 1GB of memory
innodb_buffer_pool_instances=10
innodb_flush_log_at_timeout=3
innodb_read_io_threads=32
innodb_write_io_threads=16
innodb_io_capacity=5000
innodb_io_capacity_max=10000
innodb_file_format=Barracuda
innodb_large_prefix=1

重启服务:

[root@localhost ~]# systemctl restart mariadb

STEP 4. 创建Cacti数据库

初始化Maridb:

[root@localhost ~]# mysql_secure_installation

配置步骤和参数供参考:

Enter current password for root (enter for none): 敲回车
Set root password? [Y/n]: Y
New password: <Enter root DB password>
Re-enter new password: <Repeat root DB password>
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y

这里为root用户创建了一个MariaDB密码。
为Cacti创建一个数据库:

[root@localhost ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> create database cacti;
MariaDB [(none)]> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactipassword';
MariaDB [(none)]> quit;

数据名为cacti,数据库用户名为cactiuser,把cactipassword修改为你自己的密码。
新创建的数据库用户cactiuser需有权访问mysql.time_zone_name表。要做到这一点,需要先把mysql_test_data_timezone.sql表导入到MySQL的数据库。

[root@localhost ~]# mysql -u root -p mysql < /usr/share/mariadb/mysql_test_data_timezone.sql
Enter password:

再次配置数据库,授权用户cactiuser访问mysql.time_zone_name表:

[root@localhost ~]# mysql -u root -p
Enter password:
MariaDB [(none)]> GRANT SELECT ON mysql.time_zone_name TO cactiuser@localhost;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;

将zoneinfo目录路径名传递给mysql_tzinfo_to_sql程序并将输出发送到mysql程序:

[root@localhost ~]# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p
Enter password:

STEP 5. 安装和配置Cacti

安装Cacti:

[root@localhost ~]# yum install -y cacti

将默认数据库导入Cacti 数据库:

[root@localhost ~]# mysql cacti < /usr/share/doc/cacti/cacti.sql -u cactiuser -p
Enter password:

编辑Cacti配置文件以指定数据库名称、主机名、用户和密码信息:

[root@localhost ~]# vi /usr/share/cacti/include/config.php

进行相应的修改:

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

在crontab文件中编辑Cacti的cron条目以每五分钟轮询一次:

[root@localhost ~]# vi /etc/cron.d/cacti

删除前面的#号以取消注释改行:

*/5 * * * *    apache  /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1

编辑 Apache 配置文件使Cacti能被远程访问:

[root@localhost ~]# vi /etc/httpd/conf.d/cacti.conf

删除Require host localhost行,添加内容Require all granted

Alias /cacti    /usr/share/cacti

<Directory /usr/share/cacti/>
        <IfModule mod_authz_core.c>
                # httpd 2.4
                Require all granted
        </IfModule>
        <IfModule !mod_authz_core.c>
                # httpd 2.2
                Order deny,allow
                Deny from all
                Allow from localhost
        </IfModule>
</Directory>

修改PHP时区及其它配置:

[root@localhost ~]# vi /etc/php.ini

删除;date.timezone = 前面的; 号(取消注释),然后修改为正确的时区,并顺便优化相关PHP参数:

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

点击时区列表查看各个时区。

重启相关服务:

[root@localhost ~]# systemctl restart httpd php-fpm snmpd mariadb

STEP 6. 防火墙设定

允许http连接:

[root@localhost ~]# firewall-cmd --permanent --add-service=http
[root@localhost ~]# firewall-cmd --reload

STEP 7. (可选) 安装和配置Spine

在需要大量采集数据时,如果使用自带的cmd.php轮询器会比较慢,尤其在设定1分钟1次的采集频率下可能无法完成轮询所有的被监控的机器,从而可能导致部分监控项目不出图或图形断断续续。为了解决效率问题,Cacti官方也推出spine,采用多线程的方式高效的轮询。
安装spine:

[root@localhost ~]# yum install cacti-spine

设置spine:

[root@localhost ~]# vi /etc/spine.conf

填写主机名,用户和密码信息:

DB_Host       localhost
DB_Database   cacti
DB_User       cactiuser
DB_Pass       cactipassword
DB_Port       3306

测试spine:

[root@localhost ~]# /usr/bin/spine
SPINE: Using spine config file [/etc/spine.conf]
Version 1.2.17 starting
Time: 0.2350 s, Threads: 1, Devices: 2

重启相关服务:

[root@localhost ~]# systemctl restart httpd php-fpm snmpd mariadb

STEP 8. 网页端设置

浏览器访问http://your-ip-address/cacti
输入默认账号admin/admin后根据提示设置和安装。
这个步骤可能会有一些报错,请根据具体提示修改相关参数:

安装完成后,记得在[系统设置] -> [设置] -> [Poller]选项卡下将采集类型由cmd修改为spine: