Zabbix介绍

  • Zabbix 是一个基于Web界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案
  • Zabbix 能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题
  • Zabbix 是由 Alexei Vladishev 创建,目前由 Zabbix SIA 在持续开发和支持
  • Zabbix 是一款能够监控各种网络参数以及服务器健康性和完整性的软件
  • Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题,基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能,这些功能使得 Zabbix成为容量规划的理想方案
  • Zabbix 支持主动轮询和被动捕获
  • Zabbix 所有的报告、统计信息和配置参数都可以通过基于Web的前端页面进行访问,基于Web的前端页面可以确保监控者从任何方面评估网络状态和服务器的健康性
  • Zabbix是免费
  • Zabbix官网

Zabbix优点

  • 自动发现服务器和网络设备
  • 底层自动发现(如自动发现多实例mysql、tomcat进程等)
  • 分布式的监控体系和集中式的Web管理
  • 支持主动监控和被动监控模式
  • 支持多种操作系统linux,Solaris,HP-UX,AIX,FreeBSD,OpenBSD等
  • 高效的Agent支持linux,Solaris,HP-UX,AIX,FreeBSD,OpenBSD,windows NT4.0,window2000等
  • 无Agent监控等多种监控方法(如:用SNMP协议监控路由或交换机、IPMI检测硬件温度等)
  • 安全的用户认证模式
  • 灵活的用户权限设置
  • 基于Web的管理方法,支持自由的定义事件和邮件发送
  • 高水平的业务视图监控资源,支持日志审计
  • 开放式接口,扩展性强,插件编写容易

Zabbix缺点

  • 需在被监控主机上安装 agent,所有数据都存在数据库里,产生的数据据很大,瓶颈主要在数据库
  • 项目批量修改不方便
  • 社区虽然成熟,但是中文资料相对较少,服务支持有限
  • 入门容易,能实现基础的监控,但是深层次需求需要非常熟悉Zabbix并进行大量的二次开发难度较大,需要分析MySQL表结构,表结构比较复杂,通过API开发对开发能力有要求
  • 系统级别报警设置相对比较多,如果不筛选的话报警邮件会很多;并且自定义的项目报警需要自己设置,过程比较繁琐
  • 缺少数据汇总功能,如无法查看一组服务器平均值,需进行二次开发

Zabbix架构

Zabbix架构图如下图所示:

Zabbix - 图1

  • Zabbix_Server:Zabbix的服务端,是整个监控体系中最核心的组件,它负责接收客户端发送的报告信息,所有配置、 统计数据及操作数据都由它组织
  • 数据库存储:所有配置信息和Zabbix收集到的数据都被存储在数据库中
  • Web界面:为了从任何地方和任何平台都可以轻松的访问Zabbix,提供了基于Web的Zabbix界面,该界面是Zabbix Server的一部分,通常跟Zabbix Server运行在同一台物理机
  • Zabbix_Proxy:用于监控节点非常多的分布式环境中,它可以代理Zabbix_Server的功能,减轻Zabbix_Server的压力
  • Zabbix_Agent:Zabbix的客户端软件,用于采集各监控项目的数据,并把采集的数据传输给Zabbix_Proxy或Zabbix_Server

Zabbix监控方式

主动模式

  • 主动检测:相对于Agent而言,Agent向Server请求与自己相关监控项配置,主动地将Server配置的监控项相关的数据发送给Server
  • 优点:能极大节约Server的资源

被动模式

  • 被动检测:相对于Agent而言,Server向Agent请求获取配置的各监控项相关的数据, Agent接收请求、获取数据并响应给Server

管理员可以在agent端使用一个名为zabbix_sender的工具,测试是否能够向server端发送数据

管理员可以在server端使用一个名为zabbix_get的工具,测试是否能够从agent端拉取数据

Zabbix术语

  • 主机:一台被监控的网络设备,用IP或域名表示
  • 主机组:主机的逻辑组,它包含主机和模板;一个主机组里的主机和模板之间并没有任何直接的关联,通常在给不同用户组的主机分配权限时候使用主机组
  • 监控项:想要接收的主机的特定数据,是一个度量数据
  • 触发器:一个被用于定义问题阈值和“评估”监控项接收到的数据的逻辑表达式
    • 数据本身无对错,只有定义了阈值以后,数据才会被分门别类
    • 当接收到的数据高于阈值时,触发器从“OK”变成“Problem”状态
    • 当接收到的数据低于阈值时,触发器保留/返回一个 “OK”的状态

Zabbix部署

安装Zabbix服务端

官网安装教程

  • 准备yum源,然后安装Zabbix组件
  1. rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
  2. yum clean all
  3. yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y
  • 关闭SElinux,防火墙
  1. setenforce 0
  2. systemctl stop firewalld

