Zabbix监控服务部署和应用

Zabbix 介绍

  1. Zabbix 是一个企业级分布式开源监控解决方案。
  2. Zabbix 软件能够监控众多网络参数和服务器的健康度、完整性。
  3. Zabbix 使用灵活的告警机制,允许用户为几乎任何事件配置基于邮件的告警。这样用户可以快速响应服务器问题。
  4. Zabbix 基于存储的数据提供出色的报表和数据可视化功能。
  5. Zabbix 支持主动轮询(polling)和被动捕获(trapping)。
  6. Zabbix所有的报表、统计数据和配置参数都可以通过基于 Web 的前端页面进行访问。基于 Web 的前端页面确保您可以在任何地方访问您监控的网络状态和服务器健康状况。适当的配置后,Zabbix 可以在监控 IT 基础设施方面发挥重要作用。

Zabbix 功能

Zabbix 是一个高度成熟完善的网络监控解决方案,一个的软件包中包含了多种功能。
  1. 数据采集
  2. 灵活的阈值定义
  3. 高度可配置化的告警
  4. 实时图形
  5. Web 监控功能
  6. 丰富的可视化选项
  7. 历史数据存储
  8. 配置简单
  9. 使用模板
  10. 网络发现
  11. 快捷的 Web 界面
  12. Zabbix API:Zabbix API 为 Zabbix 提供可编程接口,用于批量操作、第三方软件集成和其他用途。
  13. 权限管理系统
  14. 功能强大且易于扩展的 Zabbix Agent:部署于被监控对象上;
  15. 二进制守护进程
  16. 适应更复杂的环境:使用 Zabbix Proxy 代理,可以轻松实现分布式远程监控。

Zabbix 架构

Zabbix 由几个主要的功能组件组成,其功能介绍如下所示。

Server

Zabbix server 是 Zabbix软件的核心组件,agent 向其报告可用性、系统完整性信息和统计信息。server也是存储所有配置信息、统计信息和操作信息的核心存储库。

数据库

所有配置信息以及 Zabbix 采集到的数据都被存储在数据库中。

Web 界面

为了从任何地方和任何平台轻松访问 Zabbix ,我们提供了基于 web 的界面。该界面是 Zabbix server 的一部分,通常(但不一定)和 Zabbix server 运行在同一台物理机器上。

Proxy

Zabbix proxy 可以代替 Zabbix server采集性能和可用性数据。Zabbix proxy在Zabbix的部署是可选部分;但是proxy的部署可以很好的分担单个Zabbix server的负载。

Agent

Zabbix agents 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给 Zabbix server。

数据流

Zabbix 内部的数据流对Zabbix的使用也很重要。
  • 为了创建一个采集数据的监控项,必须先创建主机。
  • 在任务的另外一端,必须要有监控项才能创建触发器(trigger),必须要有触发器来创建动作(action)。
  • 想要收到类似“X个server上CPU负载过高”这样的告警,必须首先为 Server X 创建一个主机条目,其次创建一个用于监控其 CPU的监控项,最后创建一个触发器,用来触发 CPU负载过高这个动作,并将其发送到您的邮箱里。
  • 使用模板的话,实际操作非常简单。
  • 由于这种设计,使得 Zabbix 的配置变得更加灵活易用。

Zabbix安装:

通过apt-get安装

Zabbix服务器的平台:Zabbix4.2-Ubuntu-1804-Mariadb

安装 数据库
# wget https://repo.zabbix.com/zabbix/4.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.2-1+bionic_all.deb
# dpkg -i zabbix-release_4.2-1+bionic_all.deb
# apt update
安装Zabbix server,Web前端,agent
# apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-agent 
创建初始数据库
# mysql -uroot -p
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
mysql> quit;
导入初始架构和数据,系统将提示您输入新创建的密码。
# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
为Zabbix server配置数据库

编辑配置文件 /etc/zabbix/zabbix_server.conf

DBPassword=password
为Zabbix前端配置PHP

编辑配置文件 /etc/zabbix/apache.conf, uncomment and set the right timezone for you.

# php_value date.timezone Asia/Shanghai
启动Zabbix server和agent进程

启动Zabbix server和agent进程,并为它们设置开机自启:

# systemctl restart zabbix-server zabbix-agent apache2
# systemctl enable zabbix-server zabbix-agent apache2

Zabbix server已经安装完成并开始运行

配置Zabbix前端

连接到新安装的Zabbix前端: http://server_ip_or_name/zabbix

必须全部显示为OK状态

配置zabbix前端连接zabbix数据库

配置后端zabbix server地址

完成zabbix前端安装

如果前端配置数据库地址错误了,可在以下目录中的Zabbix连接数据库配置文件进行修改:

# vim /usr/share/zabbix/conf/zabbix.conf.php
开始使用Zabbix

默认用户名和密码为:Adminzabbix

可更改语言为中文,但画图的时候,图表下方会有乱码,可将下载好的阿里普惠体字体.tff文件放到以下目录,并修改Zabbix默认文字配置,即可修复乱码。

# ll /usr/share/zabbix/assets/fonts/    #此目录为Zabbix存放字体目录,放入阿里普惠字体,也可直接替换该文件为目标字体文件名
-rw-r--r-- 1 root     root     9779528 Apr 27 02:11 Regular.ttf

