1.系统环境
采用LNMP架构(本案例中不予安装过程的说明,重点讲Cacti)作为Cacti运行的PHP环境,RedHat 5.8 32位操作系统。
本案例中采用Cacti版本是0.8.8a,截至发稿前的最新版,英文原版。

2.snmp安装
SNMP有两种方法,一种是yum,还有一种是采用源代码的编译安装。
(1)yum安装

 
  
  1. yum -y install net-snmp-devel net-snmp-libs net-snmp 

执行上面的命令即可安装完毕。
(2)源代码的安装
重点讲下源代码的安装,采用官方最新版。

 
  
  1. wget http://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.1/net-snmp-5.7.1.tar.gz  
  2. tar zxf net-snmp-5.7.1.tar.gz  
  3. cd net-snmp-5.7.1  
  4. ./configure \  
  5. --prefix=/usr/local/snmp \  
  6. --enable-mfd-rewrites \  
  7. --with-default-snmp-version="2" \  
  8. --with-sys-contact="Luxiaok,E_mail:test@luxiaok.com" \  
  9. --with-sys-location="China" \  
  10. --with-logfile="/usr/local/snmp/var/log/snmpd.log" \  
  11. --with-persistent-directory="/usr/local/snmp/var/snmp" \  
  12. --sysconfdir=/usr/local/snmp/etc \  
  13. --with-mib-modules=ucd-snmp/diskio  
  14. make && make install 

编译参数说明
    prefix:net-snmp的安装路径
    enable-mfd-rewrites:允许用新的MFD重写可用的mid模块
    with-default-snmp-version:默认的SNMP版本
    with-sys-contact:可以配置该设备的联系人
    with-sys-location:该设备的位置
    with-logfile:日志文件路径
    with-persistent-directory:不变数据存储目录
    with-mib-modules=ucd-snmp/diskio   选项,可以让服务器支持磁盘I/O监控
使用以上参数选项即可,否则configure配置时会要求手动输入。

配置文件

 
  
  1. cp EXAMLE.conf /usr/local/snmp/share/snmp/snmpd.conf 

EXAMLE.conf是在源代码文件夹里。

配置snmpd.conf
1).监听
agentAddress  udp:127.0.0.1:161  注释掉该行
agentAddress udp:161,udp6:[::1]:161   修改为该行,也可以不要后面的IPv6部分。

2).v2c授权
找到
rocommunity public  default    -V systemonly
注释掉,添加一行

 
  
  1. rocommunity public 192.168.1.101 

IP地址是监控服务器的IP,不解释

3).v3授权
暂不多赘述,因为现在利用snmp协议监控多使用1或者2版本。

启动文件

 
  
  1. cp dist/snmpd-init.d /etc/init.d/snmpd 

启动

 
  
  1. /etc/init.d/snmpd start 

或者:

 
  
  1. /usr/local/snmp/sbin/snmpd -c /usr/local/snmp/etc/snmpd.conf 

注意:在RedHat Enterprise Linux平台下,用源代码自带的snmpd作为SystemV启动脚本,使用service命令启动时,获取snmp数据时总是显示超时(实际上是服务并没有完全启动),就必须使用上面的命令手动启动。建议修改下snmpd的systemV文件,把start函数部分修改为手动启动的代码,即上面的代码。

测试:

 
  
  1. /usr/local/snmp/bin/snmpwalk -c public -v 2c 127.0.0.1 

在服务器上执行

 
  
  1. snmpwalk -v2c -c public 192.168.1.101 

IP地址写被监控服务器的IP

系统运行时间OID
.1.3.6.1.2.1.25.1.1.0

测试:

 
  
  1. [root@cacti ~]# snmpwalk -v2c -c public 192.168.1.101 .1.3.6.1.2.1.25.1.1.0  
  2. HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (583354108) 67 days, 12:25:41.08  
  3. [root@cacti ~]# 

