zabbix

zabbix概念

​ 对于运维人员来说,监控是非常重要的,想要保证线上业务整体能够稳定运行,那么我们就需要实时关注与其相关的各项指标是否正常。一个业务系统背后,往往存在着很多服务器、网络设备等硬件资源,如果我们想方便、集中地管理他们,就需要依靠一些外部的工具, zabbix就是一个被广泛使用的,能够实现集中监控管理的应用程序。

常见的开源监控软件:cacti、nagios、zabbix、smokeping、open-falcon等;

  • Cacti:基于LAMP平台展现的网络流量监测及分析工具,通过SNMP技术或自定义脚本从目标设备/主机获取监指标信息;其次进行数据存储,调用模版将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtool绘制结果图形;最后进行数据展现通过web方式将监控结果呈现出来。
    • 官网:https://www.cacti.net/
    • GitHub:https://github.com/Cacti/cacti
  • Nagios:用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,当被监控对象发生异常时,会及时向管理员告警,提供一批预设好的监控插件,用户可以之间调用,也可以自定义Shell脚本来监控服务,适合各企业的业务监控,可通过Web页面显示对象状态、日志、告警信息,分层告警机制及自定义监控相对薄弱。
    • 官网:https://www.nagios.org/
  • Smokeping:是一款用于网络性能监测的开源监控软件,主要用于对IDC的网络状况,网络质量,稳定性等做检测,通过rrdtool制图方式,图形化地展示网络的时延情况,进而能够清楚的判断出网络的即时通信情况。
    • 官网:https://oss.oetiker.ch/smokeping/
    • 相关博客:http://blogs.studylinux.net/?p=794
  • Open-falcon:小米公司开源出来的监控软件,监控能力和性能较强。
    • 官网:https://www.open-falcon.org/
    • GitHub:https://github.com/XiaoMi/open-falcon
  • Zabbix:目前使用较多的开源监控软件,可横向扩展、自定义监控项、支持多种监控方式、可监控网络与服务等。
    • 官网:https://www.zabbix.com/cn/
  • 商业监控解决方案:
    • 监控宝(https://www.jiankongbao.com/)、听云(https://www.tingyun.com/)、……

zabbix支持的通讯方式:

  • agent:通过专门的代理程序进行监控,与常见的master/agent模型类似,如果被监控对象支持对应的agent,推荐首选;
  • ssh/telnet:通过远程控制协议进行通讯,比如ssh或者telnet。
  • SNMP:通过SNMP协议与被监控对象进行通讯,SNMP协议全称Simple Network Management Protocol,译为“简单网络管理协议”,通常来说,我们无法在路由器,交换机这种硬件上安装agent,但是这些硬件往往都支持SNMP协议,SNMP是一种比较久远的、通行的协议,大部分的网络设备都支持这种协议。其实SNMP协议的工作方式也可以理解为master/agent的工作方式,只不过是在这些设备中内置了SNMP的agent而已,所以,大部分的网络设备都支持这种协议。
  • IPMI:通过IPMI接口进行监控,我们通过标准的IPMI硬件接口,监控被监控对象的物理特征,比如电压,温度,风扇状态,电源状态等。
  • JMX:通过JMX进行监控,JMX(Java Management Extensions,即Java管理扩展),监控JVM虚拟机时,使用这种方法是非常不错的选择。

一般情况下,我们将zabbix agent部署到被监控主机上,由agent采集数据,报告给负责监控的中心主机,中心主机就是master/agent模型中的master,负责监控的中心主机被称为zabbix server,zabbix server 将从agent端接收到的信息存储到zabbix的数据库中。而zabbix的数据库端被我们称为 zabbix database,如果管理员需要查看各种监控信息,则需要zabbix的GUI,zabbix的GUI是一种 web GUI,我们称为zabbix web,zabbix web 是php编写的,所以,如果想要使用zabbix web展示相关监控信息,需要依赖于LAMP环境,不管是zabbix server,或是zabbix web,他们都需要连接到zabbix database 获取相关数据,如下图:

绘图1

zabbix支持分布式监控,当监控规模变得庞大时,我们可以把成千上万台的被监控对象分成不同的区域,每个区域中设置一台代理主机,区域内的每个被监控对象的信息被agent采集,提交给代理主机。在这个区域内,代理主机的作用就像是zabbix server,我们称代理主机为zabbix Proxy,zabbix Proxy再将收集到的信息统一提交给zabbix server处理,这样,zabbix Proxy分摊了zabbix server的压力,同时,我们还能够通过统一的监控入口,监控所有的对象,当监控规模大到需要使用zabbix Proxy时,zabbix的架构如下图:

绘图2

zabbix 各组件:

  • zabbix agent :部署在被监控主机上,负责被监控主机的数据,并将数据发送给zabbix serve
  • zabbix server:负责接收agent发送的报告信息,并且负责组织配置信息、统计信息、操作数据等。
  • zabbix database:用于存储所有zabbix的配置信息、监控数据的数据库。
  • zabbix web:zabbix的web界面,管理员通过web界面管理zabbix配置以及查看zabbix相关监控信息,可以单独部署在独立的服务器上。
  • zabbix proxy:可选组件,用于分布式监控环境中,zabbix proxy 代表server端,完成局部区域内的信息收集,再统一发往server端。

agent端采集完数据,主动发送给server端的模式称之为主动模式;agent不主动发送,等待server过来拉取数据,称为被动模式。

zabbix安装

一、Ubuntu上apt安装zabbix

更改Ubuntu的apt源
root@ubuntu:~# cat /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

安装数据库
root@ubuntu:~#  wget https://repo.zabbix.com/zabbix/4.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.2-1+bionic_all.deb
root@ubuntu:~# dpkg -i zabbix-release_4.2-1+bionic_all.deb
root@ubuntu:~# apt update

安装Zabbix server,Web前端,agent
root@ubuntu:~# apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-agent

创建初始数据库
root@ubuntu:~# mysql
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@192.168.184.148 identified by '123456';

此时MySQL监听的可能是本机的127.0.0.1端口,无法使用IP地址连接,可以修改MySQL监听端口
root@ubuntu:~# ss -ntl
State       Recv-Q   Send-Q        Local Address:Port       Peer Address:Port       
LISTEN      0         128            0.0.0.0:10050              0.0.0.0:*          
LISTEN      0         80             127.0.0.1:3306             0.0.0.0:*          
LISTEN      0         128            127.0.0.53%lo:53           0.0.0.0:*          
LISTEN      0         128            0.0.0.0:22                 0.0.0.0:*          
LISTEN      0         128            [::]:10050                   [::]:*          
LISTEN      0         128            *:80                        *:*          
LISTEN      0         128            [::]:22                      [::]:*   
root@ubuntu:~# vim /etc/mysql/mariadb.conf.d/50-server.cnf 
bind-address            = 0.0.0.0 #修改成需要的地址
root@ubuntu:~# systemctl restart mysql #重启MySQL

导入初始架构和数据,系统将提示您输入新创建的密码
root@ubuntu:~# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p123456 -h 192.168.184.148 zabbix

编辑配置文件
root@ubuntu:~# vim /etc/zabbix/zabbix_server.conf 
DBHost=192.168.184.148
DBPassword=123456
DBPort=3306

为zabbix前端配置PHP
root@ubuntu:~# vim /etc/zabbix/apache.conf 
 <IfModule mod_php7.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value max_input_vars 10000
        php_value always_populate_raw_post_data -1
        php_value date.timezone Asia/Shanghai
     </IfModule>

启动zabbix server和agent 进程
root@ubuntu:~# systemctl restart zabbix-server zabbix-agent apache2
root@ubuntu:~# systemctl enable zabbix-server zabbix-agent apache2

开始配置web前端,在浏览器上输入zabbix server IP地址/zabbix,开始安装
可以跟着官网的指引安装
https://www.zabbix.com/documentation/4.2/manual/installation/install#installing_frontend

img

install_2.png

检查全部OK后继续下一步

install_3.png

Database host 输入MySQL所在服务器的IP地址

install_4.png

host 就是zabbix server的IP地址

install_5.png

确认无误后继续下一步

login.png

登录用户Admin,密码zabbix

二、编译安装zabbix4.2.4

1.安装Mariadb数据库
root@ubuntu:# apt install mariadb-server mariadb-client -y

2. apt-get  install   apache2 apache2-bin apache2-data apache2-utils fontconfig-config fonts-dejavu-core fping libapache2-mod-php   libapache2-mod-php7.2 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libfontconfig1 libgd3 libiksemel3   libjbig0 libjpeg-turbo8 libjpeg8 liblua5.2-0 libodbc1 libopenipmi0 libsensors4 libsnmp-base libsnmp30 libsodium23 libssh2-1  libtiff5 libwebp6 libxpm4 php-bcmath php-common php-gd php-ldap php-mbstring php-mysql php-xml php7.2-bcmath php7.2-cli  php7.2-common php7.2-gd php7.2-json php7.2-ldap php7.2-mbstring php7.2-mysql php7.2-opcache php7.2-readline   php7.2-xml snmpd  ssl-cert ttf-dejavu-core      libmysqlclient-dev  libxml2-dev  libxml2 snmp  libsnmp-dev   libevent-dev  openjdk-8-jdk curl libcurl4-openssl-dev 
 
3.下载及编译安装zabbix-4.2.4安装包
root@ubuntu:/usr/local/src# ll
-rw-r--r--  1 root root 18271978 Jul 13 17:42 zabbix-4.2.4.tar.gz
root@ubuntu:/usr/local/src# tar xvf zabbix-4.2.4.tar.gz 
root@ubuntu:/usr/local/src#  cd zabbix-4.2.4/
root@ubuntu:/usr/local/src/zabbix-4.2.4# ./configure --prefix=/apps/zabbix_server  --enable-server --enable-agent --with-mysql  --with-net-snmp --with-libcurl --with-libxml2  --enable-java
root@ubuntu:/usr/local/src/zabbix-4.2.4# make && make install 

4.创建zabbix数据库并授权
root@ubuntu:~# mysql
MariaDB [(none)]> create database zabbix_server character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_server.* to zabbix@192.168.184.148 identified by '123456';

5.初始化数据库
root@ubuntu:/usr/local/src/zabbix-4.2.4/database/mysql# pwd
/usr/local/src/zabbix-4.2.4/database/mysql
root@ubuntu:/usr/local/src/zabbix-4.2.4/database/mysql# mysql -uzabbix -p123456 -h192.168.184.148 zabbix_server < schema.sql 
root@ubuntu:/usr/local/src/zabbix-4.2.4/database/mysql# mysql -uzabbix -p123456 -h192.168.184.148 zabbix_server < images.sql 
root@ubuntu:/usr/local/src/zabbix-4.2.4/database/mysql# mysql -uzabbix -p123456 -h192.168.184.148 zabbix_server < data.sql 
#确认数据库内表已经生成

6.修改zabbix_server配置文件
root@ubuntu:~# vim /apps/zabbix_server/etc/zabbix_server.conf
DBHost=192.168.184.148
DBName=zabbix_server
DBUser=zabbix
DBPassword=123456
DBPort=3306

7.这时尝试登陆,会提示不能使用root账户登陆
root@ubuntu:~# /apps/zabbix_server/sbin/zabbix_server -c /apps/zabbix_server/etc/zabbix_server.conf
zabbix_server [83451]: user zabbix does not exist
zabbix_server [83451]: cannot run as root!
创建zabbix用户,把zabbix_server目录的属主和属组都改成zabbix
root@ubuntu:~# useradd zabbix
root@ubuntu:~# chown zabbix.zabbix /apps/zabbix_server/ -R
root@ubuntu:~# ll /apps/
drwxr-xr-x  7 zabbix zabbix 4096 Jul 15 11:25 zabbix_server/

8.安装zabbix web界面(把源码包内的PHP文件拷贝到/var/www/html/目录下即可)
root@ubuntu:/var/www/html# pwd
/var/www/html
root@ubuntu:/var/www/html# rm -rf index.html
root@ubuntu:/var/www/html# cp -a /usr/local/src/zabbix-4.2.4/frontends/php/*   .
# 如果想要在web页面访问zabbix目录开始安装,就在/var/www/html/下创建一个zabbix目录,把当前目录下的文件拷贝进去
root@ubuntu:/var/www/html# mkdir zabbix
root@ubuntu:/var/www/html# mv ./* zabbix
#####
访问web页面,开始安装前端

1563164179448

root@ubuntu:# apt-get install php-gettext  php-xml php-net-socket php-gd php-mysql
root@ubuntu:~# vim  /etc/php/7.2/apache2/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
root@ubuntu:~# systemctl restart apache2 #重启Apache,刷新页面,发现错误已经没了

1563164892626

1563164920513

1563164936120

1563164968593

由于是编译安装,所以无法自动生成zabbix.conf.php文件,需要点击下载,上传到/var/www/html/zabbix/conf/目录下
root@ubuntu:/var/www/html/zabbix/conf# ll
total 24
drwxr-xr-x  2 zabbix zabbix 4096 Jul 15 12:32 ./
drwxr-xr-x 10 root   root   4096 Jul 15 12:13 ../
-rw-r--r--  1 zabbix zabbix  163 Jun 26 23:22 .htaccess
-rw-r--r--  1 zabbix zabbix 1036 Jun 26 23:22 maintenance.inc.php
-rw-r--r--  1 root   root    447 Jul 15 12:31 zabbix.conf.php
-rw-r--r--  1 zabbix zabbix  741 Jun 26 23:22 zabbix.conf.php.example
上传完成后,再次刷新页面,就可以了

1563165316225

点击finish就可以开始登陆,默认用户Admin,密码zabbix

设置编译安装zabbix支持中文
下载中文语言包
apt-get install language-pack-zh*
更改环境变量
vim /etc/environment
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"
sudo dpkg-reconfigure locales #进行设置
设置字体,将字体文件上传到/var/www/html/zabbix/assets/fonts/目录下
root@ubuntu:# vim /var/www/html/zabbix/include/defines.inc.php
69  define('ZBX_GRAPH_FONT_NAME',           'simkai'); // font file name
110 define('ZBX_FONT_NAME', 'simkai');


#没有启动脚本时启动zabbix_agent
root@ubuntu:~# /apps/zabbix_server/sbin/zabbix_agentd -c /apps/zabbix_server/etc/zabbix_agentd.conf
#启动zabbix_server 
root@ubuntu:~# /apps/zabbix_server/sbin/zabbix_server -c /apps/zabbix_server/etc/zabbix_server.conf

编写zabbix_server启动脚本

root@ubuntu:~# vim /lib/systemd/system/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 #这里的pid路径要和zabbix_server里的一样
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启动脚本

root@ubuntu:~# vim /lib/systemd/system/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的日志目录
root@ubuntu:~# mkdir /apps/zabbix_server/logs/
root@ubuntu:~# chown zabbix.zabbix /apps/zabbix_server/logs/
#修改配置文件中日志存放路径,方便管理
root@ubuntu:~# vim /apps/zabbix_server/etc/zabbix_server.conf
LogFile=/apps/zabbix_server/logs/zabbix_server.log
root@ubuntu:~# vim /apps/zabbix_server/etc/zabbix_agentd.conf
LogFile=/apps/zabbix_server/logs/zabbix_agentd.log

Ubuntu设置中文支持

Ubuntu设置中文支持
下载中文语言包
apt-get install language-pack-zh*
更改环境变量
vim /etc/environment
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh:en_US:en"
sudo dpkg-reconfigure locales #进行设置

配置apt安装的zabbix支持中文
#将字体配置文件上传到服务器
/usr/share/zabbix/assets/fonts/
编辑配置文件,使用新字体
vim /usr/share/zabbix/include/defines.inc.php 
69 define('ZBX_GRAPH_FONT_NAME',           'graphfont'); // font file name   
110 define('ZBX_FONT_NAME', 'graphfont'); #把这两行的graphfont更改为新的字体文件名称,不需要写后缀ttf
#如果ttf是大写的,需要修改为小写
zabbix依赖包 ***
apt-get  install apache2 apache2-bin apache2-date apache2-utils fontconfig-config font

设置监控

IP 服务
192.168.184.148 zabbix_server zabbix_server
192.168.184.150 zabbix_agent zabbix_agent

配置agent端

编译安装agent端
root@ubuntu:/usr/local/src/zabbix-4.2.4# pwd
/usr/local/src/zabbix-4.2.4
root@ubuntu:/usr/local/src/zabbix-4.2.4# ./configure --prefix=/apps/zabbix_agent --enable-agent
root@ubuntu:/usr/local/src/zabbix-4.2.4# make && make install

修改配置文件
root@ubuntu:/usr/local/src/zabbix-4.2.4# vim /apps/zabbix_agent/etc/zabbix_agentd.conf
Server=192.168.184.148 # zabbix_server 端的IP
Hostname=192.168.184.150 #本机IP
AllowRoot=1 #允许root启动
User=root  #设置启动用户为root
PidFile=/apps/zabbix_agent/run/zabbix_agentd.pid

启动zabbix_agent
root@ubuntu:# /apps/zabbix_agent/sbin/zabbix_agentd -c /apps/zabbix_agent/etc/zabbix_agentd.conf

在web页面创建主机

1563173075543

添加模版

1563173114003

1563173235559

添加完成

编写zabbix_agent启动脚本
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

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

[Install] 
WantedBy=multi-user.target

可以使用zabbix_get命令测试监控,测试"agent.ping"返回1,就说明没问题,除了1以外都不对
root@ubuntu:~# zabbix_get -s 192.168.184.150 -p 10050 -k "agent.ping"
1

监控Tomcat

IP 系统
192.168.184.148 zabbix_server、java-gateway Ubuntu 1804
192.168.184.150 tomcat Ubuntu 1804
192.168.184.151 java-gateway Ubuntu 1804
1.安装JDK环境
root@ubuntu:~# apt-get install openjdk-8-jdk

安装Tomcat
root@ubuntu:/usr/local/src# tar xvf apache-tomcat-8.5.37.tar.gz  -C /usr/local/
root@ubuntu:/usr/local/src# ln -s /usr/local/apache-tomcat-8.5.37/ /usr/local/tomcat
root@ubuntu:/usr/local/src# cd ../tomcat
root@ubuntu:/usr/local/tomcat# cat webapps/ROOT/index.html 
haomeng test

修改配置
root@ubuntu:/usr/local/tomcat# vim bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote #启用远程监控JMX
-Dcom.sun.management.jmxremote.port=12345 #默认启动的JMX端口号,要和zabbix添加主机时候的端
口一致即可
-Dcom.sun.management.jmxremote.authenticate=false #不使用用户名密码
-Dcom.sun.management.jmxremote.ssl=false #不使用ssl认证
-Djava.rmi.server.hostname=192.168.184.150" #tomcat主机自己的IP地址,不要写zabbix服务器的地址

root@ubuntu:/usr/local/tomcat# ./bin/catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
root@ubuntu:/usr/local/tomcat# ./bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#此处可以使用Windows JDK检测配置情况,看到里面有数据就OK(如图一)

2.配置java-gateway
#编译安装时,java-gateway也被一起安装到了目录中
#在zabbix_server端
root@ubuntu:/apps/zabbix_server/sbin/zabbix_java# pwd
/apps/zabbix_server/sbin/zabbix_java
root@ubuntu:/apps/zabbix_server/sbin/zabbix_java# ll
total 28
drwxr-xr-x 4 zabbix zabbix 4096 Jul 15 16:16 ./
drwxr-xr-x 3 zabbix zabbix 4096 Jul 15 11:25 ../
drwxr-xr-x 2 zabbix zabbix 4096 Jul 15 11:25 bin/
drwxr-xr-x 2 zabbix zabbix 4096 Jul 15 11:25 lib/
-rw-r--r-- 1 zabbix zabbix 1084 Jul 15 16:16 settings.sh
-rwxr-xr-x 1 zabbix zabbix  545 Jul 15 11:25 shutdown.sh*
-rwxr-xr-x 1 zabbix zabbix 1800 Jul 15 11:25 startup.sh*
root@ubuntu:# vim  /apps/zabbix_server/sbin/zabbix_java/settings.sh 
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/tmp/zabbix_java.pid"
START_POLLERS=10
TIMEOUT=30
******************
java-gateway不需要和zabbix_server装在同一台主机上,可以在其他主机,使用apt-get install zabbix-java-gateway 进行安装
******************
启动java-gateway
root@ubuntu:/apps/zabbix_server/sbin/zabbix_java# ./startup.sh
root@ubuntu:/apps/zabbix_server/sbin/zabbix_java# ss -ntl
State       Recv-Q       Send-Q      Local Address:Port                Peer Address:Port       
LISTEN      0            128          0.0.0.0:10050                    0.0.0.0:*          
LISTEN      0            128          0.0.0.0:10051                    0.0.0.0:*          
LISTEN      0            80           0.0.0.0:3306                     0.0.0.0:*          
LISTEN      0            128          127.0.0.53%lo:53                       0.0.0.0:*          
LISTEN      0            128          0.0.0.0:22                       0.0.0.0:*          
LISTEN      0            50           *:10052                          *:*          
LISTEN      0            128          *:80                             *:*          
LISTEN      0            128          [::]:22                          [::]:*  

**************
***下面是不同主机使用apt安装java-gateway
root@ubuntu:~# apt-get install zabbix-java-gateway
root@ubuntu:~# vim /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=5
TIMEOUT=30
启动java-gateway
root@ubuntu:~# systemctl start zabbix-java-gateway
#检查是否监听了10052端口


3.在zabbix_server上配置java-gateway
JavaGateway=192.168.184.148 #这里使用的是相同主机的java-gateway
JavaGatewayPort=10052
StartJavaPollers=20

重启zabbix_server
root@ubuntu:~# systemctl restart zabbix-server

在web页面添加主机

1563184001703

1563184021401

1563184042144

图一:

1563178048623

Tomcat配置监控完成后,如果web界面采集不到数据,可以在server端使用命令方式测试

命令行方式需要下载cmdline-jmxclient-0.10.3.jar

#查询最大线程数
root@ubuntu:~# java -jar cmdline-jmxclient-0.10.3.jar - 192.168.184.150:12345 'Catalina:name="http-nio-8080",type=ThreadPool' maxThreads
07/17/2019 10:04:57 +0800 org.archive.jmx.Client maxThreads: 200
#查看当前线程数
root@ubuntu:~# java -jar cmdline-jmxclient-0.10.3.jar - 192.168.184.150:12345 'Catalina:name="http-nio-8080",type=ThreadPool' currentThreadCount
07/17/2019 10:05:30 +0800 org.archive.jmx.Client currentThreadCount: 10

#能够返回数据,就说明监控tomcat没有问题

监控nginx

主机 IP 服务
zabbix-server 192.168.184.148 zabbix-server
zabbix-nginx 192.168.184.151 zabbix-agent 、nginx
#在新的主机上安装zabbix_agent

#编译安装nginx
root@ubuntu:/usr/local/src# tar xvf nginx-1.14.2.tar.gz
root@ubuntu:/usr/local/src# cd nginx-1.14.2/
root@ubuntu:/usr/local/src/nginx-1.14.2#./configure --prefix=/apps/nginx/  --with-http_stub_status_module #必须添加这个模块
root@ubuntu:/usr/local/src/nginx-1.14.2# make && make install
root@ubuntu:~# vim /apps/nginx/conf/nginx.conf
#添加下面几行
        location /nginx_status {
        stub_status;
}
#测试nginx配置没有问题
root@ubuntu:~# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx//conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx//conf/nginx.conf test is successful
root@ubuntu:~# /apps/nginx/sbin/nginx #启动

到浏览器上访问192.168.184.151/nginx_status,能够看到状态信息

1563333116073

#编写脚本,获取nginx的状态页信息
root@ubuntu:/apps/zabbix_agent/etc/zabbix_agentd.conf.d# pwd
/apps/zabbix_agent/etc/zabbix_agentd.conf.d
root@ubuntu:/apps/zabbix_agent/etc/zabbix_agentd.conf.d# vim check_nginx.sh 
#!/bin/bash
#
host=${2:-'127.0.0.1'}
port=${3:-'80'}
page=${4:-'nginx_status'}
info=$(/usr/bin/curl --connect-timeout 5 -s http://${host}:${port}/${page} 2>/dev/null)
code=$(/usr/bin/curl --connect-timeout 5 -o /dev/null -s -w %{http_code} http://${host}:${port}/${page})
proc=$(/usr/bin/pgrep nginx | wc -l)

case "$1" in
  status)
    echo "$code $proc" | awk '{code=$1}{proc=$2}END{if(code == "200" && proc != 0){printf("%d\n",1)}else{printf("%d\n",0)}}'
    ;;
  active)
    echo "$info" | awk '/^Active/{var=$NF}END{if(var~/^[0-9]+$/){printf("%d\n",var)}else{printf("%d\n",0)}}'
    ;;
  reading)
    echo "$info" | awk '/Reading/ {print $2}'
    ;;
  writing)
    echo "$info" | awk '/Writing/ {print $4}'
    ;;
  waiting)
    echo "$info" | awk '/Waiting/ {print $6}'
    ;;
  accepts)
    echo "$info" | awk 'NR==3 {print $1}'
    ;;
  handled)
    echo "$info" | awk 'NR==3 {print $2}'
    ;;
  requests)
    echo "$info" | awk 'NR==3 {print $3}'
    ;;
  restimes)
    echo "$info" | awk 'BEGIN{OFMT="%.3f"} NR==3 {print $4/$3}'
    ;;
  *)
    echo "ZBX_NOTSUPPORTED"
    ;;