准备数据库

  • 安装数据库,设置密码
  1. yum install mariadb-server -y
  2. systemctl start mariadb
  3. systemctl enable mariadb
  4. mysqladmin password 1
  • 创建zabbix数据库,zabbix用户,并且授予权限
  1. MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
  2. MariaDB [(none)]> create user zabbix@localhost identified by '000000';
  3. MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost;
  4. MariaDB [(none)]> flush privileges;

修改服务端的配置

  • 导入初始架构数据
  1. [root@server1 ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
  2. Enter password: # 输入密码000000

此时zabbix数据库中会多出来很多表,下图为不完全展示

Zabbix - 图2

  • 为Zabbix配置数据库,编辑配置文件/etc/zabbix/zabbix_server.conf
  1. [root@server1 ~]# vim /etc/zabbix/zabbix_server.conf
  2. DBPassword=000000
  • 为Zabbix前端配置PHP
  1. [root@server1 ~]# vim /etc/httpd/conf.d/zabbix.conf
  2. php_value max_execution_time 300
  3. php_value memory_limit 128M
  4. php_value post_max_size 16M
  5. php_value upload_max_filesize 2M
  6. php_value max_input_time 300
  7. php_value max_input_vars 10000
  8. php_value always_populate_raw_post_data -1
  9. php_value date.timezone Asia/Shanghai # 修改这一行
  • 启动Zabbix server和agent进程,并为它们设置开机自启
  1. systemctl restart zabbix-server zabbix-agent httpd
  2. systemctl enable zabbix-server zabbix-agent httpd

访问Web界面

  • 通过http://IP地址/zabbix进行访问,此时会进入初始化界面,一直按下一步

Zabbix - 图3

Zabbix - 图4

  • 输入mysql端口号以及用户zabbix的密码

Zabbix - 图5

Zabbix - 图6

Zabbix - 图7

  • 初始化完成之后进行登录

用户名:Admin

密码:zabbix

Zabbix - 图8

  • 至此一个Zabbix服务就搭建完成了

Zabbix - 图9

  • 修改界面为中文

Zabbix - 图10

Zabbix - 图11

客户端配置

  • 安装zabbix客户端软件
  1. rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
  2. yum clean all
  3. yum install zabbix-agent -y
  • 修改配置文件
  1. [root@server2 ~]# vim /etc/zabbix/zabbix_agentd.conf
  2. Server=192.168.31.10 # 服务端的IP地址
  3. ServerActive=192.168.31.10 # 服务端的IP地址
  4. Hostname=Zabbix agent-2 # 设置监控客户端的主机名
  • 关闭SElinux、防火墙、启动Zabbix客户端服务
  1. [root@server2 ~]# setenforce 0
  2. [root@server2 ~]# systemctl stop firewalld
  3. [root@server2 ~]# systemctl start zabbix-agent.service

Zabbix界面操作

Zabbix - 图12

添加新的监控主机

配置 >> 主机 >> 创建主机

Zabbix - 图13

点击主机名,然后为其配置模板

Zabbix - 图14

先点小添加,然后点更新

Zabbix - 图15

等待ZBX标变绿,变绿了就表示监控成功

Zabbix - 图16

查看监控内容

监测 >> 最新数据

然后过滤出想要查看监测内容的主机,点击应用

Zabbix - 图17

Zabbix - 图18

点击图形,即可进入图形化监测界面

Zabbix - 图19

也可直接点击监测 >> 图形然后筛选出想要查看的主机

Zabbix - 图20

自定义配置监控

自定义配置目录:/etc/zabbix/zabbix_agentd.d/

自定义配置语法:UserParameter=<key>,<shell command>

  • 编写自定义监控项的配置文件,监控Nginx进程数
  1. [root@server2 ~]# vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
  2. UserParameter=nginx_process_num,ps -ef | grep -c [n]ginx
  • 进入Web端添加监控项,注意这里的键值要与客户端配置文件中的键值一致,否则就无法监控成功
    • 配置 >> 主机 >> 监控项 >> 创建监控项

Zabbix - 图21

  • 查看监控数据

Zabbix - 图22

zabbix_get

管理员可以在server端使用一个名为zabbix_get的工具,测试是否能够从agent端获取数据,可以很方便判断问题

语法:zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key

  1. [root@server1 ~]# yum install -y zabbix-get
  2. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_process_num
  3. 5

Redis自定义配置

  1. [root@server2 ~]# vim /etc/zabbix/zabbix_agentd.d/redis.conf
  2. UserParameter=Redis.Status,/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG
  3. UserParameter=Redis_conn[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "connected_clients" | awk -F':' '{print $2}'
  4. UserParameter=Redis_rss_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_rss" | awk -F':' '{print $2}'
  5. UserParameter=Redis_lua_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_lua" | awk -F':' '{print $2}'
  6. UserParameter=Redis_cpu_sys[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys" | awk -F':' '{print $2}'
  7. UserParameter=Redis_cpu_user[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user" | awk -F':' '{print $2}'
  8. UserParameter=Redis_cpu_sys_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}'
  9. UserParameter=Redis_cpu_user_cline[*],/usr/local/redis/bin/redis-cli -h $1 - p $2 info | grep -w "used_cpu_user_children" | awk -F':' '{print $2}'
  10. UserParameter=Redis_keys_num[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "$$1" | grep -w "keys" | grep db$3 | awk -F'=' '{print $2}' | awk -F',' '{print $1}'
  11. UserParameter=Redis_loading[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep loading | awk -F':' '{print $$2}'
  12. # Redis.Status --检测Redis运行状态,返回整数
  13. # Redis_conn --检测Redis成功连接数,返回整数
  14. # Redis_rss_mem --检测Redis系统分配内存,返回整数
  15. # Redis_lua_mem --检测Redis引擎消耗内存,返回整数
  16. # Redis_cpu_sys --检测Redis主程序核心CPU消耗率,返回整数
  17. # Redis_cpu_user --检测Redis主程序用户CPU消耗率,返回整数
  18. # Redis_cpu_sys_cline --检测Redis后台核心CPU消耗率,返回整数
  19. # Redis_cpu_user_cline --检测Redis后台用户CPU消耗率,返回整数
  20. # Redis_keys_num --检测库键值数,返回整数
  21. # Redis_loding --检测Redis持久化文件状态,返回整数
  22. [root@server2 ~]# systemctl restart zabbix-agent

Nginx自定义配置

  1. [root@server2 ~]# vim /etc/nginx/conf.d/default.conf
  2. location /nginx-status
  3. {
  4. stub_status on;
  5. access_log off;
  6. allow 127.0.0.1;
  7. deny all;
  8. }
  9. [root@server2 ~]# systemctl restart nginx

Zabbix - 图23

Active connections:当前活动客户端连接数,包括Waiting连接数

accepts:接受的客户端连接总数

handled:处理的连接总数

requests:客户端请求的总数

Reading:Nginx 正在读取请求头的当前连接数

Writing:Nginx 将响应写回客户端的当前连接数

Waiting:当前等待请求的空闲客户端连接数

  • 创建Nginx的7个监控项分别为nginx_activenginx_readnginx_writenginx_waitnginx_acceptednginx_handlednginx_requests
  1. [root@server2 ~]# curl -s "http://127.0.0.1:80/nginx-status"
  2. Active connections: 1
  3. server accepts handled requests
  4. 19 19 31
  5. Reading: 0 Writing: 1 Waiting: 0
  6. [root@server2 ~]# vim /etc/zabbix/zabbix_agentd.d/nginx_status.conf
  7. UserParameter=nginx_active,curl -s "http://127.0.0.1:80/nginx-status" | awk '/Active/ {print $3}'
  8. UserParameter=nginx_read,curl -s "http://127.0.0.1:80/nginx-status" | grep 'Reading' | cut -d" " -f2
  9. UserParameter=nginx_write,curl -s "http://127.0.0.1:80/nginx-status" | grep 'Writing' | cut -d" " -f4
  10. UserParameter=nginx_wait,curl -s "http://127.0.0.1:80/nginx-status" | grep 'Waiting' | cut -d" " -f6
  11. UserParameter=nginx_accepted,curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $1}'
  12. # 这个正则表达式的值意思是以“空格数字空格数字空格数字”开头的一行中取第一个数字,以空格为分隔符取第一个值,也就是accepts
  13. UserParameter=nginx_handled,curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $2}'
  14. UserParameter=nginx_requests,curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $3}'
  15. [root@server2 ~]# systemctl restart zabbix-agent
  • 在服务端使用zabbix-get进行测试
  1. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_active
  2. 1
  3. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_read
  4. 0
  5. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_write
  6. 1
  7. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_wait
  8. 0
  9. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_accepted
  10. 52
  11. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_handled
  12. 53
  13. [root@server1 ~]# zabbix_get -s 192.168.31.20 -k nginx_requests
  14. 66

TCP自定义配置

  1. [root@server2 ~]# vim /etc/zabbix/alertscripts/tcp_connection.sh
  2. #!/bin/bash
  3. function ESTAB {
  4. /usr/sbin/ss -ant |awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}'
  5. }
  6. function TIMEWAIT {
  7. /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}'
  8. }
  9. function LISTEN {
  10. /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}'
  11. }
  12. $1
  13. [root@server2 ~]# vim /etc/zabbix/zabbix_agentd.d/cattcp.conf
  14. UserParameter=tcp[*],/etc/zabbix/alertscripts/tcp_connection.sh $1
  15. # tcp[TIMEWAIT] --检测TCP的驻留数,返回整数
  16. # tcp[ESTAB] --检测tcp的连接数、返回整数
  17. # tcp[LISTEN] --检测TCP的监听数,返回整数