# vim /usr/share/zabbix/include/defines.inc.php     #修改Zabbix字体为阿里普惠字体
69 define('ZBX_GRAPH_FONT_NAME',           'Regular'); // font file name
110 define('ZBX_FONT_NAME', 'Regular');

使用源代码包安装

[Fri Jul 12 23:22
 root@docker2 /usr/local/src]#ll
total 16752
drwxr-xr-x 13 1001 1001     4096 Jun 26 19:20 zabbix-4.0.10/
-rw-r--r--  1 root root 17140053 Jul 12 20:40 zabbix-4.0.10.tar.gz
添加zabbix用户和组,运行zabbix的用户最好是非特权用户,如果一个守护进程以“root”启动,它会切换到“zabbix”用户,且这个用户必须存在。
# groupadd zabbix
# useradd -g zabbix zabbix
如果 Zabbix server 和 agent 运行在相同的机器上,建议使用不同的用户运行来 Zabbix server 和 agent。否则 agent 可以访问 zabbix server 配置文件,很危险。

创建 Zabbix 数据库

Mariadb
shell> mysql -uroot -p<password>
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@172.16.36.% identified by '123456';
MariaDB [(none)]> quit;
从zabbix server端拷贝数据库执行文件到远端数据库主机:可在本机执行
/usr/local/src]#scp -r zabbix-4.0.10/database/mysql/ 172.16.36.23:/usr/local/src
执行相关数据库文件,写入数据库
shell> cd /usr/local/src/mysql
shell> mysql -uzabbix -p<password> zabbix < schema.sql
# stop here if you are creating database for Zabbix proxy
shell> mysql -uzabbix -p<password> zabbix < images.sql
shell> mysql -uzabbix -p<password> zabbix < data.sql
开始编译前,安装必要的依赖包
# Openjdk可自行下载官方二进制包进行安装,安装后设置库环境变量
# apt-get install libmysqlclient-dev gcc libxml2-dev snmp libsnmp-dev curl libcurl4-openssl-dev openjdk-8-jdk libevent-dev apache2 apache2-bin \
apache2-data apache2-utils fontconfig-config fonts-dejavu-core fping javascript-common libapache2-mod-php7.2 libapr1 \
libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libblas3 libcgi-fast-perl libcgi-pm-perl  libencode-locale-perl libevent-core-2.1-6 \
libfcgi-perl libfontconfig1 libgd3 libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl  libhttp-date-perl libhttp-message-perl \
libiksemel3 libio-html-perl libjbig0 libjpeg-turbo8 libjpeg8 libjs-jquery libjs-jquery-ui  libjs-prototype liblinear3 liblua5.2-0 liblua5.3-0 \
liblwp-mediatypes-perl libodbc1 libopenipmi0 libpq5 libsensors4 libsnmp-base libsnmp30  libsodium23 libssh2-1 libtiff5 libtimedate-perl \
liburi-perl libwebp6 libxpm4 nmap php php-bcmath php-common php-gd php-ldap php-mbstring php-pgsql php-xml php7.2 php7.2-bcmath \
php7.2-cli  php7.2-common php7.2-gd php7.2-json php7.2-ldap php7.2-mbstring php7.2-opcache php7.2-pgsql php7.2-readline libdbd-mysql-perl \
php7.2-xml snmpd ssl-cert  traceroute ttf-dejavu-core  -y
开始编译,并于完成后开始安装
[Sat Jul 13 11:10
 root@docker2 /usr/local/zabbix]# ./configure --prefix=/apps/zabbix --enable-server --enable-proxy --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java
***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

[Sat Jul 13 11:10
 root@docker2 /usr/local/zabbix]# make install
自定义zabbix server启动脚本zabbix-server.service
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/apps/zabbix_server/etc/zabbix_server.conf"
EnvironmentFile=-/etc/default/zabbix-server
Type=forking
Restart=on-failure
PIDFile=/apps/zabbix_server/run/zabbix_server.pid
KillMode=control-group
ExecStart=/apps/zabbix_server/sbin/zabbix_server -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target
自定义zabbix agent启动脚本zabbix-agent.service
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/apps/zabbix_server/etc/zabbix_agentd.conf"
EnvironmentFile=-/etc/default/zabbix-agent
Type=forking
Restart=on-failure
PIDFile=/apps/zabbix_server/run/zabbix_agentd.pid
KillMode=control-group
ExecStart=/apps/zabbix_server/sbin/zabbix_agentd  -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s

[Install]
WantedBy=multi-user.target
自定义zabbix java gateway启动脚本zabbix-java-gateway.service,此脚本有问题,慎用
[Unit]
Description=Zabbix Java Gateway
After=syslog.target
After=network.target

[Service]
Type=forking
KillMode=process
PIDFile=/apps/zabbix_server/run/zabbix_java_gateway.pid
ExecStart=/apps/zabbix_server/sbin/zabbix_java/startup.sh
ExecStop=/bin/kill -SIGTERM $MAINPID
SuccessExitStatus=143
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target
zabbix server配置文件更改数据库连接信息
[Sat Jul 13 11:54
 root@docker2 /var/www/html/zabbix]#grep "^[a-Z]" /apps/zabbix_server/etc/zabbix_server.conf