esac

给脚本添加执行权限
root@ubuntu:/apps/zabbix_agent/etc/zabbix_agentd.conf.d# chmod a+x check_nginx.sh 

修改zabbix-agent配置文件
root@ubuntu:/apps/zabbix_agent/etc/zabbix_agentd.conf.d# vim /apps/zabbix_agent/etc/zabbix_agentd.conf
UserParameter=nginx.status[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/check_nginx.sh $1 $2 
Include=/apps/zabbix_agent/etc/zabbix_agentd.conf.d/*.conf #脚本所在目录

重启zabbix-agent服务
root@ubuntu:/apps/zabbix_agent/etc/zabbix_agentd.conf.d# systemctl restart zabbix-agent

在web端添加自定义模板

#由于zabbix没有监控nginx模版,所以我们需要自定义模版

1.创建模版

2.创建应用集

1563345660143

1563345682433

3.创建监控项

1563345735381

1563345917262

键值部分,填的就是zabbix-agent配置文件中UserParameter的key和脚本里的参数

4.创建图形

1563346067969

1563346129476

创建完成后,只要和将主机与模版链接就可以使用了

在server端,可以使用zabbix_get命令检测监控结果

1563346247478

zabbix proxy

主动模式与被动模式

  • 是针对zabbix-agent端来说的,被动模式就是zabbix-server向zabbix-agent发送指令获取数据,即zabbix-agent被动的去获取数据并返回给zabbix-server。zabbix server周期性的向agent 索取数据,这种模式的最大问题就是会加大zabbix server的工作量,在数百台服务器的环境下zabbix server不能及时获取到最新数据,但这也是默认的工作方式。
  • 主动模式是有zabbix agent主动采集数据并返回给zabbix server,不再需要zabbix serve进行干预,因此主动模式在一定程度上可减轻zabbix server的压力。

当监控规模过大,就会给zabbix-server端带来很大的压力,这时,就需要用到zabbix-proxy代理来缓解压力。

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

zabbix-proxy工作模式:

安装zabbix-proxy

主机清单

系统 IP 服务
Ubuntu 192.168.184.148 zabbix-server
centos 7.6 192.168.184.144 zabbix-proxy(被动)、MySQL
centos7.6 192.168.184.143 zabbix-proxy(主动)

被动模式proxy

首先安装依赖包
[root@t2 ~]# 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

准备数据库
[root@t2 ~]# yum install mariadb-server
[root@t2 ~]# mysql
MariaDB [(none)]> create database zabbix_proxy character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_proxy.* to proxy@'%' identified by '123456';
[root@t2 zabbix-4.2.4]# ./configure --prefix=/apps/zabbix_proxy/ --enable-proxy --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java
[root@t2 zabbix-4.2.4]# make  && make install

导入数据库
[root@t2 zabbix-4.2.4]# mysql -uproxy -p123456 -h 192.168.184.144 zabbix_proxy < database/mysql/schema.sql

配置zabbix-proxy
[root@t2 ~]# grep "^[a-Z]" /apps/zabbix_proxy/etc/zabbix_proxy.conf
ProxyMode=1 #0为主动,1为被动
Server=192.168.184.148 #zabbix server服务器的地址或主机名	
Hostname=zabbix-proxy-test1 # 代理服务器名称,需要与zabbix server添加代理时proxy name一致
LogFile=/tmp/zabbix_proxy.log
DBHost=192.168.184.144 #数据库服务器地址
DBName=zabbix_proxy #数据库名称
DBUser=proxy #连接数据库用户名
DBPassword=123456 #数据库用户密码
DBPort=3306 #数据库端口
ProxyLocalBuffer=3 #已经提交到zabbix server的数据保留时间
ProxyOfflineBuffer=24 #未提交到zabbix server的数据保留时间
HeartbeatFrequency=60 #心跳间隔检测时间,默认1秒,范围1-3600秒,被动模式不使用
ConfigFrequency=5 #间隔多久从zabbix server获取监控信息
DataSenderFrequency=5 数据发送时间间隔,默认为1秒,范围为1-3600秒,被动模式不使用
StartPollers=20 #启动的数据采集器数量
JavaGateway=192.168.184.144 #JavaGateway服务器地址,监控java时需要配置
JavaGatewayPort=10052 #JavaGAteway服务端口
StartJavaPollers=20 #启动多少个线程采集数据
CacheSize=100M #保存监控项而占用的最大内存
HistoryCacheSize=100M #保存监控历史数据占用的最大内存
Timeout=30 #监控超时时间,单位为秒
LogSlowQueries=3000 #毫秒,多久的数据库查询会被记录到日志
StatsAllowedIP=127.0.0.1

配置agent(proxy与agent不一定要在同一台主机)
[root@t2 ~]# grep "^[a-Z]" /apps/zabbix_proxy/etc/zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
DebugLevel=4
Server=192.168.184.148,192.168.184.144
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
ServerActive=192.168.184.148
Hostname=192.168.184.144
Timeout=30
UnsafeUserParameters=1

启动服务
[root@t2 ~]# /apps/zabbix_proxy/sbin/zabbix_proxy -c /apps/zabbix_proxy/etc/zabbix_proxy.conf
[root@t2 ~]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf


添加被动代理

1563762213198

添加被动模式主机

1563762260288

1563762274330

验证数据,此过程需要一段时间,在zabbix server,zabbix proxy,zabbix agent 没有报错的情况下,需要耐心等待

1563762340439

主动模式proxy

在192.168.184.143上部署zabbix proxy 主动模式
[root@zabbix-proxy-z ~]# 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

准备数据库
[root@zabbix-proxy-z ~]# yum install mariadb-server
[root@zabbix-proxy-z ~]# mysql
MariaDB [(none)]> create database zabbix_proxy character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_proxy_zhu.* to proxy@'%' identified by '123456';
[root@zabbix-proxy-z zabbix-4.2.4]# ./configure --prefix=/apps/zabbix_proxy/ --enable-proxy --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java
[root@zabbix-proxy-z zabbix-4.2.4]# make  && make install

导入数据库
[root@zabbix-proxy-z zabbix-4.2.4]# mysql -uproxy -p123456 -h 192.168.184.144 zabbix_proxy_zhu < database/mysql/schema.sql

配置zabbix proxy
[root@zabbix-proxy-z ~]# grep "^[a-Z]" /apps/zabbix_proxy/etc/zabbix_proxy.conf 
ProxyMode=0
Server=192.168.184.148
Hostname=zabbix-proxy-test2
LogFile=/tmp/zabbix_proxy.log
DBHost=192.168.184.144
DBName=zabbix_proxy_zhu
DBUser=proxy
DBPassword=123456
DBPort=3306
ProxyLocalBuffer=3
ProxyOfflineBuffer=24
HeartbeatFrequency=60
ConfigFrequency=5
DataSenderFrequency=5
StartPollers=20
JavaGateway=192.168.184.144
JavaGatewayPort=10052
StartJavaPollers=20
CacheSize=100M
HistoryCacheSize=100M
Timeout=30
LogSlowQueries=3000


配置zabbix agent
[root@zabbix-proxy-z ~]# grep "^[a-Z]" /apps/zabbix_proxy/etc/zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
DebugLevel=4
Server=192.168.184.148,192.168.184.143
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
ServerActive=192.168.184.148,192.168.184.143
Hostname=192.168.184.143
Timeout=30
UnsafeUserParameters=1

启动服务
[root@zabbix-proxy-z ~]# /apps/zabbix_proxy/sbin/zabbix_proxy -c /apps/zabbix_proxy/etc/zabbix_proxy.conf
[root@zabbix-proxy-z ~]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf

添加主动代理

1563763277678

添加主动模式主机

1563763301008

1563763319110

在监控项部分,更改客户端为主动模式

1563776741351

1563776773074

1563776795040

验证数据

1563776898203

主动模式监控Tomcat

系统 IP 服务
Ubuntu1810 192.168.184.148 zabbix server 、java-gateway
centos7.6 192.168.184.143 zabbix proxy 、Tomcat 、openjdk1.8.0_212
在192.168.184.143上安装jdk和tomcat
[root@zabbix-proxy-z ]# yum install java-1.8.0-openjdk
[root@zabbix-proxy-z ]# tar xvf apache-tomcat-8.5.37.tar.gz  -C /apps/

添加配置
[root@zabbix-proxy-z apps]# vim /apps/apache-tomcat-8.5.37/bin/catalina.sh
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=192.168.184.143"

启动Tomcat
[root@zabbix-proxy-z apps]# /apps/apache-tomcat-8.5.37/bin/catalina.sh start

在zabbix控制台指定主机添加jmx监控

1563781427391

关联模版

1563781832871

验证监控数据

1563781865765

1563781921654

监控TCP连接数

1.创建获取数据的脚本
[root@zabbix-proxy-z zabbix_agentd.conf.d]# cat 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_STAT_VALUE=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
        if [ -z $TCP_STAT_VALUE ];then
                TCP_STAT_VALUE=0
        fi
        echo $TCP_STAT_VALUE
}

main(){
	case $1 in
	    tcp_status)
		tcp_conn_status $2;	
		;;
		*)
		echo "$0 + tcp_status + STATUS"
	esac
}

main $1 $2
2.添加执行权限
[root@zabbix-proxy-z zabbix_agentd.conf.d]# chmod a+x tcp_conn.sh 

3.创建conf文件引用脚本
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf.d/ all.conf
UserParameter=linux_status[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/tcp_conn.sh "$1" "$2"
或者
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
UserParameter=linux_status[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/tcp_conn.sh "$1" "$2"
Include=/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/*.conf #配置agent配置文件导入自定义的配置文件

重启agent服务
[root@zabbix-proxy-z ~]# pkill zabbix_agent
[root@zabbix-proxy-z ~]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf
由于没有写service启动脚本,所以使用这种方式重启服务

在被监控端为zabbix用户授权
[root@zabbix-proxy-z ~]# vim /etc/sudoers
99 zabbix ALL =(ALL) NOPASSWD: ALL

在zabbix server上测试获取数据

1563784779404

中间出现了权限的错误

1563784819109

这是由于/tmp下的临时文件tcp_conn.txt的属主是root,所以会报权限错误。可以选择把tcp_conn.txt的属主改成zabbix,或者删除文件,让它重新生成

导入并关联模版

1563784978177

验证连接数据

1563785017170

监控memcache

系统 IP 服务
centos7.6 192.168.184.143 memcached
安装并启动memcached
[root@zabbix-proxy-z ~]# yum install memcached
[root@zabbix-proxy-z ~]# systemctl start memcached

编写监控脚本
[root@zabbix-proxy-z zabbix_agentd.conf.d]# pwd
/apps/zabbix_proxy/etc/zabbix_agentd.conf.d
[root@zabbix-proxy-z zabbix_agentd.conf.d]# vim memcached.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

添加执行权限
[root@zabbix-proxy-z zabbix_agentd.conf.d]# chown zabbix.zabbix memcached.sh 

修改属主和属组
[root@zabbix-proxy-z zabbix_agentd.conf.d]# chmod +x memcached.sh 

配置agent文件调用脚本
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
UserParameter=memcached_status[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/memcached.sh "$1" "$2" "$3"

重启agent
[root@zabbix-proxy-z ]# pkill zabbix_agent
[root@zabbix-proxy-z ]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf

在 zabbix server端导入模版(或手动创建)

1563790636172

1563790654147

15637906721861563790689893

关联主机并验证数据

1563790747141

1563790776908

监控redis

系统 IP 服务
Ubuntu1810 192.168.184.148 zabbix server
centos7.6 192.168.184.143 redis
安装部署redis
[root@zabbix-proxy-z ~]# yum install epel-release -y
[root@zabbix-proxy-z ~]# yum install redis -y
[root@zabbix-proxy-z ~]# vim /etc/redis.conf 
bind 0.0.0.0
[root@zabbix-proxy-z ~]# systemctl start redis

编写监控redis脚本
#!/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 ""$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

添加执行权限
[root@zabbix-proxy-z zabbix_agentd.conf.d]# chmod +x redis_status.sh
测试能否获取数据
[root@zabbix-proxy-z zabbix_agentd.conf.d]# bash redis_status.sh redis_status 6379 total_net_output_bytes
43484
修改zabbix agent配置文件
[root@zabbix-proxy-z zabbix_agentd.conf.d]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
UserParameter=redis_status[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/redis_status.sh "$1" "$2" "$3"

在zabbix server端进行测试(这时在/tmp/目录下会生成一个redis_6379.tmp文件,所有者与所有组都是root,需要将其删除,或者将所有者所有组改成zabbix,否则在zabbix server端测试会报权限错误)
[root@zabbix-proxy-z zabbix_agentd.conf.d]# ll /tmp/
-rw-r--r-- 1 root   root      2141 Jul 24 10:53 redis_6379.tmp #删除这个文件,或者改所有者所有组
[root@zabbix-proxy-z zabbix_agentd.conf.d]# rm -rf /tmp/redis_6379.tmp 
在zabbix server端验证脚本
root@zabbix-server:~# zabbix_get -s 192.168.184.143 -p 10050 -k "redis_status[redis_status,6379,used_memory_lua_human]"
37.00K

在server端创建监控模版

1563938204888

创建监控项

1563938241506

创建图形

1563938283822

关联到主机并验证数据

1563938360184

1563938378114

zabbix实现nginx故障自治愈

系统 IP 服务
Ubuntu1810 192.168.184.148 zabbix server
centos 192.168.184.143 nginx
安装部署nginx
[root@zabbix-proxy-z ~]# yum install nginx -y
[root@zabbix-proxy-z ~]# vim /etc/nginx/nginx.conf
 location /nginx_status {
            stub_status;
            allow 127.0.0.1;
            deny all;
}
启动服务
[root@zabbix-proxy-z ~]# systemctl start nginx

编写nginx监控脚本
[root@zabbix-proxy-z zabbix_agentd.conf.d]# cat nginx_status.sh 
#!/bin/bash 

nginx_status_fun(){ #函数内容
	NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
	NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
	nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
        }
	nginx_reading(){ #获取nginx_reading状态的数量
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
       }
	nginx_writing(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
       }
	nginx_waiting(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
       }
	nginx_accepts(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
       }
	nginx_handled(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
       }
	nginx_requests(){
        /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_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 #分支结束符
}

main $1 $2 $3

配置zabbix agent 配置文件
[root@zabbix-proxy-z zabbix_agentd.conf.d]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
UserParameter=nginx.status[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/nginx_status.sh "$1" "$2" "$3"

重启zabbix agent
[root@zabbix-proxy-z zabbix_agentd.conf.d]# pkill zabbix_agent
[root@zabbix-proxy-z zabbix_agentd.conf.d]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf

server端测试验证
root@zabbix-server:~# zabbix_get -s 192.168.184.143 -p 10050 -k "nginx.status[nginx_status,80,requests]"
11667



server端导入模版

1563950012174

关联模版到主机,并验证数据

1563950043450

1563950066116

设置邮件报警

创建报警媒介类型

1563956446044

1563956636126

这里的密码指的是邮箱的smtp授权码,需要到邮箱里打开

1563956751908打开smtp服务,然后生成授权码,就是第三方客户端登录时的密码

配置动作

1563957157049配置故障具体操作

1563957390462

定义恢复内容

1563957524802

添加用户报警媒介

1563957690874

测试关闭192.168.184.143的80端口,zabbix则会发送邮件报警

1563957963211

重新开启80端口时,同样会发送邮件提醒

1563958094893

实现分级报警

创建一个新的用户,并设置媒介类型,以及权限

156395877265615639587823991563958794920

添加动作,设置分级报警

1563958839235

1563958850591

再次关闭80端口测试

1563958930377

1563958905204

(两个邮箱都收到了报警)

打开80端口

1563959006998

1563958990142

实现nginx自治愈

创建nginx自治愈动作

1563961497531

1563961697672

对zabbix agent进行配置
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
EnableRemoteCommands=1 #允许远程命令
UnsafeUserParameters=1 #允许特殊字符

给zabbix用户添加sudo权限,设置nopasswd
[root@zabbix-proxy-z ~]# vim /etc/sudoers
zabbix  ALL=(ALL)  NOPASSWD:ALL

重启zabbix agent
[root@zabbix-proxy-z ~]# pkill zabbix_agent
[root@zabbix-proxy-z ~]# /apps/zabbix_proxy/sbin/zabbix_agentd -c /apps/zabbix_proxy/etc/zabbix_agentd.conf

停止nginx服务进行测试

1563961976892

zabbix 监控到80端口关闭后,认为nginx服务不存在,zabbix用户自动开启了nginx服务

SNMP协议

SNMP是英文“Simple Network Management Protocol”的缩写,中文意思是“简单网络管理协议,SNMP是一种简单网 络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议,SNMP主要用于网络设备的管理。

SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使 得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空 间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。

SNMP协议是TCP/IP协议簇的一个应用层协议,在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个 短期的网络管理解决方案,由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以 增强SNMPv1的安全性和功能,SNMP的协议版本目前有SNMP v1、SNMP v2c和SNMP v3三种版本,其具体差别如下:

  • SNMP v1采用团体名(Community Name)认证,团体名用来定义SNMP NMS和SNMP Agent的关系,如果SNMP报文携带的团体 名没有得到设备的认可,该报文将被丢弃,团体名起到了类似于密码的作用,用来限制SNMP NMS对SNMP Agent的访问。

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

  • SNMP v3提供了基于用户的安全模型(USM,User-Based Security Model)的认证机制,用户可以设置认证和加密功能,认证用于 验证报文发送方的合法性,避免非法用户的访问,加密则是对NMS和Agent之间的传输报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为SNMP NMS和SNMP Agent之间的通信提供更高的安全性。

SNMP工作机制

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

  • NMS(Network Management Station,网络管理站)是运行SNMP客户端程序的工作站,能够提供非常友好的人机交互界面,方便 网络管理员完成绝大多数的网络管理工作。
  • Agent是驻留在设备上的一个进程,负责接收、处理来自NMS的请求报文。在一些紧急情况下,如接口状态发生改变等,Agent 也会主动通知NMS。
  • NMS是SNMP网络的管理者,Agent是SNMP网络的被管理者。NMS和Agent之间通过SNMP协议来交互管理信息。

SNMP数据交互

SNMP管理进程与代理进程之前为了交互信息,定义了5种报文:

  • get-request操作:从代理进程处提取一个或多个参数值。
  • get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
  • set-request操作:设置代理进程的一个或多个参数值。
  • get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的。
  • trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。

1563938836536

SNMP组织结构

一套完整的SNMP系统主要包括以下几个方面:

  1. SNMP报文协议
  2. 管理信息机构(SMI, Structure ofManagement Information),一套公用的结构和表示符号。)
  3. 管理信息库(MIB,Management Information Base),管理信息库包含所有代理进程的所有可被查询和修改的参数。
  4. OID(Object Identifiers),一个OID是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识), 如端口信息、设备名称等。

SNMP MIB

所谓(MIB)管理信息库,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。MIB是基于 对象标识树的,对象标识是一个整数序列,中间以"."分割,这些整数构成一个树型结构,类似于 D N S或U n i x的文 件系统,M I B被划分为若干个组,如s y s t e m、 i n t e r f a c e s、 a t(地址转换)和i p组等。i s o . o r g . d o d . i n t e r n e t .p r i v a t e . e n t e r p r i s e s( 1 . 3 . 6 . 1 . 4 . 1)这个标识,是给厂家自定义而预留的,比如华为的为1.3.6.1.4.1.2011, 华三的为1.3.6.1.4.1.25506。

1563939150737

SNMP OID

Centos 部分常用的OID:

CPU负载 1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3
CPU信息 percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0
系统信息 sysDescr 1.3.6.1.2.1.1.1
sysObjectID 1.3.6.1.2.1.1.2
sysUpTime 1.3.6.1.2.1.1.3
sysContact 1.3.6.1.2.1.1.4
sysName 1.3.6.1.2.1.1.5
内存使用 Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAM Free: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0
硬盘使用 Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1

如何测试OID:

snmpwalk是SNMP的一个工具,它使用SNMP的GET请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。

要使用snmpwalk需要先安装net-snmp软件包
[root@s1 ~]# yum -y install net-snmp-utils
[root@s1 ~]# 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时才需要。

模拟使用snmp协议监控网络设备

系统 IP 服务
Ubuntu 192.168.184.148 zabbix server
centos 192.168.184.146 网络设备
在192.168.184.146主机上
安装snmp包,将192.168.184.146作为网络设备
[root@snmp ~]# yum install net-snmp -y
[root@snmp ~]# vim /etc/snmp/snmpd.conf 

com2sec notConfigUser  default       123456 #设置团体认证,默认为public

group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser #将团体名称notConfigUser关联至组notConfigGroup

view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
view    systemview    included   .1.3.6. 创建view,并对其授权可访问的OID范围

access  notConfigGroup ""      any       noauth    exact  systemview none none #将组notConfigGroup关联至systemview 从而完成组的授权

启动服务
[root@snmp ~]# systemctl restart snmpd
[root@snmp ~]# systemctl enable snmpd
Created symlink from /etc/systemd/system/multi-user.target.wants/snmpd.service to /usr/lib/systemd/system/snmpd.service.
[root@snmp ~]# ss -unl
State    Recv-Q Send-Q    Local Address:Port          Peer Address:Port              
UNCONN      0      0              *:161                        *:*                  
UNCONN      0      0              *:60608                      *:*                  
UNCONN      0      0              *:68                         *:*                  
UNCONN      0      0              :::33848                     :::*     

在zabbix server端测试能否通过SNMOP采集数据:
root@zabbix-server:~# snmpwalk -v 2c -c 123456 192.168.184.146  .1.3.6.1.4.1.2021.10.1.3.1
iso.3.6.1.4.1.2021.10.1.3.1 = STRING: "0.00"

root@zabbix-server:~# snmpwalk -v 2c -c 123456 192.168.184.146  .1.3.6.1.4.1.2021.10.1.3.2
iso.3.6.1.4.1.2021.10.1.3.2 = STRING: "0.01"

在server上创建主机

1564112903121

关联模版

1564112919478由于前面我们修改了团体认证为123456,所以需要在server上把团体认证改成一样

1564115159461

1564115597414

验证监控数据

1564115552178

监控MySQL

系统 IP 服务
Ubuntu1810 192.168.184.148 zabbix server
centos7.6 192.168.184.144 MySQL master
centos7.6 192.168.184.143 MySQL slave

部署MySQL主从

部署MySQL主从
1.配置MySQL master
[root@t2 yum.repos.d]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=10
log-bin=/data/mysql/master-log

2.重启MySQL
[root@t2~]# systemctl restart mariadb

3.创建复制用户
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'rsync-user'@'192.168.184.%' IDENTIFIED BY '123456';

4.完全备份数据
[root@t2~]# mysqldump --all-databases --single_transaction --flush-logs --master-data=2 --lock-tables > /opt/backup.sql

5.将备份数据拷贝到slave上
[root@t2 ~]# scp /opt/backup.sql 192.168.184.146:/root/backup.sql

6.查看二进制日志位置
MariaDB [(none)]> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| master-log.000001 |    410490 |
| master-log.000002 |    578037 |
| master-log.000003 |   4772456 |
+-------------------+-----------+

7.配置MySQL slave
[root@zabbix-proxy-z ~]# vim /etc/my.cnf
[mysqld]
server-id=21
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

8.启动MySQL
[root@zabbix-proxy-z ~]# systemctl start mariadb

9.导入master的数据
MariaDB [(none)]> source backup.sql

10.配置同步信息
MariaDB [(none)]>CHANGE MASTER TO   
   MASTER_HOST='192.168.184.144',  
   MASTER_USER='rsync-user',   
   MASTER_PASSWORD='123456',     
   MASTER_LOG_FILE='master-log.000003',   
   MASTER_LOG_POS=4772456;

11.启动复制
MariaDB [(none)]> start slave;

12.确认复制状态
MariaDB [zabbix_proxy_zhu]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.184.144
                  Master_User: rsync-user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-log.000003
          Read_Master_Log_Pos: 5378824
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 606902
        Relay_Master_Log_File: master-log.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


使用percona监控MySQL

安装部署percona
1.官方文档及下载地址:
https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html #插件地址
https://www.percona.com/downloads/ #下载地址
https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html#installation-instructions #安装教程

2.本地安装部署
[root@zabbix-proxy-z ~]#yum install php php-mysql -y #安装php环境

3.安装模版文件
[root@zabbix-proxy-z ~]#wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm
[root@zabbix-proxy-z ~]#rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm

4.拷贝配置文件
[root@zabbix-proxy-z ~]#cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /apps/zabbix_proxy/etc/zabbix_agentd.conf.d/

5.修改zabbix agent配置文件
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
Include=/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/*.conf

6.重启zabbix agent
[root@zabbix-proxy-z ~]# systemctl restart zabbix-agent

7.创建ss_get_mysql_stats.php.cnf文件,配置连接mysql用户和密码
[root@zabbix-proxy-z ~]# cat  /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf
<?php
$mysql_user = 'root';
$mysql_pass = ''; #由于我的MySQL没有设置密码,故不填

8.测试数据
[root@zabbix-proxy-z ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
5630
注:能够获取到数据就代表正常,也可以在server端使用zabbix_get测试。
   如果无法获取数据,就要查看/tmp目录下是否有一个localhost-mysql_cacti_stats.txt文件,有的话就将其权限改为zabbix用户和组
[root@zabbix-proxy-z ~]# chown zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt
root@zabbix-server:~# zabbix_get -s 192.168.184.143 -p 10050 -k "MySQL.Key-read-requests"
5630

在server上导入模板 zbx_mysql_export_templates.xml,更改模版模式为主动模式,关联到主机

1564130605536

1564130636715

验证数据:

1564130712118

自定义监控数据库

1.编写监控MySQL脚本
[root@zabbix-proxy-z zabbix_agentd.conf.d]# pwd
/apps/zabbix_proxy/etc/zabbix_agentd.conf.d
[root@zabbix-proxy-z zabbix_agentd.conf.d]# cat mysql_monitor.sh 
#!/bin/bash
Seconds_Behind_Master(){
	NUM=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Seconds_Behind_Master:" | awk -F: '{print $2}'`
	echo $NUM
}

master_slave_check(){
NUM1=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Slave_IO_Running" | awk -F:  '{print $2}' | sed 's/^[ \t]*//g'`
#echo $NUM1
NUM2=`mysql -uroot -hlocalhost   -e "show slave status\G;"  | grep "Slave_SQL_Running:" | awk -F:  '{print $2}' | sed 's/^[ \t]*//g'`
#echo $NUM2
if test $NUM1 == "Yes" &&  test $NUM2 == "Yes";then
    echo 50
else
    echo 100
fi
}