模板和应用集的操作

模板和应用集都可以方便一次性添加很多监控项,以及保存之前配置好的监控项

每个模板中可以包含很多应用集

每个应用集中可以包含很多监控项

以上面Nginx自定义配置的七个监控项为例,进行模板和应用集的添加操作:

  1. 将这些监控项去Web界面进行添加,首先创建模板
    • 配置 >> 模板 >> 创建模板
    • 模板命名为**Template Nginx Status**

Zabbix - 图24

  1. 然后创建应用集,应用集就相当于是一个文件夹的作用,用来归类监控项
    • 点击创建好的模板 >> 应用集 >> 创建应用集
    • 应用集命名为**Nginx Status**

Zabbix - 图25

  1. 然后添加上述7个监控项到这个应用集中

Zabbix - 图26

  1. 最终如下图所示

Zabbix - 图27

  1. 将模板链接到需要监控的主机,这样那个主机就可以拥有这个模板的所有监控项
    • 配置 >> 主机 >> [主机名] >> 模板

Zabbix - 图28

  1. 添加后如下图所示

Zabbix - 图29

  1. 进行数据的监控

Zabbix - 图30

Zabbix邮件告警

使用上文中的自定义配置监控nginx_process_num

  1. 配置QQ邮箱SMTP服务,生成授权码