LogFile=/apps/zabbix_server/log/zabbix_server.log
PidFile=/apps/zabbix_server/run/zabbix_server.pid
DBHost=172.16.36.23
DBName=zabbix
DBUser=zabbix
DBPassword=123456
Timeout=30
LogSlowQueries=3000
安装前端web服务
# systemctl start apache2
# /var/www/html]#mkdir zabbix
# /var/www/html]#cd zabbix/
# /var/www/html/zabbix]#cp  -a /usr/local/zabbix/frontends/php/* .

访问http://172.16.36.21/zabbix

解决下图中的FALL。

/var/www/html/zabbix]#vim /etc/php/7.2/apache2/php.ini
674 post_max_size = 16M
385 max_execution_time = 300
395 max_input_time = 300
941 date.timezone = Asia/Shanghai

更改完毕后重启apache2服务,全部ok,可进行下一步

踩了一个坑,此zabbix server和mariadb分别安装在不同的服务器,但上面安装各种包的时候,把default-mysql-server给装上了,然后又给卸载了,导致前端web配置时,数据库选择只有PstgreSQL,后排查少了一个php-mysql包,

# apt-get install php-mysql -y

配置数据库信息

配置zabbix后端server

保存数据库配置信息文件到本地,并上传到/var/www/html/zabbix/conf/zabbix.conf.php目录下

完成web前端配置

更改语言同上,只是上传字体目录改到/var/www/html/zabbix/assets/fonts

修改# vim /etc/locale.gen文件,将zh_CN.UTF-8 UTF-8前面的#号去掉。然后执行# locale.gen,使中文包生效。阿里开源字体,可商用,使用无忧虑。

通常情况下,本机的server-agent并没有开启,所以登录进来后会有一条失败警告信息,还有就是swap,本机若没有swap分区也会报一条警告信息。agent开启就好,swap关闭监控项就好。

至此,zabbix安装完毕。


Zabbix应用

官方文档

https://www.zabbix.com/documentation/4.0/zh/manual/quickstart/host

官方zabbix下载

https://www.zabbix.com/download?zabbix=4.0&os_distribution=centos&os_version=7&db=mysql

快速入门:

添加主机:

如果添加的主机为远程主机,第一步需要在远端主机上安装apt-get install zabbix-agent,然后修改代理配置文件,启动代理即可。内容如下:

[Sat Jul 13 15:20
 root@docker1 ~]# grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=172.16.36.21     #此项为zabbix server IP地址