main(){
    case $1 in
        Seconds_Behind_Master)
           Seconds_Behind_Master;
           ;;
	master_slave_check)
	   master_slave_check
	   ;;
    esac
}
main $1

导入自定义配置
[root@zabbix-proxy-z ~]# vim /apps/zabbix_proxy/etc/zabbix_agentd.conf
Include=/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/*.conf

自定义监控项
[root@zabbix-proxy-z zabbix_agentd.conf.d]# cat mysql_monitor.conf 
UserParameter=mysql_monitor[*],/apps/zabbix_proxy/etc/zabbix_agentd.conf.d/mysql_monitor.sh $1

测试脚本,当slave复制开启时,获取到的值为50,停止时为100
#start slave;
[root@zabbix-proxy-z zabbix_agentd.conf.d]# bash mysql_monitor.sh master_slave_check
50 
#stop slave;
[root@zabbix-proxy-z zabbix_agentd.conf.d]# bash mysql_monitor.sh master_slave_check
100

在server上使用zabbix_get测试
root@zabbix-server:~# zabbix_get -s 192.168.184.143 -p 10050 -k "mysql_monitor[master_slave_check]"
100

确认无误后,重启zabbix-agent
[root@zabbix-proxy-z]# systemctl restart zabbix-agent

在server上创建监控模版

1564131399699

添加监控项

15641314357951564131449206

关联主机

1564131520899

创建图形

1564131551348

创建触发器

1564131574104

验证数据

1564131600279

1564131614174

添加动作

1564131699708

当slave复制停止时,zabbix 会检测到,并且发送邮件报警

1564131969550

MySQL主从同步自治愈

添加动作

1564132444410

添加操作

1564132478184

手段停止复制进行测试

[root@zabbix-proxy-z zabbix_agentd.conf.d]# mysql -e "stop slave"

1564131969550

然后再查看slave status 状态已经恢复正常
[root@zabbix-proxy-z zabbix_agentd.conf.d]# mysql -e "show slave status\G"
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.184.144
                  Master_User: rsync-user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-log.000003
          Read_Master_Log_Pos: 18632349
               Relay_Log_File: mariadb-relay-bin.000006
                Relay_Log_Pos: 437035
        Relay_Master_Log_File: master-log.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

IO监控

实现短信/微信报警

1.微信报警

1.注册一个企业微信

1564134856888

2.自建一个应用

1564134887170

3.在zabbix server上创建媒介类型

1564135147597

4.给用户添加报警

1564135264402

安装python模块
root@zabbix-server:~# apt-get install python-pip
root@zabbix-server:~# pip install requests

批量添加zabbix agent