监控非常重要,一个公司的服务器架构可以不够成熟,但是监控不能没有。目前,比较流行的开源监控软件有Cacti、Nagios、Zabbix、smokeping、open-falcon等。
Cacti擅长监控网络流量,Cacti、smokeping偏向基础监控,成图专业,多用于IDC机房。Cacti、Nagios以及Zabbix都是C/S架构,需要安装一个服务端,然后还需要在被监控的机器上安装客户端,三个都需要LAMP的支持;
Nagios监控一目了然,它监控某个指标不会返回具体数据,而是返回一个状态,告诉我们正常或不正常。它不需要历史数据,所以它不需要数据库支持,当某个指标不正常,它就会直接发送告警邮件或者短信。
Zabbix和Cacti都需要数据库支持,用来存储数据。Zabbix可以很方便地画图,支持查询历史数据,另外,Zabbix可以很方便地自定义监控项目,可以定制化监控某个指标。
open-falcon为小米公司开发,开源后受到诸多大公司和运维工程师的追捧,适合大企业,滴滴、360、新浪微博、京东等大公司在使用这款监控软件,值得研究。
Zabbix不仅适合中小型企业,也适合大型企业,它是C/S结构,分为服务端(server)和客户端(client),单个服务端节点可以支持上万台客户端。在硬件和网络足够强悍的情况下,单台服务器理论上可以支持5万个客户端。
Zabbix官网,最新版本是3.4,下载地址,其中也有安装步骤的介绍。
Zabbix整个体系架构中有5个主要的组成角色。
zabbix-server是整个监控体系中最核心的组件,它负责接受客户端发送的报告信息,所有配置、统计数据及操作数据都由它组织。
存储着收集到的所有信息。
web界面即GUI,这让Zabbix更简单易用。运行web界面需要有PHP环境支持。
zabbix-proxy为可选组件,用于监控节点非常多的分布式环境中,它可以代理zabbix-server的功能,减轻zabbix-server的压力。
zabbix-agent为部署在各客户端上的组件,用于采集各监控项目的数据,并把采集的数据传输给zabbix-proxy或zabbix-server。
大致了解了Zabbix的架构和工作流程之后,我们试着搭建一套Zabbix监控系统。
在一台机器上可以安装Zabbix所有的组件,这里我拿两台机器来做实验,其中IP为192.168.33.128作为Zabbix服务端,192.168.33.129作为客户端。
zabbix-server 192.168.33.128
zabbix-agent 192.168.33.129
# cd /usr/local/src/
# wget https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
# rpm -ivh zabbix-release-3.4-2.el7.noarch.rpm
# yum list |grep zabbix #列出与zabbix相关可用的包
安装Zabbix,需要安装的包有zabbix-agent、zabbix-get、zabbix-server-mysql、zabbix-web、zabbix-web-mysql。各个包的作用如下:
zabbix-agent:客户端程序
zabbix-get:服务器上命令行获取客户端检测项目的工具
zabbix-server-mysql:zabbix-server MySQL版
zabbix-web:web界面
zabbix-web-mysql:web界面MySQL相关
会连带安装httpd和PHP,如果mysql没安装,需要另外安装
# yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql
默认httpd中Zabbix的配置文件是/etc/httpd/conf.d/zabbix.conf
,该配置文件定义了Zabbix的web界面程序程序所在路径。如果是线上的机器,并且安装了nginx,我们可以让httpd监听8080端口,然后让nginx去代理httpd。
# vim /etc/httpd/conf/httpd.conf
Listen 80 #改为 Listen 8080
# systemctl start httpd
# netstat -lntp |grep httpd
tcp6 0 0 :::8080 :::* LISTEN 2099/httpd
# systemctl enable httpd #开机启动httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
# vim /usr/local/nginx/conf/vhost/zabbix.conf #写入下面内容
server
{
listen 80;
server_name 192.168.33.128; #把zabbix服务端的IP作为主机名
location /
{
proxy_pass http://192.168.33.128:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# /usr/local/nginx/sbin/nginx -t #检查上面配置是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# /usr/local/nginx/sbin/nginx -s reload #重载配置
Zabbix需要MySQL的支持,如果机器上还没有安装MySQL,可以根据之前讲过的内容安装。
接下来就是配置MySQL。
# vim /etc/my.cnf #在[mysql]模块下面增加下面内容
character_set_server = utf8
[root@localhost src]# /etc/init.d/mysqld start #重启mysql服务
Starting MySQL SUCCESS!
# mysql -uroot -S /tmp/mysql.sock -p123456 #进入mysql
mysql> create database zabbix character set utf8; #创建zabbix库,字符集为UTF-8,不要忘记末尾分号
Query OK, 1 row affected (0.00 sec)
mysql> grant all on zabbix.* to 'zabbix'@'127.0.0.1' identified by 'lzxlzx'; #创建zabbix用户并授权
Query OK, 0 rows affected (0.01 sec)
mysql> quit
# cd /usr/share/doc/zabbix-server-mysql-3.4.11/
# gzip -d create.sql.gz
# mysql -uroot -S /tmp/mysql.sock -p123456 zabbix < create.sql #导入mysql
Warning: Using a password on the command line interface can be insecure.
# systemctl enable httpd #开机启动httpd
# vim /etc/zabbix/zabbix_server.conf #增加下面内容
DBHost=127.0.0.1
DBPassword=lzxlzx
# systemctl start zabbix-server #启动zabbix-server服务
# systemctl enable zabbix-server #开机启动zabbix-server服务
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.
# netstat -lntp |grep zabbix #检查zabbix-server服务,但是没有,遇到错误
# ps aux |grep zabbix
root 2537 0.0 0.0 112720 968 pts/0 S+ 15:45 0:00 grep --color=auto zabbix #这里查看也没有zabbix-server服务
# cat /var/log/zabbix/zabbix_server.log #查看zabbix-server日志
2467:20180723:154243.227 using configuration file: /etc/zabbix/zabbix_server.conf
2467:20180723:154243.227 cannot set resource limit: [13] Permission denied
2467:20180723:154243.227 cannot disable core dump, exiting... #有这样的报错信息,是权限问题
# getenforce #查看selinux状态
Enforcing
# setenforce 0 #关闭selinux
# getenforce
Permissive
# systemctl start zabbix-server #再次启动zabbix-server服务
# netstat -lntp |grep zabbix
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 3305/zabbix_server
tcp6 0 0 :::10051 :::* LISTEN 3305/zabbix_server #服务启动成功
在服务端配置完毕,下面在浏览器输入http://192.168.33.128/zabbix(IP是服务端的IP),会出现下面的界面:
点击右下角的Next step,会出现一个关于date.timeout的警告,如下图:
# vim /etc/httpd/conf.d/zabbix.conf #增加下面内容
php_value date.timezone Asia/Shanghai #设置时区
# systemctl restart httpd #重启httpd服务
刷新浏览器,刚刚的问题已经解决:
继续点击右下角的Next step
,出现MySQL相关配置页面:
继续点击Next step
,如果这一步出现问题,可以将nginx服务关闭,将80端口改回给httpd服务(这里我遇到的问题是填完密码,下一步的时候,浏览器显示502 BAD GATEWAY
)。
这一步的目的是让我们填写zabbix server本机的相关信息,目的是监控它。由于没有配置zabbix-agent,所以直接跳过。
继续点击Next step
,出现汇总页面:
再点击Next step
,出现Congratulations页面:
说明安装完成,点击Finish
完成安装,出现登录页:
默认账号是Admin
,密码是zabbix
,点击Sign in
,进入zabbix管理控制台:
登录进来后,第一件事就是更改Admin密码,这个初始密码大家都知道,很不安全。
Administration
→ Users
→ Admin
改完密码后,选择Chinese
,然后再点击Update
,刷新浏览器,出现中文页面:
上面都是在服务端配置,已经完成,下面还需要配置客户端程序,在客户端上执行。
# wget https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
# rpm -ivh zabbix-release-3.4-2.el7.noarch.rpm
# yum install -y zabbix-agent
# vim /etc/zabbix/zabbix_agentd.conf #修改下面配置
Server=192.168.33.128 #定义服务端的IP(被动模式)
ServerActive=192.168.33.128 #定义服务端的IP(主动模式)
Hostname=lzx #自定义主机名,后面需要在web界面下设置同样的主机名
主动或被动是相对于客户端来讲的。如果是被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端;如果是主动模式,客户端会主动把监控数据汇报给服务端,服务端只需要接收即可。当客户端数量非常多时,建议使用主动模式,这样可以降低服务端的压力。
# systemctl start zabbix-agent #启动zabbix-agent服务
# systemctl enable zabbix-agent #开机启动zabbix-agent服务
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service.
# netstat -lntp |grep zabbix
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1477/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 1477/zabbix_agentd #zabbix-agent监听10050端口
客户端配置完成,接下来要到web界面的管理后台去配置Zabbix。
Zabbix管理员用户默认为Admin
,密码默认为zabbix
,所以刚刚第一次进入管理后台的时候就应该修改默认密码。但是如果该密码忘记了,还可以按照下面的方法重置密码。
# mysql -uroot -p123456 zabbix #进入zabbix库
mysql> select database();
+------------+
| database() |
+------------+
| zabbix |
+------------+
1 row in set (0.00 sec)
mysql> update zabbix.users set passwd=md5('lzxlzx') where alias='Admin'; #重置密码为lzxlzx
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
添加主机即把被监控的主机加入到监控中心,这样就可以监控它的一些项目的了。
在添加主机之前,需要添加一个主机组,依次点击:配置
→ 主机群组
→ 创建主机群组
→ 设置组名
,组名填写lzx-test
,如下图:
添加完主机组后,才可以添加主机,依次点击配置
→ 主机
→ 创建主机
,主机名称填写lzx
,可见名称也是lzx
,群组选择lzx-test
,IP地址填写192.168.33.129
,如下图:
点击添加
按钮,主机被成功添加,然后在主机列表里会看到刚刚添加的主机lzx
,状态为已启用,如下图:
上面图中出现了几个概念:应用集、监控项、触发器、图形、自动发现、Web监测。
监控项
:要监控的项目,比如内存使用、CPU使用等
应用集
:多个监控项的组合,比如CPU相关的应用集
触发器
:针对某个监控项做的告警规则,比如CPU使用超过95%就会告警
图形
:监控情况的变化,以图形展现
自动发现
:zabbix特有机制,会自动去发现服务器上的监控项目
Web监测
:可以去监控指定网站的某个URL访问是否正常
依次点击配置
→ 模板
,就可以看到zabbix自带的模板了,这些模板其实就是多个应用集、监控项、触发器、图形、聚合图形、自动发现、Web监测的组合。比如FTP模板,就是针对FTP服务设置的一个监控模板,里面的应用集、监控项、触发器等全部都是针对FTP服务的。
我们可以先自定义一个模板,然后在各个模板里面选需要的应用集或监控项,把它们复制到自定义模板里,这样就算添加了一个模板。这里我自定义一个名字为lzx-1
的模板。
点击模板
→ 创建模板
,模板名称写lzx-1
,可见名称写lzx-1
,群组这里选择Templates
,点击添加
,如下图:
此时,模板列表页最上面出现了我们刚刚创建的lzx-1
模板,如下图:
接下来,选择Tempalte OS Linux
模板,找到该模板点击监控项
,在Available memory
、Checksum of /etc/passwd
、CPU user time
和Processor load (1 min average per core)
前面打勾,然后点击下面的复制
按钮,之后目标类型选择模板
,在lzx-1
模板前面打勾,再点击下面的复制
按钮,如下图:
点击配置
→ 模板
,可以看到lzx-1
模板的监控项
里已经有了4项,就是刚刚添加的那4项。如下图:
Available memory
:监控剩余内存大小
Checksum of /etc/passwd
:监控/etc/passwd文件是否被修改
CPU user time
:监控CPU的user使用率
Processor load (1 min average per core)
:监控1分钟每个核CPU的负载是多少
还可以在模板中设置触发器
,即告警规则。点击lzx-1
模板的触发器
→ 创建触发器
,名称填{HSOT.NAME}1分钟负载(每核)
,其中{HOST.NAME}
是zabbix的内置变量,就是主机名。严重性根据实际需求选择,从左至右级别越来越高,这里选择警告
,表达式里面就是具体的告警规则,点击添加
→ 选择
,群组选择Templates
,主机选择lzx-1
,在下面列出来的监控项里面选择Processor load (1 min average per core)
。功能选择最新的T值>N
,这里“T”可以指定为时间,也可以指定为次数,不设置默认就是时间,间隔
留空(即为0),N设置为2,即表示当负载大于2时告警。如下图:
点击插入
后回到触发器
界面,其它选项保持默认即可,最后点击添加
按钮,第一条触发器添加成功。如下图:
下面来添加图形
,图形是查看指标历史数据或趋势必不可少的手段。点击图形
→ 创建图形
,名称填写1分钟负载
,其它都保持默认,监控项
右侧点击添加
,在弹出来的界面选择Processor load (1 min average per core)
,点击选择
→ 添加
。如下图:
下面接着来添加自动发现
,类似于监控项
,我们继续从Tempalte OS Linux
模板的自动发现里面,参考Mounted filesystem discovery
和Network interface discovery
两项内容的配置,创建一模一样的规则过来。
另外,还可以使用模板的导出和导入功能。具体方法:先把Tempalte OS Linux
模板导出,然后对导出的模板(下载的XML文件)做处理(只保留上面两个自动发现规则),再导入为lzx-1 for discovery
模板。如下图:
监控的主机如果有很多,我们只需要配置模板就行,而不是每个主机都去配置一遍监控项、触发器、图形等,这样也太繁琐。相对于上面一步一步的操作,下面的操作更快更方便。
lzx-1
模板,点击链接的模板
:之后再点击选择
,选中Template OS Linux
之后再点击最下面的选择
,点击添加
→ 更新
,回到了模板列表页,但是lzx-1
的应用集等都有了变化,有些选项并不是我想添加的,删除它们(在删除应用集
之前需要先删除监控项
),但是遇到了意外情况,如下图:
lzx-1
里面,点击链接的模板
,可以看到取消链接
和取消链接并清理
,点击取消链接
之后再点击更新
:可以看到,虽然取消了链接,但是应用集等还是存在的,这是再删除监控项
就没问题了,如下图:
应用集
,删除后面没有数字的,其余保留:图形
,删除下图中选中的,其余保留:另外,触发器
和自动发现规则
不做修改,因为这就是我们之前想要的。
lzx
主机链接lzx-1
模板,与上面类似的步骤:之前把Zabbix设置为中文,现在就出现了一个问题,图形中的中文被显示为小方块。依次点击监测中
→ 图形
,群组选择lzx-test
,主机选择lzx
,图形选CPU load
,如下图:
要解决这个问题,就要找一款合适的字体放到zabbix对应的目录下面。
# vim /usr/share/zabbix/include/defines.inc.php # server上执行,搜索ZBX_FONTPATH
define('ZBX_FONTPATH', realpath('fonts')); // where to search for font (GD > 2.0.18) #路径为相对路径,显示为fonts,绝对路径为/usr/share/zabbix/fonts
define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name #字体文件为graphfont,绝对路径为/usr/share/zabbix/fonts/graphfont
C:\Windows\Fonts\
,找到simfang.ttf
(仿宋简体),复制到桌面上,利用lrzsz传到linux上:# rz
# ls
anaconda-ks.cfg simfang.ttf zabbix-release-3.4-2.el7.noarch.rpm
# mv simfang.ttf /usr/share/zabbix/fonts/
# cd /usr/share/zabbix/fonts/
# ls
graphfont.ttf simfang.ttf
# mv graphfont.ttf graphfont.ttf.bak
# mv simfang.ttf graphfont.ttf
刷新刚才的图形,已经能正常显示中文,如下图:
Zabbix的优势之一就是很方便地添加自定义监控项目,它虽然提供了丰富的模板,但依然不能满足各种各样的特殊需求。
假如我的需求是:监控某台Web服务器的80端口的并发连接数,并设置图形。
先分析该需求,有两步,第一步是要创建自定义监控项,第二步是要针对该监控项设置成图形。监控项目有一个核心元素就是数据源,有了数据源才可以创建监控项。
# vim /usr/local/sbin/estab.sh
#!/bin/bash
## 获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED # netstat -an可查看系统TCP连接数,ESTABLISHED表示正在连接中的状态,另外80后面多个空格是为了精确,避免包含8080端口
# chmod 777 /usr/local/sbin/estab.sh
# vim /etc/zabbix/zabbix_agentd.conf #增加下面两行
UnsafeUserParameters=1 #表示使用自定义脚本
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh #自定义监控项的key为my.estab.count,后面的[*]里面写脚本参数,没有可以省略,脚本为/usr/local/sbin/estab.sh
# systemctl restart zabbix-agent
# zabbix_get -s 192.168.33.129 -p 10050 -k 'my.estab.count'
0 #因为129服务器上没有任何80端口的访问,所以为0,只要能够获取到客户端的数据,就说明刚刚配置没有问题
依次点击配置
→ 主机
,找到lzx
主机,然后点击监控项
→ 创建监控项
,名称写80端口并发连接数
,键值写my.estab.conf
,类型保持默认,及被动模式,如果选择Zabbix客户端(主动式)
则为主动模式。其它项保持默认,点击最下面的添加
按钮,如下图:
监测中
→ 最新数据
,主机那里选择lzx
,名称写80端口
,然后点击应用
,则会过滤出刚刚添加的80端口并发连接数
监控项,如果没有,说明上一步有问题,如下图:配置
→ 主机
,再点击lzx
的图形
→ 创建图形
,名称写80端口并发连接数
,点击监控项
那一栏的添加
,在80端口并发连接数
打勾,然后点击选择
,再点击最下面的添加
,如下图:监控系统必须要有配置响应的告警方式,通常为邮件、短信、微信。这里,我以163邮箱为例,配置邮件告警。
POP3/SMTP服务
:登录163邮箱,点击设置
→ POP3/SMTP/IMAP
,开启两项服务,记住授权码
(第一次设置的话还会给绑定手机发验证码),如下图:
告警
:依次点击管理
→ 报警媒介类型
→ 创建媒体类型
,名称写baojing
,类型写脚本,脚本名字写mail.py
。脚本参数这里点击添加
,填写{ALERT.SENDTO}
;继续点添加
,填写{ALERT.SUBJECT}
;继续点添加
,填写ALERT.MESSAGE}
。最后点击最下面的更新
,如下图:
mail.py
:# grep 'AlertScriptsPath=' /etc/zabbix/zabbix_server.conf #查看脚本存放路径
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
# vim /usr/lib/zabbix/alertscripts/mail.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = 'smtp.163.com' #这里是QQ邮箱的话就是smtp.qq.com
gport = 25
try:
msg = MIMEText(unicode(content).encode('utf-8'))
msg['from'] = mailfrom
msg['to'] = mailto
msg['Reply-To'] = mailfrom
msg['Subject'] = subject
smtp = smtplib.SMTP(gserver, gport)
smtp.set_debuglevel(0)
smtp.ehlo()
smtp.login(username,password)
smtp.sendmail(mailfrom, mailto, msg.as_string())
smtp.close()
except Exception,err:
print "Send mail failed. Error: %s" % err
def main():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码
sendqqmail('[email protected]','aaaaaaaaaa','[email protected]',to,subject,content) #填写自己的邮箱和授权码(上面的aaaaaaaaaa表示授权码)
if __name__ == "__main__":
main()
# chmod 777 /usr/lib/zabbix/alertscripts/mail.py #给予执行权限
这是一个python脚本,CentOS 7默认自带Python2.7。可以使用下面命令测试看能否发邮件:
# cd /usr/lib/zabbix/alertscripts/
# python mail.py [email protected] "lzx" "123123" #看自己能否收到标题为lzx、内容为123123的邮件
这里可以看到我在网页上成功发送,而且也接收到,如下图:
这就说明上面的邮件脚本没有问题。
管理
→ 用户
→ 创建用户
,设置用户
属性,这里按照自己情况随意设置即可,如下图:再设置报警媒介
,点击添加
,输入163邮箱账户,点击最下面添加
,如下图:
再设置权限
,这一项基本上不需要改动,保持默认即可,如下图:
管理
→ 用户群组
→ Zabbix administrators
→ 权限
,选中所有群组给读写权限
,否则邮件也无法收到,如下图:再回到lzx
用户里面查看权限
,可以看到已经有了读写权限,如下图:
动作
来完成发邮件的功能。依次点击配置
→ 动作
→ 创建动作
,首先在动作
页中,名称填sendmail
,还要添加触发条件
,如下图:操作
页,只需要修改默认信息,内容如下:HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID} #都是zabbix的内部变量
然后点击操作
下面的新的
。会出现操作细节,选择用户为lzx
,仅发送到选择baojing
,继续点击添加
(不是最下面的添加
),如下图:
恢复操作
页面,默认信息改为上面同样内容,然后点击新的
,出现操作细节,也要指定发送用户为lzx
,仅发送到选择baojing
,操作过程与上面类似,如下图:完成上面两个操作之后,点击最下面的添加
。
lzx
新链接一个模板,依次点击配置
→ 主机
,进入主机页面,点击模板
,点击右侧选择
,找到Template Module ICMP Ping
打勾,点击选择
→ 添加
,最后点击更新
:# iptables -I INPUT -p icmp -j DROP #禁掉ICMP协议,这样服务端就无法ping通客户端
稍等一会,就收到了这样的告警邮件,如下图:
Web界面也有显示:
# iptables -D INPUT -p icmp -j DROP
同样会收到故障恢复的邮件,如下图:
Web界面也有显示:
至此,整个Zabbix监控的部署已经完成。
更多参考资料:
zabbix监控交换机(思科)
zabbix分布式部署