Zabbix - 图31

  1. 管理 >> 报警媒介管理,在Web界面配置报警媒介,下图中的密码即为上图中的授权码

Zabbix - 图32

  1. 修改用户的报警媒介Email:管理 >> 用户 >> 报警媒介

Zabbix - 图33

  1. 配置触发器:配置 >> 主机 >> [已创建主机的触发器] >> 创建触发器

Zabbix - 图34

  1. 配置完触发器后的结果

Zabbix - 图35

  1. 配置动作:配置 >> 动作,如下图所示,这些默认标题或者消息内容都可以进行更改
    • {}中的是变量

Zabbix - 图36

  1. server2停用Nginx服务,使Nginx进程数为0,可以发现zabbix进行了邮箱告警
  1. systemctl stop nginx.service

Zabbix - 图37

Zabbix - 图38

  1. server2重启开启Nginx服务,使Nginx进程数恢复,可以发现zabbix也发送了邮箱告知故障已经恢复

Zabbix - 图39

Zabbix钉钉告警

使用上文中的自定义配置监控nginx_process_num

  1. 添加钉钉群聊
  2. 添加群机器人(需要在电脑端操作),将Webhook记录下来,这是传递数据的重要地址,同时也可以设置好关键词,这样的话保证安全性,也就是说只有包含“zabbix”的内容可以推送到钉钉

Zabbix - 图40

  1. 下载需要用的python库,并编写python脚本,需要写在/usr/lib/zabbix/alertscripts
  1. [root@server1 ~]# yum install -y python-requests
  2. [root@server1 ~]# vim /usr/lib/zabbix/alertscripts/zabbix_send_ding.py
  3. #!/usr/bin/python
  4. import requests
  5. import json
  6. import sys
  7. import os
  8. headers = {'Content-Type': 'application/json;charset=utf-8'}
  9. api_url = "https://oapi.dingtalk.com/robot/send?access_token=1c05621a2ed8f043f071a33e0d63b3400e238ac10bf38d55a4413d3c5882807c"
  10. def msg(text):
  11. json_text= {
  12. "msgtype": "text",
  13. "at": {
  14. "atMobiles": [
  15. "13333333333"
  16. ],
  17. "isAtAll": True
  18. },
  19. "text": {
  20. "content": text
  21. }
  22. }
  23. print requests.post(api_url,json.dumps(json_text),headers=headers).content
  24. if __name__ == '__main__':
  25. # text = "我是Zabbix告警机器人"
  26. text = sys.argv[1]
  27. # 意思是传递第一个参数,例如 ./zabbix_send_ding.py "hello",那么text就是"hello",因为这是后面紧接着的第一个参数
  28. msg(text)
  29. [root@server1 ~]# systemctl restart zabbix-server.service
  30. [root@server1 ~]# cd /usr/lib/zabbix/alertscripts
  31. [root@server1 alertscripts]# chmod +x zabbix_send_ding.py
  32. [root@server1 alertscripts]# ./zabbix_send_ding.py
  1. 创建报警媒介:管理 >> 报警媒介类型 >> 创建报警媒介

Zabbix - 图41

  1. 创建报警媒介的用户,这里的收件人填写手机号码就可以

Zabbix - 图42

  1. 添加动作,编写发送的消息

Zabbix - 图43

  1. 停止以及启动Nginx服务,可以发现zabbix进行了钉钉告警

Zabbix - 图44

Zabbix - 图45