ServerActive=127.0.0.1
Hostname=172.16.36.20       #此项为在监控端显示的名称,通常写成本机IP地址
Include=/etc/zabbix/zabbix_agentd.d/*.conf
在Zabbix Web界面中简单的添加一台主机:

配置-》主机-》点击下方现有主机-》最下方有一个克隆-》主机名称和可见名称写被监控端IP地址即可-》群组自定义或选择现有,特别机器多的公司,可把不同功能的主机放到一个群组,方便分配管理人员-》agent代理程序的接口:写被监控端IP地址和端口-》选择模板-》给被监控机添加模板,如Template OS Linux,后期可上传自定义模板-》点添加即可添加主机。

添加成功后,正常情况下,后方ZBX会变为绿色

编译安装的zabbixbin目录下,有一个可执行的二进制文件zabbix-get,此二进制文件可用于排错,当控制端添加一台被监控机时,长时间采集不到被监控机数据时,使用此命令可判断能否真正采集到数据。

[Sat Jul 13 15:42
 root@docker2 /lib/systemd/system]#zabbix_get --help
usage:
  zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key
  zabbix_get -h
  zabbix_get -V

Get data from Zabbix agent.

General options:
  -s --host host-name-or-IP  Specify host name or IP address of a host
  -p --port port-number      Specify port number of agent running on the host
                             (default: 10050)
  -I --source-address IP-address   Specify source IP address

  -k --key item-key          Specify key of the item to retrieve value for

  -h --help                  Display this help message
  -V --version               Display version number

TLS connection options:
  Not available. This 'zabbix_get' was compiled without TLS support

Example(s):
  zabbix_get -s 127.0.0.1 -p 10050 -k "system.cpu.load[all,avg1]"

Report bugs to: <https://support.zabbix.com>
Zabbix home page: <http://www.zabbix.com>
Documentation: <https://www.zabbix.com/documentation>

# 测试用法:
[Sat Jul 13 15:42
 root@docker2 /lib/systemd/system]#zabbix_get -s 172.16.36.20 -p 10050 -k "system.cpu.util[,iowait]"
0.008353

[Sat Jul 13 15:44
 root@docker2 /lib/systemd/system]#zabbix_get -s 172.16.36.20 -p 10050 -k "system.hostname"
docker1.martinhe.com

监控TomCat服务

tomcat模板里的内容分为不同的采集方式,如果改成zabbix客户端主动模式,就会报错。

Zabbix server监控java app时,需要经过中间服务java gateway,此服务需要java环境,java app上会监听jmx:12345,java gatewayjava app上通过jmx协议采集数据返回给Zabbix server,之后Zabbix server将数据存储到zabbix数据库里,当zabbix web前端调取画图时,再从zabbix数据库读取相应主机数据进行画图展示。

安装Java环境
# apt-get install openjdk-8-jdk
#java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

上传tomcat压缩包,并配置
/usr/local/src]#ll
drwxr-xr-x  9 root root    4096 Jul 13 16:13 apache-tomcat-8.5.42/
-rw-r--r--  1 root root 9711748 Jun 20 23:54 apache-tomcat-8.5.42.tar.gz

/usr/local]#ln -sv /usr/local/src/apache-tomcat-8.5.42 tomcat
'tomcat' -> '/usr/local/src/apache-tomcat-8.5.42'

启动tomcat服务
/usr/local/tomcat]#./bin/catalina.sh start

自建模拟`app:martin`
/usr/local/tomcat/webapps]#mkdir martin
/usr/local/tomcat/webapps/martin]#vim index.jsp
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起  
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>martin.com</title>
</head>
<body>
欢迎来到我的站点:
<%
out.println("/usr/local/tomcat/webapps/martin/index.jsp");
%>
</body>
</html>
测试访问:

配置tomcat监控项,在java app主机的172.16.36.23# vim /usr/local/tomcat/bin/catalina.sh加入如下参数,重启tomcat服务:

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=172.16.36.23"    #本机地址,必须为本机地址

查看JMX:12345端口启动情况

window下测试java app主机的JMX是否正常,安装jdk-8u192-development包,然后在C:\Program Files\Java\jdk1.8.0_192\bin\jconsole.exe,运行该程序,输入JMX服务主机地址和端口进行连接。数据采集正常会如下显示。

java gateway主机172.16.36.20上安装apt-get isntall zabbix-java-gateway,并配置/etc/zabbix/zabbix_java_gateway.conf如下信息,并重启#systemctl start zabbix-java-gateway服务。

[Sat Jul 13 17:35
 root@docker1 ~]#grep "^[a-Z]" /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java_gateway.pid"
START_POLLERS=20
TIMEOUT=30

zabbix server主机172.16.36.21,配置/apps/zabbix_server/etc/zabbix_server.conf添加如下信息,并重启#systemctl restart zabbix-server.service服务。

282 JavaGateway=172.16.36.20
290 JavaGatewayPort=10052
298 StartJavaPollers=20

Zabbix web前端添加主机,并配置模板,添加成功,等待数据采集成功后,JMX标签变绿,表示主机添加成功。

监控java排错方法:

测试能否获取到java 当前已经分配的线程数
[Sat Jul 13 21:49
 root@docker1 ~]#java -jar cmdline-jmxclient-0.10.3.jar - 172.16.36.23:12345 'Catalina:name="http-nio-8080",type=ThreadPool' currentThreadCount
07/13/2019 21:49:40 +0800 org.archive.jmx.Client currentThreadCount: 10

[Sat Jul 13 21:48
 root@docker1 ~]#java -jar cmdline-jmxclient-0.10.3.jar - 172.16.36.23:12345 'Catalina:name="http-nio-8080",type=ThreadPool' maxThreads
07/13/2019 21:49:28 +0800 org.archive.jmx.Client maxThreads: 200

官方模板下载地址:

https://share.zabbix.com/virtualization

ZabbixProxy

主动模式-active和被动模式-passive。

默认工作模式,即被动模式

被动模式就是由zabbix-server向zabbix-agent发出指令获取数据,即zabbix-agent被动的去获取数据并返回给zabbix-server,zabbix-server周期性的向agent 索取数据,这种模式的最大问题就是会加大zabbix-server的工作量,在数百台服务器的环境下zabbix-server不能及时获取到最新数据。

主动模式就是由zabbix-agent主动采集数据并返回给zabbix-server,不再需要zabbix-serve进行干预,因此主动模式在一定程度上可减轻zabbix-server的压力。

zabbix是一个分布式的监控系统,支持通过代理服务器zabbix-proxy收集zabbix-agent的数据,然后把收集保存在本地数据库并发送给zabbixserver进行统一存储和展示。

安装zabbixproxy

安装依赖包:

[root@zabbix-proxy~]# yum install gcc libxml2-devel net-snmp net-snmp-devel \
curl curl-devel php php-bcmath php-mbstring mariadb \
mariadb-devel java-1.8.0-openjdk-devel -y

***如果 Zabbix server 和 Zabbix proxy 安装在相同的主机,它们必须创建不同名字的数据库! ***

准备zabbix-proxy数据库:

# mysql
mysql> create database zabbix_proxy character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix_proxy.* to zabbix@'%' identified by '123456';

编译安装:

# useraddzabbix-s /sbin/nologin
# ./configure --prefix=/usr/local/zabbix --enable-proxy --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java
# make install

导入数据库:

[root@zabbix-proxyzabbix-4.0.1]# zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix -p123456 zabbix_proxy

Zabbix-Proxy被动模式配置文件:

配置zabbixproxy:
# grep"^[a-Z]" /usr/local/zabbix/etc/zabbix_proxy.conf
ProxyMode=1 #0为主动,1为被动
Server=172.16.36.21 #zabbixserver服务器的地址或主机名
Hostname=zabbix_passive #代理服务器名称,需要与zabbixserver添加代理时候的proxy name是一致的!
LogFile=/var/log/zabbix/zabbix_proxy.log
DBHost=172.16.36.23 #数据库服务器地址
DBName=zabbix_proxy#使用的数据库名称
DBUser=zabbix #连接数据库的用户名称
DBPassword=123456 #数据库用户密码
DBPort=3306 #数据库端口
ProxyLocalBuffer=720 #已经提交到zabbixserver的数据保留时间,单位小时(一个月)
ProxyOfflineBuffer=720 #未提交到zabbixserver的时间保留时间
HeartbeatFrequency=60 #心跳间隔检测时间,默认60秒,范围0-3600秒,被动模式不使用
ConfigFrequency=5 #间隔多久从zabbixserver 获取监控信息
DataSenderFrequency=5 #数据发送时间间隔,默认为1秒,范围为1-3600秒,被动模式不使用
StartPollers=20 #启动的数据采集器数量
JavaGateway=172.16.36.20 #java gateway服务器地址,当需要监控java的时候必须配置否则监控不到数据
JavaGatewayPort=10052 #Javagatewa服务端口
StartJavaPollers=20 #启动多少个线程采集数据
CacheSize=2G #保存监控项而占用的最大内存
HistoryCacheSize=2G #保存监控历史数据占用的最大内存
Timeout=30 #监控项超时时间,单位为秒
LogSlowQueries=3000 #毫秒,多久的数据库查询会被记录到日志

zabbix-proxy配置文件中IP地址如下图所示:

添加被动代理:

配置agent主机端配置文件

[Mon Jul 15 00:08
 root@martinhe ~]$ grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=172.16.36.21,172.16.36.23
ListenPort=10050
StartAgents=10
ServerActive=172.16.36.23
Hostname=172.16.36.10

添加被动模式主机:

如果想同时监控主机存活状态,还需要配置agent代理

验证被动模式监控数据:

Zabbix-Proxy主动模式配置文件:

配置zabbixproxy:
# grep"^[a-Z]" /usr/local/zabbix/etc/zabbix_proxy.conf
ProxyMode=0 #0为主动,1为被动
Server=172.16.36.21 #zabbixserver服务器的地址或主机名
Hostname=zabbix_active #代理服务器名称,需要与zabbixserver添加代理时候的proxy name是一致的!
LogFile=/var/log/zabbix/zabbix_proxy.log
DBHost=172.16.36.23 #数据库服务器地址
DBName=zabbix_proxy_active#使用的数据库名称
DBUser=zabbix #连接数据库的用户名称
DBPassword=123456 #数据库用户密码
DBPort=3306 #数据库端口
ProxyLocalBuffer=720 #已经提交到zabbixserver的数据保留时间,单位小时(一个月)
ProxyOfflineBuffer=720 #未提交到zabbixserver的时间保留时间
HeartbeatFrequency=60 #心跳间隔检测时间,默认60秒,范围0-3600秒,被动模式不使用
ConfigFrequency=5 #间隔多久从zabbixserver 获取监控信息
DataSenderFrequency=5 #数据发送时间间隔,默认为1秒,范围为1-3600秒,被动模式不使用
StartPollers=20 #启动的数据采集器数量
JavaGateway=172.16.36.20 #java gateway服务器地址,当需要监控java的时候必须配置否则监控不到数据
JavaGatewayPort=10052 #Javagatewa服务端口
StartJavaPollers=20 #启动多少个线程采集数据
CacheSize=2G #保存监控项而占用的最大内存
HistoryCacheSize=2G #保存监控历史数据占用的最大内存
Timeout=30 #监控项超时时间,单位为秒
LogSlowQueries=3000 #毫秒,多久的数据库查询会被记录到日志

准备zabbix-proxy主动数据库配置:

# mysql
mysql> create database zabbix_proxy_active character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix_proxy_active.* to zabbix@'%' identified by '123456';

导入数据库:

[root@zabbix-proxyzabbix-4.0.1]# zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix -p123456 zabbix_proxy_active

添加主动代理:

配置agent主机端配置文件

[Mon Jul 15 00:08
 root@martinhe ~]$ grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=172.16.36.21
ListenPort=10050
StartAgents=10
ServerActive=172.16.36.21:10053
Hostname=172.16.36.10

验证主动模式监控数据:

自定义Nginx模板

配合agent端脚本,进行nginx状态监控。
#!/bin/bash 

nginx_status_fun(){ #函数内容
    NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
    NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
    nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
        /usr/bin/curl -s  "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
        }
    nginx_reading(){ #获取nginx_reading状态的数量
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
       }
    nginx_writing(){
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
       }
    nginx_waiting(){
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
       }
    nginx_accepts(){
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
       }
    nginx_handled(){
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
       }
    nginx_requests(){
        /usr/bin/curl -s "http://127.0.0.1:"$NGINX_PORT"/martin_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
       }
    case $NGINX_COMMAND in
        active)
            nginx_active;
            ;;
        reading)
            nginx_reading;
            ;;
        writing)
            nginx_writing;
            ;;
        waiting)
            nginx_waiting;
            ;;
        accepts)
            nginx_accepts;
            ;;
        handled)
            nginx_handled;
            ;;
        requests)
            nginx_requests;
        esac 
}

main(){ #主函数内容
    case $1 in #分支结构,用于判断用户的输入而进行响应的操作
        nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
            nginx_status_fun $2 $3;
            ;;
        *) #其他的输入打印帮助信息
            echo $"Usage: $0 {nginx_status key}"
    esac #分支结束符
}

在server端zbbix_get测试:

# zabbix_get -s 172.16.36.10 -p 10050 -k "nginx_status[nginx_status,80,active]"
3

Web前端添加自定义模板

创建Nginx_status模板

填写监控项

画图

监控TCP连接数

配合agent端脚本,进行tcp连接状态监控。
#vim /etc/zabbix/zabbix_agentd.d/tcp_conn.sh
#!/bin/bash
tcp_conn_status(){
        TCP_STAT=$1
        ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
        TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
        if [ -z $TCP_NUM ];then
                TCP_NUM=0
        fi
        echo $TCP_NUM
        }

main(){
        case $1 in
                tcp_status)
                        tcp_conn_status $2;
                ;;
        esac
        }

main $1 $2

添加配置文件,定义获取方式

# vim /etc/zabbix/zabbix_agentd.d/plugin.conf
UserParameter=tcp_status[*],/etc/zabbix/zabbix_agentd.d/tcp-conn.sh $1 $2

在server端zbbix_get测试:

# #zabbix_get -s 172.16.36.10 -p 10050 -k "tcp_status[tcp_status,ESTAB]"
3

Web前端添加自定义模板

创建tcp_status模板

填写监控项

画图

检验画图

监控memcache

首先安装工具nmap-ncat软件包,与memcached交互使用,获取状态信息。

# yum install ncat
配合agent端脚本,进行tcp连接状态监控。
#vim /etc/zabbix/zabbix_agentd.d/mem_status.sh
#!/bin/bash
memcached_status(){
    M_PORT=$1
    M_COMMAND=$2
    echo -e "stats\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}
main(){
    case $1 in
        memcached_status)
        memcached_status $2 $3
        ;;
    esac
}
main $1 $2 $3

添加配置文件,定义获取方式,重启agent服务

# vim /etc/zabbix/zabbix_agentd.d/plugin.conf
UserParameter=memcached_status[*],/etc/zabbix/zabbix_agentd.d/mem_status $1 $2 $3

在server端zbbix_get测试:

# zabbix_get -s 172.16.36.10 -p 10050 -k "memcached_status[memcached_status,11211,curr_connections]"
10

Web前端添加自定义模板

创建memcached_status模板

填写监控项

画图

监控redis

首先安装工具nmap-ncat软件包,与redis交互使用,获取状态信息。

# yum install ncat
配合agent端脚本,进行redis状态监控。
#vim /etc/zabbix/zabbix_agentd.d/redis_status.sh
#!/bin/bash
redis_status(){
        R_PORT=$1
        R_COMMAND=$2
        (echo -en "INFO \r\n";sleep 1;) | nc 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp
        REDIS_STAT_VALUE=$(grep -w "$R_COMMAND" /tmp/redis_"$R_PORT".tmp| cut -d ':' -f2)
        echo $REDIS_STAT_VALUE
}

help(){
       echo "${0} + redis_status + PORT + COMMAND"
}

main(){
        case $1 in
            redis_status)
                redis_status $2 $3
                ;;
        *)
        help
        ;;
        esac
}

main $1 $2 $3

添加配置文件,定义获取方式,重启agent服务

# vim /etc/zabbix/zabbix_agentd.d/plugin.conf
UserParameter=redis_status[*],/etc/zabbix/zabbix_agentd.d/mem_status $1 $2 $3

在server端zbbix_get测试:

# zabbix_get -s 172.16.36.10 -p 10050 -k "redis_status[redis_status,6379,connected_clients]"
10

Web监测:

此方式仅用于测试web页面是否存活,不能代表从全国各地访问此页面的打开速度,需要使用第三方监测软件。

添加web场景

添加web方案步骤

查看web监测数据,可结合触发器进行报警

SNMP 协议介绍

即简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议,SNMP主要用于网络设备的管理。

SNMP的协议版本目前有SNMP v1、SNMP v2c和SNMP v3三种版本,目前应用的是SNMP v2c。

SNMP v2c也采用团体名认证,它在兼容SNMP v1的同时又扩充了SNMP v1的功能,它提供了更多的操作类型(GetBulk和InformRequest)、支持更多的数据类型(Counter64等)、提供了更丰富的错误代码且能够更细致地区分错误。

SNMP 工作机制

SNMP的工作机制SNMP网络元素分为NMS和Agent两种:

  1. NMS(Network Management Station,网络管理站)是运行SNMP客户端程序的工作站,能够提供非常友好的人机交互界面,方便网络管理员完成绝大多数的网络管理工作。

  2. Agent是驻留在设备上的一个进程,负责接收、处理来自NMS的请求报文。在一些紧急情况下,如接口状态发生改变等,Agent也会主动通知NMS。

总结:NMS是SNMP网络的管理者,Agent是SNMP网络的被管理者。NMS和Agent之间通过SNMP协议来交互管理信息。

SNMP 数据交互

SNMP 组织结构

一套完整的SNMP系统主要包括以下几个方面:
  • SNMP报文协议。
  • 管理信息结构(SMI,Structure ofManagementInformation),一套公用的结构和表示符号。
  • 管理信息库(MIB,Management Information Base),管理信息库包含所有代理进程的所有可被查询和修改的参数。
  • OID(Object Identifiers),一个OID是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识),如端口信息、设备名称等。

SNMP MIB

SNMP OID

Centos 部分常用的OID:

https://www.haiyun.me/archives/linux-snmp-oid.html

如何测试OID:

snmpwalk是SNMP的一个工具,它使用SNMP的GET请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
# 要使用snmpwalk需要先按照net-snmp软件包中。
# yum -y install net-snmp-utils|apt-get install snmp
# snmpwalk-h
USAGE: snmpwalk[OPTIONS] AGENT [OID]
–h:显示帮助。
–v:指定snmp的版本, 1或者2c或者3。
–c:指定连接设备SNMP密码。
–V:显示当前snmpwalk命令行版本。
–r:指定重试次数,默认为0次。
–t:指定每次请求的等待超时时间,单为秒,默认为3秒。
–l:指定安全级别:noAuthNoPriv|authNoPriv|authPriv。
–a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。
–A:验证字符串。只有-l指定为authNoPriv或authPriv时才需要。
–x:加密协议:DES。只有-l指定为authPriv时才需要。
–X:加密字符串。只有-l指定为authPriv时才需要。

# Centos服务器安装配置SNMP:
[root@web1 ~]# yum install -y net-snmp
[root@web1 ~]# vim /etc/snmp/snmpd.conf
[root@web1 ~]# sec.name source community
com2sec notConfigUserdefault    123456      #第一步:设置团体认证
group   notConfigGroupv1    notConfigUser
group   notConfigGroupv2c   notConfigUser   #第二步:将团体名称notConfigUser关联至组notConfigGroup
view    systemviewincluded  .1.3.6.1.2.1.1  #后面相当于*,可匹配多个
view    systemviewincluded  .1.3.6.1.2.1.25.1.1     #创建一个view,并对其授权可访问的OID范围
view    systemviewincluded  .1.3.6  #此项对照上述OID表,即可看到所有centos设备信息
access  notConfigGroup  ""  any     noauthexact     systemviewnone  none        #将组notConfigGroup关联至systemview从未完成组的授权

#### 测试能否通过SNMP采集数据:
 root@docker2 ~]#snmpwalk -v 2c -c 123456 172.16.36.10 .1.3.6.1.4.1.2021.10.1.3.1
iso.3.6.1.4.1.2021.10.1.3.1 = STRING: "2.91"

 root@docker2 ~]#snmpwalk -v 2c -c 123456 172.16.36.10 .1.3.6.1.4.1.2021.4.3.0
iso.3.6.1.4.1.2021.4.3.0 = INTEGER: 2097148

创建主机,添加snmp接口,并链接snmpv2模板

修改模板默认继承宏变量为自己定义的密码:

snmp监测图形:修改关联模板数据采集时间,默认1h采集一次,测试的话时间太长,改为5s

监控MySQL

部署mysql主从同步,需要配置不同的server id并开启bin log

[root@master-redis ~]# vim /etc/my.cnf      #mysql主库配置文件
[mysqld]
server_id=50
datadir=/data/mysql
character-set-server=utf8mb4
log_bin=/data/bin/mysql_bin
skip_name_resolv

[root@slave1-redis1 ~]# vim /etc/my.cnf     #mysql从库配置文件
[mysqld]
server_id=51
read_only
datadir=/data/mysql
log_bin=/data/bin/mysql_bin
skip_name_resolve
relay_log_purge=0
character-set-server=utf8mb4
binlog_format=ROW

重启并设置同步账户:

/etc/init.d/mysqldrestart
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'rsync-user'@'172.16.36.%' IDENTIFIED BY '123456';

根据从库同步状态来监测从库运行是否正常。

MariaDB [(none)]> show slave status\G
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
         Seconds_Behind_Master: 0   #同步时落后多少秒,时间约长,数据差异越大。

做数据库主从:

如果数据库从库不是在主数据库一上线就搭建,需要做全量数据同步后,再做增量同步。操作如下:
导出master的mysql数据:
# /usr/local/mysql/bin/mysqldump --all-databases --single_transaction --flush-logs --master-data=2 --lock-tables > /opt/backup.sql

复制到slave并导入,Position位置在sql文件:
# mysql < /opt/backup.sql
mysql> CHANGE MASTER TO MASTER_HOST='192.168.15.203',MASTER_USER='rsync-user',MASTER_PASSWORD='123456',MASTER_LOG_FILE='bin-log.000003',MASTER_LOG_POS=120;
mysql> start slave;
mysql> show slave status\G
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
         Seconds_Behind_Master: 0   #同步时落后多少秒,时间约长,数据差异越大。

安装procona:

官方文档及下载地址:

插件下载地址
https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/

安装教程:

https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html#installation-instructions#

从库机器上本地安装相关软件:

[root@slave1-redis1 ~]# yum install php php-mysql -y
[root@slave1-redis1 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:percona-zabbix-templates-1.1.8-1 ################################# [100%]

Scripts are installed to /var/lib/zabbix/percona/scripts
Templates are installed to /var/lib/zabbix/percona/templates

#安装zabbix repo文件
[root@slave1-redis1 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

[root@slave1-redis1 ~]# yum install zabbix-agent

[root@slave1-redis1 ~]# mv /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf /opt
[root@slave1-redis1 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

[root@slave1-redis1 ~]# vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf
<?php
$mysql_user= 'root';
$mysql_pass= '';

Nginx服务宕机自治愈

自定脚本:nginx.sh

#!/bin/bash
systemctl restart nginx.service

给zabbix赋予执行命令的权限:

[root@web1 zabbix_agentd.d]# vim /etc/sudoers
root    ALL=(ALL)       ALL
zabbix  ALL =(ALL) NOPASSWD: ALL

同时,你还需要一个agent端脚本,并且在agent.conf中开启远程执行命令,如下:

监控端触发器执行脚本
[root@web1 zabbix_agentd.d]# vim nginx.sh
#!/bin/bash
systemctl restart nginx.service

开启远程命令和允许执行日志记录警告
[root@web1 zabbix_agentd.d]# vim ../zabbix_agentd.conf
EnableRemoteCommands=1
LogRemoteCommands=1

server端监控调用脚本
[root@web1 zabbix_agentd.d]# vim tcplisten.sh
#!/bin/bash
Listen_PORT=$1
ss -tnl | awk -F"[[:space:]]+|:" 'NR>1{print $5}'| grep $Listen_PORT &> /dev/null
if [ "$?" = 0 ];then
    echo 50
else
    echo 100
fi

用户可执行参数
[root@web1 zabbix_agentd.d]# vim plugin.conf
UserParameter=net_tcp_listen[*],/etc/zabbix/zabbix_agentd.d/tcplisten.sh $1

前端Web添加主机,触发器必须提前定义好,并添加动作

当远端主机nginx的80端口不存在时,zabbix会执行远程命令,尝试启动nginx,如果3次,没启动,执行后续邮件发送给相关运维人员。测试效果如下,

手动停止nginx服务后,5s触发器执行发现nginx的80端口不存在,尝试启动服务。

启动nginx成功,问题解决。

邮件报警

创建报警媒介类型:

QQ邮箱-》设置-》账户-》开启pop3/smtp-》生成授权码-》

添加报警媒介:

添加动作和触发的条件:

一旦满足条件被触发做何操作:

1-3步,每隔1分钟检测一次,发送邮件给初级运维,3分钟未解决的话,继续4-5步
4-5步,—————,发送邮件给中级运维
5-7步,—————,发送邮件给经理或cto

自定义报警邮件内容:

# 简单操作写法:
业务报警{TRIGGER.STATUS}
北京业务
报警服务器: {HOST.NAME}
IP地址:{HOSTNAME1}
详情:{ITEM.NAME}:{ITEM.VALUE}

# 简单恢复写法:
业务报警{TRIGGER.STATUS}
北京业务
恢复服务器: {HOST.NAME}
IP地址:{HOSTNAME1}
详情:{ITEM.NAME}:{ITEM.VALUE}

# 复杂操作写法:
默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
默认信息:
告警主机IP地址:{HOST.CONN}
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

# 复杂恢复操作:
默认接收人:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
恢复信息:
告警主机IP地址:{HOST.CONN}
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

微信报警

注册企业微信,并登陆管理后台

应用小程序-》创建应用-》上传logo-》

官方API接口调用文档:

https://work.weixin.qq.com/api/doc#90000/90003/90487

发送应用消息:

https://work.weixin.qq.com/api/doc#90002/90151/90854

创建报警媒介类型:

添加报警媒介:收件人为企业微信账号,即注册姓名的拼音,而不是手机号

脚本放置位置:
[Wed Jul 17 21:17
 root@docker2 ~]#ll /apps/zabbix_server/share/zabbix/alertscripts/
total 12
-rw-r--r-- 1 root   root    981 Jul 16 19:29 weixin.py
脚本内容:

执行下列脚本需要安装apt install python-pip -y,导入pip install requests还需要做个软连接,此脚本为python2.7所写ln -sv /usr/bin/python2.7 /usr/bin/python,给下列脚本赋予执行权限# chmod +x weixin.py

#!/usr/bin/env python
#coding:utf-8
#Author:Zhang ShiJie
import requests
import sys
import os
import json
import logging

logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin.log'),
filemode = 'a')

corpid='企业ID'
appsecret="SCRET"
agentid="Agent ID"
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']

msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
touser=sys.argv[1]
subject=sys.argv[2]
message=sys.argv[2] + "\n\n" +sys.argv[3]

params={
"touser": touser,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}

req=requests.post(msgsend_url, data=json.dumps(params))
logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)

执行测试脚本:

[Wed Jul 17 21:29
 root@docker2 /apps/zabbix_server/share/zabbix/alertscripts]#python weixin.py HeJinCheng "这是主题" "这是内容,我试试"

手机截图:

添加动作和触发的条件:

添加处理操作:


给用户添加WeiXin报警媒介:

配置服务宕机报警,如Nginx服务的80端口不存在时。