3.rrdtool安装
先安装必要的rpm包

 
  
  1. yum install cairo cairo-devel libxml2 libxml2-devel pango pango-devel perl perl-devel 


使用官方最新版

 
  
  1. wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.7.tar.gz  
  2. tar zxf rrdtool-1.4.7.tar.gz  
  3. cd rrdtool-1.4.7  
  4. ./configure --prefix=/usr/local/rrdtool  
  5. make && make install  
  6. ln -s /usr/local/rrdtoo/bin/* /usr/local/bin/ 

小提示:很多同学会发现Cacti里用rrdtool画的图片的最右边有一竖排关于RRDTOOL标识的字,怎么去掉呢,有办法。在解压了rrdtool源代码包后,修改src目录下的rrd_graph.c文件,用vim打开查找“RRDTOOL”,要是大写的呢,1.4.7的版本是在第2740行,如图:

修改RRDTOOL源代码

去掉“RRDTOOL / TOBI OETIKER”,记住引号要留着。然后开配置,编译,安装就OK了,画图就没有多余的字了。我们可以看到源代码里有个“-90”,其实是恰好把那引号里的字顺时针转了90度。

4.spine安装
spine的安装稍有点麻烦,如果net-snmp是编译安装的,加--with-snmp=/usr/local/net-snmp。另外,LNMP架构基本是编译安装的,所以

 
  
  1. ln -s /usr/local/mysql/lib/libmysql* /usr/lib/ 

做一个MySQL的库的软链接。
如果snmp是采用的yum安装的,记得安装net-snmp-devel和net-snmp-libs这两个包。
编译

 
  
  1. ./configure --prefix=/usr/local/spine  
  2. make && make install 

配置文件
填写对应的数据库和用户名,可以做一个软链接也可以不做:

 
  
  1. ln -s /usr/local/spine/etc/spine.conf /etc/ 

5.安装Cacti
准备工作都差不多了,开始安装Cacti。它的安装过程挺简单的,只要需要的软件都安装好了。
这里采用官方最新版:0.8.8a

 
  
  1. wget http://www.cacti.net/downloads/cacti-0.8.8a.tar.gz 

解压释放到web根目录下,最好沿用默认的二级目录访问形式cacti。
导入数据库,修改config.php,填入相关数据库和用户名密码。
打开客户端浏览器http://ip/cacti/install,填入正确的路径即可,不再详细说明。

6.监控远程Linux主机
以监控RedHat/CentOS系统为例说明

需要注意的是以Unix开头的模版只能监控本机,如果监控别的(远程)的Linux主机,那所有主机的图像和数据都是一样的,即监控服务器本身的数据。

监控模版说明:

CPU:ucd/net - CPU Usage,SNMP - Get Processor Informatio(每个核一个图,相对前面的比较准确点)

内存:SNMP - Get Mounted Partitions

磁盘: ucd/net - Get Monitored Partition(如果无数据就在被监控机器的snmpd.conf里添加disk /), SNMP - Get Mounted Partitions也可以获取到磁盘分区(如果是VPS,虚拟化出来的可能获取不到,标准的物理Linux服务器是可以的)

负载:ucd/net - Load Average

进程:Host MIB - Processes

用户:Host MIB - Logged in Users

网卡流量:SNMP - Interface Statistics

其他:待定。

 

7.常见问题
(1)rrdtool中文问题
1.4.7的版本是支持中文的,不需要修改源代码文件,而1.2的版本就会乱码。要让图完全显示中文还需要修改下cacti目录下lib/function.php,就在第一个PHP标签里加入setlocale(LC_CTYPE,"en_US.UTF-8");
(2)监控nginx和php-fpm配置文件

 
  
  1. server {  
  2.  
  3.     listen   80;   
  4.     server_name  192.168.1.100;  
  5.  
  6.     root   /var/www/.monitor;  
  7.     index  index.php index.html;  
  8.       
  9.         location /nginx_status {  
  10.               stub_status on;  
  11.               # disable access_log if requared  
  12.               access_log   off;  
  13.               allow 192.168.1.101;  
  14.               deny all;  
  15.           }  
  16.         location ~ ^/(php_status)$ {  
  17.               include fastcgi_params;  
  18.               fastcgi_pass 127.0.0.1:9000;  
  19.               fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;  
  20.               access_log off;  
  21.               allow 192.168.1.101;  
  22.               deny all;  
  23.          }  

 (3)Cacti里的单位

Cacti中使用如下单位:M(兆)、K(千)、m(微)。

这里的单位 m 表示微,即需要除以1000。100m表示0.1。

m - 10^-3 即0.001
M - 10^6 
G - 10^9
T - 10^12

(4)snmp.conf自定义OID的说明

之所有讲下这个是因为snmp软件版本(区分清楚snmp协议版本与软件版本)问题,会出现一些很抓狂的问题。

举个例子,自定义一个OID,监测LNMP架构中Nginx、MySQL以及php各种占用的CPU和内存是多少。

首先上脚本:/etc/snmp/lnmp_status.sh

 
  
  1. #!/bin/bash 
  2. # 定义函数 
  3. function ps_aux() { 
  4. process=$1  # nginx httpd mysql php-fpm,and so on 
  5.  
  6. # 获取对应性能占用百分比,并用AWK求和 
  7. percent_cpu=(`ps aux | grep -i $process | grep -v "grep" | awk '{ total += $3 } END { print total }'`) 
  8. percent_mem=(`ps aux | grep -i $process | grep -v "grep" | awk '{ total += $4 } END { print total }'`) 
  9.  
  10. # 判断进程是否为空,为空表示未开启服务或进程 
  11. [ ! $percent_cpu ] && percent_cpu=0 
  12. [ ! $percent_mem ] && percent_mem=0 
  13.  
  14. # 输出 
  15. echo $percent_cpu 
  16. echo $percent_mem 
  17.  
  18.  
  19. # 调用函数 
  20. ps_aux nginx 
  21. ps_aux mysql 
  22. ps_aux php-fpm 
  23.  
  24. # 统计网站数量并输出 
  25. web_num=`ls /var/www/html | wc -l` 
  26. echo $web_num 

这里多添加了一个统计/var/www/html/目录下所运行的网站的数量,所以一共有7个数据返回,定义的OID是.1.3.6.1.4.1.2021.23,所以在/etc/snmpd.conf里添加一下内容:

 
  
  1. extend .1.3.6.1.4.1.2021.23 lnmp_status /bin/bash /etc/snmp/lnmp_status.sh 

需要说明的问题在这里:在RHEL 5平台下的snmp软件的版本是5.3,而到了RHEL 6平台下snmp的版本是5.5(可以使用snmpd -v命令查询软件版本),是5.3的版本里可以使用exec关键字来定义自己的OID,但是在5.5版本下就不行了,如果用exec,就会报错

SNMP 5.5 使用 exec 报错

这会很抓狂的,所以统一都使用extend

模版在附件里有,先看看效果图:

Cacti监控LNMP架构的效果图

(5)图形模版里的“| date_time |”

在有些图形模版里,有些打印了“最后更新时间”,但是打印出来的格式却不怎么符合我们的习惯,是如下的模式:

 

就像是在Linux下执行单纯的“date”命令一样,这其实是用php的date函数打印出来的,我们可以修改下Cacti的源代码,文件是cacti/lib/rrd.php。

打开后查找"date_time",可以看到模式的格式是:

 
  
  1. date('D d M H:i:s T Y'

修改为

 
  
  1. date('Y-m-d (l) H:i:s'

看看打印的效果

 

这个是可以自定义的,php里的date函数具体怎么用可以去查下资料,大致按照中国人的习惯打印出”年-月-日 时间“的格式就差不多习惯了。

(6)监控磁盘使用率

这里是说监控磁盘的百分比使用率,便于报警。

详见这里:Cacti监控报警磁盘使用率

(7)等你来分享和添加