学习zabbix(八)
阅读原文时间:2023年07月09日阅读:5

zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。

Zabbix 的运行架构如下图所示:

1.1 组件

zabbix 由以下几个组件部分构成:

1) Zabbix Server:

负责接收 agent 发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行;

2) Database Storage:

专用于存储所有配置信息,以及由 zabbix 收集的数据;

3) Web interface:

zabbix 的 GUI 接口,通常与 Server 运行在同一台主机上;

4) Proxy:

可选组件,常用于分布监控环境中,代理 Server 收集部分被监控端的监控数据

并统一发往 Server 端;

5) Agent:

部署在被监控主机上,负责收集本地数据并发往 Server 端或 Proxy 端;

注:zabbix node 也是 zabbix server 的一种 。

1.2 进程

默认情况下zabbix包含5个程序: zabbix_agentd、 zabbix_get、 zabbix_proxy、 zabbix_sender、zabbix_server,另外一个 zabbix_java_gateway 是可选,这个需要另外安装。

下面来分别介绍下他们各自的作用:

 zabbix_agentd

客户端守护进程,此进程收集客户端数据,例如 cpu 负载、内存、硬盘使用情况等。

 zabbix_get

zabbix 工具,单独使用的命令,通常在 server 或者proxy端执行获取远程客户端信息的命令。 通常用户排错。 例如在server端获取不到客户端的内存数据, 我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。

 zabbix_sender

zabbix 工具,用于发送数据给 server 或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致 zabbix 超时。于是我们在脚本执行完毕之后,使用 sender 主动提交数据。

 zabbix_server

zabbix 服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway 的数据最终都是提交到 server

备注:当然不是数据都是主动提交给 zabbix_server,也有的是 server 主动去取数据。

 zabbix_proxy

zabbix 代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到 server 里。

 zabbix_java_gateway

zabbix2.0 之后引入的一个功能。顾名思义:Java 网关,类似 agentd,但是只用于 Java方面。需要特别注意的是,它只能主动去获取数据,而不能被动获取数据。 它的数据最终会给到server或者proxy。

1.3 zabbix监控环境中相关术语

  • 主机(host) :

要监控的网络设备,可由 IP 或 DNS 名称指定;

  • 主机组(host group):

主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;

 监控项(item) :

一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是 zabbix 进行数据收集的核心,相对某个监控对象,每个 item 都由"key"标识;

 触发器(trigger) :

一个表达式,用于评估某监控对象的特定 item 内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";

 事件(event) :

触发一个值得关注的事情,比如触发器状态转变,新的 agent 或重新上

线的 agent 的自动注册等;

 动作(action) :

指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;

 报警媒介类型(media) :

发送通知的手段或者通道,如 Email、Jabber 或者 SMS 等;

 模板 (template) :

用于快速定义被监控主机的预设条目集合, 通常包含了 item、 trigger、graph、 screen、 application 以及 low-level discovery rule;模板可以直接链接至某个主机;

 前端(frontend) :

Zabbix 的 web 接口

2.1 搭建自定义yum仓库并安装支持包

[root@localhost rpm]# pwd
/root/rpm
[root@localhost rpm]# ls
fontconfig-2.8.0-5.el6.x86_64.rpm        libX11-common-1.6.4-3.el6.noarch.rpm
fontconfig-devel-2.8.0-5.el6.x86_64.rpm  libX11-devel-1.6.4-3.el6.x86_64.rpm
freetype-2.3.11-17.el6.x86_64.rpm        libXau-devel-1.0.6-4.el6.x86_64.rpm
freetype-devel-2.3.11-17.el6.x86_64.rpm  libxcb-1.12-4.el6.x86_64.rpm
gd-devel-2.0.35-11.el6.x86_64.rpm        libxcb-devel-1.12-4.el6.x86_64.rpm
libICE-1.0.6-1.el6.x86_64.rpm            libXext-1.3.3-1.el6.x86_64.rpm
libSM-1.2.1-2.el6.x86_64.rpm             libXpm-devel-3.5.10-2.el6.x86_64.rpm
libvpx-1.3.0-5.el6_5.x86_64.rpm          libXt-1.1.4-6.1.el6.x86_64.rpm
libvpx-devel-1.3.0-5.el6_5.x86_64.rpm    repodata
libX11-1.6.4-3.el6.x86_64.rpm            xorg-x11-proto-devel-7.7-14.el6.noarch.rpm
[root@localhost rpm]# cat /etc/yum.repos.d/CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[rpm]
name=rpm
baseurl=file:///root/rpm/
gpgcheck=0
enabled=1

[root@localhost yum.repos.d]# yum -y install pcre pcre-devel zlib-devel libaio libaio-devel libxml2 libxml2-devel bzip2-devel openssl openssl-devel net-snmp-devel net-snmp curl-devel gd gcc gcc-c++ make libjpeg-devel libpng-devel libcurl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker mysql-devel net-snmp-utils

#如果下一步出现问题,请注释掉yum配置文件里的本地光盘源
[root@localhost rpm]# yum -y install libvpx-devel gd-devel

2.2 编译安装LNMP环境

2.2.1 安装nginx

[root@localhost ~]# useradd -s /sbin/nologin -M www
[root@localhost ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-1.10.2/
[root@localhost nginx-1.10.2]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module && make && make install
[root@localhost nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

#创建nginx配置文件模版
[root@localhost nginx-1.10.2]# cd /usr/local/nginx/conf/
[root@localhost conf]# egrep -v "^$|#" nginx.conf.default > nginx.conf

#将nginx配置文件改成如下内容
[root@localhost conf]# vim nginx.conf
[root@localhost conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
    location / {
        root   html;
        index  index.php index.html index.htm;
    }
    location = /nginx-status {
                stub_status on;
                access_log off;
        }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@localhost conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

2.2.2 安装mysql

[root@localhost ~]# tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mv mysql-5.5.32-linux2.6-x86_64 mysql
[root@localhost local]# cd mysql/
[root@localhost mysql]# /bin/cp support-files/my-small.cnf /etc/my.cnf
[root@localhost mysql]# useradd -s /sbin/nologin -M mysql
[root@localhost mysql]# chown -R mysql.mysql data
[root@localhost mysql]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
...以下省略若干...

[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chmod +x /etc/init.d/mysqld
[root@localhost mysql]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
[root@localhost mysql]# netstat -antup | grep 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3990/mysqld

2.2.3 安装libmcrypt

[root@localhost ~]# tar xf libmcrypt-2.5.8.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/libmcrypt-2.5.8/
[root@localhost libmcrypt-2.5.8]# ./configure && make && make install

2.2.4 安装GD

[root@localhost ~]# tar xf GD-2.18.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/GD-2.18/
[root@localhost GD-2.18]# perl Makefile.PL
[root@localhost GD-2.18]# make && make install

2.2.5 安装PHP

[root@localhost ~]# tar xf php-5.6.30.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/php-5.6.30/
[root@localhost php-5.6.30]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-bz2 --with-curl --enable-sockets --disable-ipv6 --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-iconv-dir=/usr/local --enable-mbstring --enable-calendar --with-gettext --with-libxml-dir=/usr/local --with-zlib --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --enable-bcmath
[root@localhost php-5.6.30]# make && make install

#创建php配置文件
[root@localhost php-5.6.30]# cp php.ini-development /usr/local/php/etc/php.ini

#修改php配置文件php.ini
[root@localhost php-5.6.30]# cat -n /usr/local/php/etc/php.ini | sed -n '372p;382p;393p;660p;702p;820p;936p'
   372  max_execution_time = 300
   382  max_input_time = 300
   393  memory_limit = 256M
   660  post_max_size = 32M
   702  always_populate_raw_post_data = -1
   820  upload_max_filesize = 16M
   936  date.timezone =Asia/Shanghai

#创建php-fpm配置文件
[root@localhost php-5.6.30]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

#修改php-fpm.conf配置文件
[root@localhost etc]# cat -n php-fpm.conf | sed -n '149,150p'
   149  user = www
   150  group = www

2.3 安装zabbix server端

2.3.1 编译安装zabbix server

[root@localhost ~]# useradd zabbix -s /sbin/nologin -M
[root@localhost ~]# tar xf zabbix-3.2.4.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/zabbix-3.2.4/
[root@localhost zabbix-3.2.4]# ./configure --prefix=/usr/local/zabbix --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy --with-libxml2
[root@localhost zabbix-3.2.4]# make && make install

#由于zabbix启动脚本路径默认指向的是/usr/local/sbin路径,因此,需要提前简历软连接:
[root@localhost zabbix-3.2.4]# ln -s /usr/local/zabbix/sbin/* /usr/local/sbin/
[root@localhost zabbix-3.2.4]# ln -s /usr/local/zabbix/bin/* /usr/local/bin/

2.3.2 配置zabbix的mysql环境

Zabbix server 和mysql安装到一台服务器上,首先需要手动创建zabbix数据库,操作如下:

[root@localhost ~]# which mysqladmin
/usr/bin/mysqladmin
[root@localhost ~]# mysqladmin -uroot password '123123'
[root@localhost ~]# mysql -uroot -p123123 -e 'create database zabbix character set utf8;'
[root@localhost ~]# mysql -uroot -p123123 -e "grant all privileges on zabbix.* to zabbix@'localhost' identified by '123123';"
[root@localhost ~]# mysql -uroot -p123123 -e 'flush privileges;'

#如下数据的导入顺序不可以错
[root@localhost ~]# mysql -uzabbix -p123123 zabbix < /usr/src/zabbix-3.2.4/database/mysql/schema.sql
[root@localhost ~]# mysql -uzabbix -p123123 zabbix < /usr/src/zabbix-3.2.4/database/mysql/images.sql
[root@localhost ~]# mysql -uzabbix -p123123 zabbix < /usr/src/zabbix-3.2.4/database/mysql/data.sql

2.4 安装Zabbix web GUI

  • Zabbix web是php代码编写的,因此需要有php环境,前面已经安装好了lnmp,因此可以直接使用。
  • 默认的nginx安装的根目录为/usr/local/nginx/html,因此,只需要Zabbix web的代码放到此目录即可。
  • Zabbix web的代码在Zabbix源码包中的frontends/php目录下,将这个php目录拷贝到/usr/local/nginx/html/目录下并改名zabbix即可完成Zabbix web端的安装。
  • 在浏览器输入http://IP/zabbix,然后会检查zabbix web运行环境是否满足,并提供连接数据库的相关信息即可,最后将连接数据库相关信息都存入文件zabbix/conf/zabbix.conf.php中,这样就可以登录zabbix的web平台了。
  • 默认的zabbix平台登录用户名为Admin,密码为zabbix。

2.4.1 复制zabbix web目录到nginx web根目录下

[root@localhost ~]# cp -rp /usr/src/zabbix-3.2.4/frontends/php /usr/local/nginx/html/zabbix
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls -l
total 12
-rw-r--r--.  1 root root  537 Dec  8 14:15 50x.html
-rw-r--r--.  1 root root  612 Dec  8 14:15 index.html
drwxr-xr-x. 13 1000 1000 4096 Feb 27  2017 zabbix
[root@localhost html]# chown -R www.www zabbix
[root@localhost html]# ll -d zabbix/
drwxr-xr-x. 13 www www 4096 Feb 27  2017 zabbix/

2.4.2 启动nginx服务及php-fpm

[root@localhost html]# /usr/local/nginx/sbin/nginx
[root@localhost html]# netstat -antup | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      8439/nginx
[root@localhost local]# /usr/local/php/sbin/php-fpm
[root@localhost local]# netstat -antup | grep php-fpm
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      8522/php-fpm  

2.4.3 登录web根据提示生成zabbix.conf.php配置文件

#起初并没有zabbix.conf.php配置文件,我们可以选择自动生成配置文件
[root@localhost ~]# cd /usr/local/nginx/html/zabbix/conf
[root@localhost conf]# ls
maintenance.inc.php  zabbix.conf.php.example

在浏览器里输入http://IP/zabbix,配置zabbix数据库环境,如下图所示:

执行如上图所示的步骤生成zabbix.conf.php配置文件

[root@localhost conf]# pwd
/usr/local/nginx/html/zabbix/conf
[root@localhost conf]# ls
maintenance.inc.php  zabbix.conf.php  zabbix.conf.php.example
[root@localhost conf]# cat zabbix.conf.php      #里面记录的信息就是我们刚刚的操作
<?php
// Zabbix GUI configuration file.
global $DB;

$DB['TYPE']     = 'MYSQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER']     = 'zabbix';
$DB['PASSWORD'] = '123123';

// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';

$ZBX_SERVER      = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'zabbixserver';

$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;

提示:

除了通过web界面的方式生成zabbix.conf.php文件外,我们也可以利用zabbix.conf.php.example的模版文件直接修改成我们需要的配置文件。

2.4.4 登录zabbix web

2.4.5 设置zabbix中文模式

3.1 zabbix_server.conf配置

通过源码安装方式将zabbix安装到/usr/local/zabbix下面,zabbix server的配置文件为/usr/local/zabbix/etc/zabbix_server.conf,需要修改的内容为如下:

#需要修改的内容为如下:
[root@localhost ~]# cd /usr/local/zabbix/etc/
[root@localhost etc]# cat -n zabbix_server.conf | sed -n '12p;38p;87p;103p;111p;118p;136p;165p;181p;297p;447p'
    12  # ListenPort=10051
    38  LogFile=/tmp/zabbix_server.log
    87  DBName=zabbix
   103  DBUser=zabbix
   111  # DBPassword=
   118  # DBSocket=/tmp/mysql.sock
   136  # StartPollers=5
   165  # StartTrappers=5
   181  # StartDiscoverers=1
   297  # ListenIP=0.0.0.0
   447  # AlertScriptsPath=${datadir}/zabbix/alertscripts

#将zabbix_server.conf文件内容修改成如下所示:
[root@localhost etc]# cat -n zabbix_server.conf | sed -n '12p;38p;87p;103p;111p;118p;136p;165p;181p;297p;447p'
    12  ListenPort=10051    #zabbix server监听端口
    38  LogFile=/tmp/zabbix_server.log  #zabbix server日志路径
    87  DBName=zabbix   #zabbix server连接MySQL数据库的数据库名
   103  DBUser=zabbix   #zabbix server连接MySQL数据库的用户名
   111  DBPassword=123123   #zabbix server连接MySQL数据库的密码
   118  DBSocket=/tmp/mysql.sock    #MySQL的实例文件位置
   136  StartPollers=5  #用于设置zabbix server服务启动时启动Pollers(主动收集数据进程)的数量,数量越多,则服务端吞吐能力越强,同时对系统资源消耗越大
   165  StartTrappers=10    #用于设置zabbix server服务启动时启动Trappers(负责处理Agentd推送过来的数据的进程)的数量。Agentd为主动模式时,zabbix server需要设置这个值大一些。
   181  StartDiscoverers=10 #用于设置zabbix server服务启动时启动Discoverers进程的数量,如果zabbix监控报Discoverers进程忙时,需要提高该值。
   297  ListenIP=0.0.0.0    #zabbix server启动的监听端口对哪些ip开放,Agentd为主动模式时,这个值建议设置为0.0.0.0
   447  AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts  #zabbix server运行脚本存放目录,一些供zabbix server使用的脚本,都可以放在这里。

3.2 添加相关服务和端口到系统配置文件

编辑/etc/services文件,在最后添加以下代码:

[root@localhost ~]# tail -4 /etc/services
zabbix-agent    10050/tcp       # Zabbix Agent
zabbix-agent    10050/udp       # Zabbix Agent
zabbix-trapper  10051/tcp       # Zabbix Trapper
zabbix-trapper  10051/udp       # Zabbix Trapper

其中,10051是zabbix server的监听端口,10050是zabbix agent的监听端口。

3.3 添加管理维护脚本

从zabbix源码包misc/init.d/fedora/cora/目录中找到zabbix_server和zabbix_agentd,然后复制到/etc/init.d目录下,由于我们的zabbix_agnetd采用rpm的安装方式,会自动添加启动脚本,所以在此处,我们不进行zabbix_agentd的启动脚本的复制。

[root@localhost ~]# cp /usr/src/zabbix-3.2.4/misc/init.d/fedora/core/zabbix_server /etc/init.d/zabbix_server
[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# chmod +x /etc/init.d/zabbix_server
[root@localhost init.d]# chkconfig zabbix_server on

3.4 启动zabbix_server端进程

[root@localhost ~]# /etc/init.d/zabbix_server start
Starting zabbix_server:                                    [  OK  ]
[root@localhost ~]# netstat -antup | grep zabbix_server
tcp        0      0 0.0.0.0:10051               0.0.0.0:*                   LISTEN      9319/zabbix_server 

zabbix agent端的安装建议采用rpm包方式安装,可从http://repo.zabbix.com/zabbix/3.2/下载zabbix的agent端rpm包,版本与zabbix server端保持一致,安装如下:

[root@localhost chen]# wget http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-agent-3.2.4-1.el6.x86_64.rpm
[root@localhost ~]# rpm -ivh zabbix-agent-3.2.4-1.el6.x86_64.rpm

安装完成后,zabbix agent端已经安装完成了,zabbix agent端的配置目录位于/etc/zabbix下,可在此目录进行配置文件的修改。

特别提示:

  • zabbix server的源码包本身就包含了zabbix server端和zabbix agent端,因此,zabbix服务器端无需再安装zabbix agent的rpm包。
  • 然而zabbix agent的rpm包是为了方便在服务器上进行快速安装而设计的快捷安装包。
  • 因此为了统一,监控端和被监控端的zabbix agent我们都用rpm的安装方式

修改zabbix agent端的配置文件

#需要修改的内容如下所示:
[root@Zabbix_Server ~]# cd /etc/zabbix/
[root@localhost zabbix]# cat -n zabbix_agentd.conf | sed -n '13p;32p;95p;103p;120p;136p;147p;265p;284p'
    13  PidFile=/var/run/zabbix/zabbix_agentd.pid
    32  LogFile=/var/log/zabbix/zabbix_agentd.log
    95  Server=127.0.0.1
   103  # ListenPort=10050
   120  # StartAgents=3
   136  ServerActive=127.0.0.1
   147  Hostname=Zabbix server
   265  Include=/etc/zabbix/zabbix_agentd.d/*.conf
   284  # UnsafeUserParameters=0

#将内容修改为如下所示:
[root@localhost zabbix]# cat -n zabbix_agentd.conf | sed -n '13p;32p;95p;103p;120p;136p;147p;265p;284p'
    13  PidFile=/var/run/zabbix/zabbix_agentd.pid   #进程pid存放路径
    32  LogFile=/var/log/zabbix/zabbix_agentd.log   #zabbix agent日志存放路径
    95  Server=127.0.0.1,192.168.0.220  #指定zabbix server端IP地址
   103  ListenPort=10050    #指定agentd的监听端口
   120  StartAgents=3       #指定启动agentd进程数量。设置0表示关闭
   136  ServerActive=192.168.0.220:10051    #启用agnetd主动模式,启动主动模式后,agentd将主动将收集到的数据发送到zabbix server端,Server Active后面指定的IP就是zabbix server端IP
   147  Hostname=192.168.0.220 #需要监控服务器的主机名或者IP地址,此选项的设置一定要和zabbix web端主机配置中对应的主机名一致。
   265  Include=/etc/zabbix/zabbix_agentd.d/    #相关配置都可以放到此目录下,自动生效
   284  UnsafeUserParameters=1  #启用agent端自定义item功能,设置此参数为1后,就可以使用UserParameter指令了。UserParameter用于自定义item

启动zabbix_agent端进程

[root@localhost ~]# /etc/init.d/zabbix-agent start
Starting Zabbix agent:                                     [  OK  ]
[root@localhost ~]# netstat -antup | grep zabbix_agent
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN      1322/zabbix_agentd
tcp        0      0 :::10050                    :::*                        LISTEN      1322/zabbix_agentd
[root@localhost init.d]# chkconfig zabbix-agent on

我们在监控端和被监控端都进行如上所述的zabbix agent端的安装。

如何知道zabbix server监控已经生效呢,可通过zabbix server上的zabbix_get命令来完成,在zabbix server上执行如下命令即可进行测试:

#利用如下命令进行测试
/usr/local/zabbix/bin/zabbix_get -s 192.168.0.221 -p 10050 -k "system.uptime"

-s 是指定zabbix agent端的IP地址
-p 是指定zabbix agent端的监听端口
-k 是监控项,即item
如果有输出结果,表面zabbix server可以从zabbix agent获取数据,配置成功。

具体操作如下:

#在监控端zabbix_server端进行如下操作
[root@localhost init.d]# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.221 -p 10050 -k "system.uptime"
26330       #有数据显示就代表监控正常
[root@localhost init.d]# /usr/local/zabbix/bin/zabbix_get -s 192.168.0.220 -p 10050 -k "system.uptime"
55653       #有数据显示就代表监控正常

6.1 Zabbix Web 操作概述

6.1.1 Zabbix首页仪表提示面板

  • 常用的图形:可以根据自己喜好,添加按主机按监控项添加快捷的查看链接
  • 常用的聚合图形:可以将多个监控图形的曲线合并显示
  • 常用的拓扑图:集群的架构图
  • 主机状态:被监控的主机的实时状态
  • Web检测:发一个http请求,看看web是否能正常访问
  • 系统状态:监控端zabbix server服务器的状态
  • 最近20个问题:最后发生的20个告警信息
  • Zabbix状态:zabbix server监控的详细汇总信息

6.1.2 自定义首页面板

调整后,如下所示:

6.1.3 追加常用的监控图形

6.1.4 修改账户密码

6.1.5 设置报警提示声音

6.1.6 获取最新的zabbix共享模版

6.2 自定义被监控的服务器

6.2.1 自定义一个主机组

特别提示

在生产环境时,主机组的名字一定要用英文,不然,当zabbix进行二次开发的时候,中文名称都是乱码。那感觉很让人想死…

6.2.2 自定义一个主机

特别提示

在生产环境中主机的名字一定要是英文,并且务必和真实主机的主机名一致,且必须归类加入到主机组中。不然zabbix在进行二次开发的时候会非常麻烦(需要建立类似索引形式的东西去关联真实服务器)

6.3 自定义一个监控项

6.3.1 进行监控项的后台定义

现在假如我们要定义一个获取nginx连接数的监控项,那么我们先得去尝试能够获取这个值。在之前的nginx配置文件里我们已经加入了status模块的获取

(1)我们登录网页获取这个信息

(2)我们尝试通过命令获取这个信息

[root@localhost zabbix_agentd.d]# curl -s "http://192.168.0.220:80/nginx-status"
Active connections: 6
server accepts handled requests
 301 301 8833
Reading: 0 Writing: 1 Waiting: 5
[root@localhost zabbix_agentd.d]# curl -s "http://192.168.0.220:80/nginx-status" | grep "Active"
Active connections: 6
[root@localhost zabbix_agentd.d]# curl -s "http://192.168.0.220:80/nginx-status" | grep "Active" | awk '{print $NF}'
6

(3)在zabbix agent配置文件里定义这个监控项

[root@localhost ~]# cd /etc/zabbix/     #进入zabbix agent目录
[root@localhost zabbix]# ls
zabbix_agentd.conf  zabbix_agentd.d
[root@localhost zabbix]# vim zabbix_agentd.conf
[root@localhost zabbix]# sed -n '257,270p' zabbix_agentd.conf
### Option: Include
#   You may include individual files or all files in a directory in the configuration file.
#   Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
#
# Mandatory: no
# Default:
# Include=

Include=/etc/zabbix/zabbix_agentd.d/        #我们发现zabbix_agentd.d目录已经默认被include进入了主配置文件。

# Include=/usr/local/etc/zabbix_agentd.userparams.conf
# Include=/usr/local/etc/zabbix_agentd.conf.d/
# Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf

由于zabbix_agentd.conf配置文件默认导入了所有zabbix_agentd.d目录下的内容,因此我们可以将监控项定义到zabbix_agentd.d目录下。

(4)参考模版,自己定义监控项的获取命令

[root@localhost zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@localhost zabbix_agentd.d]# vim nginx.conf
[root@localhost zabbix_agentd.d]# cat nginx.conf
[root@localhost zabbix_agentd.d]# cat nginx.conf
UserParameter=nginx.active,/usr/bin/curl -s "http://192.168.0.220:80/nginx-status" | grep "Active" | awk '{print $NF}'

(5)自定义监控项,等于改变了配置文件,自然需要重启zabbix_agentd

[root@localhost ~]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

(6)在zabbix server端测试获取自定义的监控项信息

[root@localhost ~]# zabbix_get -s 192.168.0.220 -p 10050 -k "nginx.active"
6

至此zabbix自定义监控项的后台定义全部完成

6.3.2 进行监控项的前台定义

(1)点选一个被监控的主机

(2)进入监控项创建模版

(3)创建监控项

(4)创建完成的监控项

监控项创建完成以后,在zabbix server这个主机里就出现这个新定义的监控项了。

6.4 自定义一个监控项的图形

(1)点选一个被监控的主机

(2)进入图形创建模版

(3)查看图形绘图

(4)关于图形的各种显示效果

正常图形:

层积图形

Pie图形

爆发的图形

6.5 自定义一个聚合图形

(1)创建一个聚合图形

(2)编辑聚合图形

(3)选择展示图形

(4)将聚合图形添加到zabbix web首页面板

6.6 自定义一个拓扑图形

(1)进入拓扑图编辑界面

(2)添加一个新的拓扑图形

(3)拓扑图链接拓扑图

(4)拓扑图显示时时的连接带宽

上图中的标签内容如下:

{linux-node1.yunjisuan.com:net.if.out[eth0].last(0)}

linux-node1.yunjisuan.com为定义的主机名

net.if.out[eth0]为监控项的表达式

last(0)为取监控项的最后一个值

(1)熟悉Zabbix各模块操作,回家胡乱点点

(2)自学部署Smokeping网络监控

(3)自学Piwik流量分析系统

#######################################################################################

1.1 Zabbix Web下的主机和模版以及监控项的添加方式

(1)创建一个模版

我们所有的功能几乎都是在模版中定义的

我们再点进新创建的模版查看

模版里几乎可以设定我们需要的所有功能

(2)在模版里创建应用集

应用集的作用就是将众多的监控项进行一个分类,方便我们的管理

(3)在模版里创建一个zabbix自带的监控项

(4)监控项里的键值我们到底要如何写?我们需要学会照葫芦画瓢

我们选择一个系统模版Template OS Linux查看

(5)当然我们也可以自定义监控项的键值,但是并不推荐这样。因为,都是自己写太慢了。系统自带了很多键值我们要学会利用

自定义系统监控项的键值创建,请参考前一节的知识

1.2 Zabbix Web下触发器与表达式的编写方法

(1)avg

参数:秒或#num

支持类型:float,int

作用:返回一段时间的平均值

举例:
avg(5):最后5秒的平均值
avg(#5):表示最近5次得到值的平均值
avg(3600,86400):表示一天前的一个小时的平均值
如果仅有一个参数,表示指定时间的平均值,从现在开始算起,如果有第二个参数,表示漂移,从第二个参数前开始算时间,#n表示最近n次的值

(2)last

参数:秒或#num

支持值类型:float,int,str,text,log

作用:最近的值,如果为秒,则忽略,#num表示最近第N个值,请注意当前的#num和其他一些函数的#num的意思是不同的。

last(0)等价于last(#1)
last(#3)表示最近第3个值(并不是最近的三个值)
本函数也支持第二个参数time_shift,例如last(0,86400)返回一天前的最近的值。
如果在history中同一秒中有多个值存在看,Zabbix不保证值的精确顺序#num从Zabbix1.6.2起开始支持,timeshift从1.8.2起开始支持,可以查询avg()函数获取它的使用方法

(3)max

参数:秒或#num

支持值类型:float,int

描述:返回指定时间间隔的最大值。时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)。从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法。

例如:max(#3)=0 返回3次值如果都是0则触发告警

(4)min

参数:秒或#num

支持值类型:float,int

描述:返回指定时间间隔的最小值。时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)。从Zabbix1.8.2开始,函数支持第二个可选参数time_shift,可以查看avg()函数获取它的使用方法。

(5)nodata

参数:秒

支持值类型:any

描述:当返回值为1表示指定的间隔(间隔不应小于30秒)没有接收到数据,0表示获取到了。

例:nodata(5m)=1 ===>5分钟之内获取不到数据就告警

(6)prev

参数:忽略

支持值类型:float,int,str,text,log

描述:返回之前的值,类似于last(#2)

(7)sum

参数:秒或#num

支持值类型:float,int

描述:返回指定时间间隔中收集到的值的总和,时间间隔作为第一个参数支持秒或收集值的数目(以#开始).从Zabbix1.8.2开始,本函数支持time_shift作为第二个参数。可以查看avg函数获取它的用法。

(8)change

参数:忽略

支持类型:float,int,str,text,log

作用:返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同

change(0)>n:忽略参数一般输入0,表示最近得到的值与上一个值的差值大于n

(9)diff

参数:忽略

支持值类型:float,init,str,text,log

作用:返回值为1,表示最近的值与之前的值不同,0为相同。

例如:diff(0)>0 ===>表示现在获取的值如果和之前的不同就告警

例如:

1.3 Zabbix Web创建触发器过程以及触发器与监控项对应关系

(1)创建一个触发器

我们之前已经创建了一个检测内存剩余大小的监控项,现在我们给这个监控项加一个触发器。当内存小于20M时,触发报警

(2)进行表达器测试

表达式测试成功后,我们创建完毕即可

(3)在服务端进行监控项数据获取测试

监控项表达式说明

{aaaa:vm.memory.size[available].last()}<20M

aaaa:模版名

vm.memory.size:zabbix监控端向被监控端发送的代号

.last()<20 :last()<===>last(0)<===>last(#1)

[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "vm.memory.size"
1028517888              #获取对应IP的全部内存总量
[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "vm.memory.size[available]"
794337280           #获取对应IP的剩余内存总量

1.4 为了让同学们体会深刻,我们再创建一个监控项同时创建它的触发器

(1)快速创建一个Agent_ping监控项

(2)在监控端测试监控项的键值

[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "agent.ping"
1
[root@localhost ~]# zabbix_get -s 192.168.0.221 -k "agent.ping"
1
[root@localhost ~]# zabbix_get -s 192.168.0.222 -k "agent.ping"
zabbix_get [11715]: Get value error: cannot connect to [[192.168.0.222]:10050]: [113] No route to host

我们发现如果对方服务器IP能ping通,则返回值是1。反之不是1就有问题

(3)创建监控项的告警触发器

到这里就创建完毕了,请同学们仔细体会这个过程。

(1){Template App Zabbix Agent:agent.version.diff(0)}>0

解释:

如果当前获取的agent客户端的版本号大于前一次的不同,那么触发告警

(2){Template App Zabbix Agent:agent.ping.nodata(5m)}=1

解释:

如果ping客户端在5分钟内都没有数据,那么触发告警

(3){Template OS AIX:vm.memory.size[available].last(0)}<20M

解释:

如果最后一次获取的空闲内存大小得值小于20M,那么触发告警

(4){Template App SSH Service:net.tcp.service[ssh].max(#3)}=0

解释:

如果ssh远程连接连续获取的3次值的最大值都是0,那么触发告警

(5){Template ICMP Ping:icmppingloss.min(5m)}>20

解释:

如果连续5分钟里获取的最小值都大于20,那么触发告警

(6){Template ICMP Ping:icmppingsec.avg(5m)}>0.15

解释:

如果连续5分钟内的平均值大于0.15,那么触发告警

3.1 QQ邮件告警平台

3.1.1 安装sendmail

[root@localhost ~]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
[root@localhost ~]# yum -y install perl-Net-SSLeay perl-IO-Socket-SSL
[root@localhost ~]# tar xf sendEmail-v1.56.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/sendEmail-v1.56/
[root@localhost sendEmail-v1.56]# /bin/cp -ra sendEmail /usr/local/bin/
[root@localhost sendEmail-v1.56]# chmod +x /usr/local/bin/sendEmail
[root@localhost sendEmail-v1.56]# which sendmail
/usr/sbin/sendmail

3.1.2 sendmail命令使用说明

命令/参数

内容

解释说明

/usr/local/bin/sendEmail

命令主程序

-f

from@163.com

发件人邮箱

-t

to@163.com

收件人邮箱

-s

smtp.163.com

发件人邮箱的smtp服务器

-u

"我是邮件主题"

邮件的标题

-o

message-content-type=html

邮件内容的格式,html表示它是html格式

-o

message-charset=utf8

邮件内容编码

-xu

from@163.com

发件人邮箱的用户名

-xp

123456

发件人邮箱密码(授权码)

-m

"我是邮件内容"

邮件的具体内容

3.1.3 调整QQ邮箱设置

测试邮件发送

[root@localhost sendEmail-v1.56]# sendEmail -f 215379068@qq.com -t 215379068@qq.com -u "zabbix_server" -s smtp.qq.com -o message-content-type=html -o message-charset=utf8 -xu 215379068@qq.com -xp rtqnwthiqajdbihd -m "邮件发送成功"
Jan 19 18:09:10 localhost sendEmail[2403]: Email was sent successfully!

3.1.4 编写QQ邮件平台报警脚本

[root@localhost alertscripts]# pwd
/usr/local/zabbix/share/zabbix/alertscripts
[root@localhost alertscripts]# cat sendmail.sh
#!/bin/bash
# author:Mr.chen

to=$1

subject=$2

body=$3

from=215379068@qq.com

smtp=smtp.qq.com

passwd=rtqnwthiqajdbihd

/usr/local/bin/sendEmail -f "$from" -t "$to" -s "$smtp" -u "$subject" -o message-content-type=html -o message-charset=utf8 -xu "$from" -xp "$passwd" -m "$body"
[root@localhost alertscripts]# chmod +x sendmail.sh
[root@localhost alertscripts]# chown zabbix.zabbix sendmail.sh 

3.1.5 脚本测试

[root@localhost alertscripts]# sh sendmail.sh 215379068@qq.com "hello world" "新的一天"
Jan 19 18:20:32 localhost sendEmail[2478]: Email was sent successfully!

3.1.6 修改zabbix_server.conf配置文件

[root@localhost alertscripts]# cat -n /usr/local/zabbix/etc/zabbix_server.conf | grep "447"
   447  # AlertScriptsPath=${datadir}/zabbix/alertscripts

#将上述内容修改成如下所示
[root@localhost alertscripts]# cat -n /usr/local/zabbix/etc/zabbix_server.conf | grep "447"
   447  AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts

#重启zabbix_server服务
[root@localhost zabbix]# /etc/init.d/zabbix_server restart
Shutting down zabbix_server:                               [  OK  ]
Starting zabbix_server:                                    [  OK  ]

3.1.7 创建报警媒介

3.1.8 创建报警动作

步骤1-3也就是从1开始到3结束。一旦发生故障,就是执行sendmail.sh脚本发生报警邮件给zabbix用户。

假如故障持续了1个小时,它也只发送3次,第1-3次(即前3次)邮箱发送给zabbix用户,时间间隔为0秒。

如果改成1-0,0是表示不限制,无限发送。

3.1.9 QQ邮件报警测试

给自定义监控项nginx.avtive创建一个触发器,如下

利用Web进行访问,增加活动连接数,触发报警

3.2 微信报警平台

3.2.1 注册微信报警平台并绑定微信号

企业号注册连接https://qy.weixin.qq.com/cgi-bin/loginpage

3.2.2 编写微信平台报警脚本

编写脚本前,我们需要先记住3个关键的参数

(1)企业的CorpID

(2)企业的Secret

(3)部门ID号

然后我们就可以编写微信告警脚本了,如下:

[root@Zabbix_Server alertscripts]# cat weixin.sh
#!/bin/bash
# author:Mr.chen

CropID="########"           #这里填写我们的应用的CropID

Secret="#######"            #这里是应用的Secret

#下面的GURL和PURL地址无需改变,不用做任何变动
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"

Gtoken=`/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}'`

PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"

function body() {
        local int AppID=1000002 #这里是创建的应用ID
        local UserID=$1         #接收消息用户,系统传参
        local PartyID=1         #接收消息的部门ID
        local Msg=`echo "$@" | cut -d" " -f3-`
        printf '{\n'
        printf '\t"touser": "'"$UserID"\"",\n"
        printf '\t"toparty": "'"$PartyID"\"",\n"
        printf '\t"msgtype": "text",\n'
        printf '\t"agentid": "'" $AppID "\"",\n"
        printf '\t"text": {\n'
        printf '\t\t"content": "'"$Msg"\""\n"
        printf '\t},\n'
        printf '\t"safe":"0"\n'
        printf '}\n'
}

/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL

3.2.3 脚本测试

[root@Zabbix_Server alertscripts]# chmod +x weixin.sh
[root@Zabbix_Server alertscripts]# chown zabbix.zabbix weixin.sh
[root@Zabbix_Server alertscripts]# sh weixin.sh yinsendemogui "题目" "报警内容"
{"errcode":0,"errmsg":"ok","invaliduser":"#######"}

3.2.4 创建微信报警媒介类型

3.2.5 设定报警动作

3.2.6 微信平台报警测试

3.3 自定义自动报警的内容

(1)自定义内容样例

如果不修改报警的内容格式,看起来太乱了。我们可以按照如下方式修改

#告警通知格式样例
#题目
A故障:{TRIGGER.STATUS},服务器:{HOSTNAME1}发生:{TRIGGER.NAME}故障!
#内容
告警主机:&nbsp;{HOSTNAME1}<br/>
告警时间:&nbsp;{EVENT.DATE} {EVENT.TIME}<br/>
告警等级:&nbsp;{TRIGGER.SEVERITY}<br/>
告警信息:&nbsp;{TRIGGER.NAME}<br/>
告警项目:&nbsp;{TRIGGER.KEY1}<br/>
问题详情:&nbsp;{ITEM.NAME}&nbsp{ITEM.VALUE}<br/>
当前状态:&nbsp;{TRIGGER.STATUS}&nbsp{ITEM.VALUE1}<br/>
事件ID:&nbsp;{EVENT.ID}

(2)样例测试

4.1 概述

有时候当我们监控的项目在Zabbix预定义的key中没有定义时,这时候我们可以通过编写Zabbix的用户参数的方法来监控我们要求的项目item。形象一点说Zabbix代理端配置文件中的User parameters就相当于通过脚本获取要监控的值,然后把相关的脚本或者命令写入到配置文件中的User parameter中,然后Zabbix server读取配置文件中的返回值通过处理前端的方式返回给用户。

用户参数的语法

UserParameter=<key>,<command>

其中,Userparameter为关键字,key为用户自定义key名字可以随便起,

一个简单的例子:

UserParameter=ping,echo 1

代理程序将会永远的返回1,当我们在服务器端添加item的key为ping的时候。

稍微复杂的例子:

UserParameter=mysql.ping,/usr/local/mysql/bin/mysqladmin ping | grep -c alive

  • 当我们执行mysqladmin -uroot ping命令的时候如果mysql存活要返回mysqld is alive,我们通过grep -c来计算mysqld is alive的个数,如果mysql存活着,则个数为1,如果不存活很明显mysqld is alive的个数为0,通过这种方法我们可以来判断mysql的存活状态。
  • 当我们在服务器端添加item的key为mysql.ping时候,对于Zabbix代理程序,如果mysql存活,则状态将返回1,否则,状态将返回0。

4.2 让key接受参数

让key也接受参数的方法使item添加时更具备了灵活性,例如系统预定义key:vm.memory.size[

相关语法:

UserParameter=key[*],command

#描述:

key:key的值在主机系统中必须是唯一的,其中*代表命令中接受的参数

command:客户端系统中可执行的命令

#举例:

UserParameter=ping[*],echo $1
ping[0]:此时0就是*,也就是传入参数是0,$1也就是0,因此表达式将一直返回‘0’
ping[aaa]:此时aaa就是*,也就是传入参数是aaa,$1也就是aaa,因此表达式将一直返回‘aaa’

4.3 让我们自定义一个可以传递参数的监控项

我们做一个可以根据条件获取内存数值大小的监控项mem_check

当我们键值为mem_check[free]时,获取剩余可用内存大小

当我们键值为mem_check[used]时,获取实际占用内存大小

当我们键值为mem_check时,获取总内存大小

4.3.1 我们先制作一个获取数据的脚本

[root@Zabbix_Server ~]# mkdir -p /server/scripts
[root@Zabbix_Server ~]# cd /server/scripts/
[root@Zabbix_Server scripts]# cat mem_check
#!/bin/bash
# author:Mr.chen

case $1 in
    free)
        echo "`free | awk 'NR==3{print $4}'`"
        ;;
    used)
        echo "`free | awk 'NR==3{print $3}'`"
        ;;
    *)
        echo "`free | awk 'NR==2{print $2}'`"
        ;;
esac

4.3.2 测试脚本

[root@Zabbix_Server scripts]# chmod +x mem_check
[root@Zabbix_Server scripts]# chown zabbix.zabbix mem_check
[root@Zabbix_Server scripts]# sh mem_check
1004412
[root@Zabbix_Server scripts]# sh mem_check free
782492
[root@Zabbix_Server scripts]# sh mem_check used
221912

4.3.3 后台自定义一个监控项的键值

[root@Zabbix_Server ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@Zabbix_Server zabbix_agentd.d]# cat mem_check.conf
UserParameter=mem.check[*],/server/scripts/mem_check $1

4.3.4 测试自定义的键值

#重启zabbix-agent客户端
[root@Zabbix_Server zabbix_agentd.d]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check"
1004412
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check[free]"
782676
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check[used]"
221744

4.3.5 前台自定义一个监控项及触发器

过程略,此时我相信同学们已经会了。请同学们自己尝试创建完整。

默认情况下,zabbix server会直接去每个agent上抓取数据,这对于agent来说,是被动模式,也是默认的一种获取数据的方式,但是,当zabbix server监控主机数量过多的时候,由server端去抓取agent上的数据,zabbix server会出现严重的性能问题,主要表现如下:

  • [x] :Web操作很卡,容易出现502
  • [x] :图层断裂
  • [x] :开启的进程(Pollar)太多,即使减少item数量,以后加入一定量的机器也会有问题

所以,下面主要往两个优化方向考虑:

  • [x] :用Proxy或者Node模式做分布式监控
  • [x] :调整Agentd为主动模式

5.1 Agentd的配置调整

修改zabbix_agentd.conf配置文件,注意是打开如下参数:

ServerActive=192.168.0.220
Hostname=192.168.0.220
StartAgents=1

ServerActive是指定Agentd收集的数据往哪里发送,Hostname是必须要和zabbix web端添加主机时的主机名对应起来,这样zabbix server端接收到数据才能找到对应关系,这里为了兼容被动模式,没有把StartAgents设为0,如果一开始就是使用主动模式的话建议把StartAgents设为0,关闭被动模式。

5.2 zabbix Server端配置调整

如果开启了agent端的主动发送数据模式,需要在zabbix Server端修改如下两个参数,保证性能。

StartPollers=10     #把这个zabbix Server主动收集数据进程减少一些。
StartTrappers=200   #把这个负责处理Agentd推送过来的数据的进程开大一些。

5.3 调整模版

  • 因此收集数据的模式发生了变化,因此需要把所有的监控项的类型由原来的“zabbix客户端”改成“zabbix客户端(主动式)”。
  • 这样,只需要简单的几步,就完成了主动模式的切换,调整之后服务器不卡了,图层不裂了,进程也少了。

######################################################################################

1.1 项目规划

  • [x] :主机分组

    • 交换机
    • Nginx
    • Tomcat
    • MySQL
    • Apache
    • PHP-fpm
    • redis(也有状态页,同学们自己研究)
    • memcache(也有状态页,同学们自己研究)
  • [x] :监控对象识别:

    • 使用SNMP监控交换
    • 使用IPMI监控服务器硬件
    • 使用Agent监控服务器
    • 使用JMX监控JAVA
    • 监控MySQL
    • 监控Web状态
    • 监控Nginx状态
    • 监控Apache状态
    • 监控Tomcat状态

1.2 SNMP监控流程

  1. 交换机上开启snmp
  2. 在zabbix上添加监控(设置SNMP interfaces)
  3. 关联监控模版

1.3 IPMI

建议使用自定义item监控服务器硬件,在本地执行ipmitool命令来获取数据

可以在本地执行ipmitool命令获取数据(命令需要安装)

1.4 JMX(使用Zabbix Java Gateway代理)

用来获取java数据,本次的实战内容

1.5 实战监控Nginx,Apache,MySQL,PHP-fpm

今天的实战内容,请同学们注意总结过程

1.6 Zabbix的Web监测

今天的实战内容,请同学们注意总结过程

我们需要部署一个MySQL服务和一个zabbix-agentd客户端

2.1 编写监控脚本

在nginx服务器(192.168.0.221)上安装一个MySQL

下面是监控mysql状态的一个shell脚本,内容如下:

[root@nginx scripts]# pwd
/server/scripts
[root@nginx scripts]# cat check_mysql.sh
#!/bin/bash
# author:Mr.chen

MySQL_USER="root"
MySQL_PWD="123123"
MySQL_HOST="127.0.0.1"
MySQL_PORT="3306"

MySQL_CONN="/usr/local/mysql/bin/mysqladmin -u${MySQL_USER} -h${MySQL_HOST} -P${MySQL_PORT} -p${MySQL_PWD}"

if [ $# -ne "1" ];then
    echo "arg error!"
fi

case $1 in
    Uptime)
        result=`${MySQL_CONN} status | cut -f2 -d":" | cut -f1 -d "T"`
        echo $result
        ;;
    Com_update)
        result=`${MySQL_CONN} extended-status | grep -w "Com_update" | cut -d"|" -f3`
        echo $result
        ;;
    Slow_querles)
        result=`${MySQL_CONN} status | cut -f5 -d":" | cut -f1 -d"O"`
        echo $result
        ;;
    Com_select)
        result=`${MySQL_CONN} extended-status | grep -w "Com_select" | cut -d "|" -f3`
        echo $result
        ;;
    Com_rollback)
        result=`${MySQL_CONN} extended-status | grep -w "Com_rollback" | cut -d"|" -f3`
        echo $result
        ;;
    Questions)
        result=`${MySQL_CONN} status | cut -f4 -d":" | cut -f1 -d"S"`
        echo $result
        ;;
    Com_insert)
        result=`${MySQL_CONN} extended-status | grep -w "Com_insert" | cut -d"|" -f3`
        echo $result
        ;;
    Com_delete)
        result=`${MySQL_CONN} extended-status | grep -w "Com_delete" | cut -d"|" -f3`
        echo $result
        ;;
    Com_commit)
        result=`${MySQL_CONN} extended-status | grep -w "Com_commit" | cut -d"|" -f3`
        echo $result
        ;;
    Bytes_sent)
        result=`${MySQL_CONN} extended-status | grep -w "Bytes_sent" | cut -d"|" -f3`
        echo $result
        ;;
    Bytes_received)
        result=`${MySQL_CONN} extended-status | grep -w "Bytes_received" | cut -d"|" -f3`
        echo $result
        ;;
    Com_begin)
        result=`${MySQL_CONN} extended-status | grep -w "Com_begin" | cut -d"|" -f3`
        echo $result
        ;;
    *)
        echo "Usage:$0(Uptime|Com_update|Slow_querles|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
        ;;
esac

2.2 在zabbix-agent端创建自定义键值配置文件

#创建mysql.status的键值
[root@nginx scripts]# chmod +x check_mysql.sh
[root@nginx scripts]# chown zabbix.zabbix check_mysql.sh
[root@nginx zabbix]# cd /etc/zabbix/zabbix_agentd.d/
[root@nginx zabbix_agentd.d]# cat mysql_status.conf
UserParameter=mysql.status[*],/server/scripts/check_mysql.sh $1

#删除旧键值模版
[root@nginx zabbix_agentd.d]# rm -rf userparameter_mysql.conf 

#创建mysql.ping和mysql.version的键值
[root@nginx zabbix_agentd.d]# cat mysql_status.conf
UserParameter=mysql.status[*],/server/scripts/check_mysql.sh $1
UserParameter=mysql.ping,/usr/local/mysql/bin/mysqladmin -uroot -p123123 ping | grep -c alive
UserParameter=mysql.version,/usr/local/bin/mysql -V

#重启zabbix-agentd服务
[root@nginx zabbix_agentd.d]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

2.3 在zabbix-server端测试键值

[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.status[Uptime]"
2791
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.status[Com_commit]"
0
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.status[Bytes_sent]"
144628
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.status[Bytes_received]"
3934
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.ping"
1
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.221 -p 10050 -k "mysql.version"
/usr/local/bin/mysql  Ver 14.14 Distrib 5.5.32, for linux2.6 (x86_64) using readline 5.1

2.4 在zabbix-server端Web前台引入zabbix监控MySQL的模版

zabbix自带监控MySQL的模版,我们只需要将模版引入到主机即可

配置-->主机-->选择主机-->模板,然后将MySQL模版连接到此主机即可

从图中可以发现模版里的键值都是我们之前已经定义好了的键值。

3.1 实战监控Apache

3.1.1 源码编译构建apache服务

#为了避免冲突,若系统中已经安装httpd服务,务必删除
[root@apache ~]# rpm -q httpd
package httpd is not installed
[root@apache ~]# /etc/init.d/iptables stop
[root@apache ~]# setenforce 0
setenforce: SELinux is disabled

#源码构建apache
[root@apache httpd-2.2.17]# tar xf httpd-2.2.17.tar.gz -C /usr/src/
[root@apache httpd-2.2.17]# cd /usr/src/httpd-2.2.17/
[root@apache httpd-2.2.17]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make && make install
[root@apache httpd-2.2.17]# cd /usr/local/httpd/
[root@apache httpd]# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  lib  logs  man  manual  modules
[root@apache httpd]# ln -s /usr/local/httpd/bin/* /usr/local/bin/
[root@apache httpd]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
[root@apache httpd]# chmod +x /etc/init.d/httpd
[root@apache ~]# cd /usr/local/httpd/htdocs/
[root@apache htdocs]# echo "`hostname -I` I am apache" > index.html
[root@apache htdocs]# cat index.html
192.168.0.222  I am apache
[root@apache conf]# awk '/#ServerName/{print NR,$0}' httpd.conf
97 #ServerName www.example.com:80
[root@apache conf]# sed -i -e '97 s/#//;s/example/yunjisuan/' httpd.conf
[root@apache conf]# sed -n '97p' httpd.conf
ServerName www.yunjisuan.com:80
[root@apache conf]# /etc/init.d/httpd start
[root@apache conf]# netstat -antup | grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      53288/httpd
[root@apache conf]# echo "`hostname -I` www.yunjisuan.com" >> /etc/hosts
[root@apache conf]# tail -1 /etc/hosts
192.168.0.222  www.yunjisuan.com
[root@apache conf]# curl www.yunjisuan.com
192.168.0.222  I am apache

3.1.2 开启apache状态页

要打开apache的ServerStatus页面,需要在httpd.conf文件最下边加入代码段

ExtendedStatus On
<location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</location>

最后,重启动apache即可

3.1.3 下载apache zabbix模版并解压

#从如下地址下载apache zabbix模版:
[root@apache ~]# wget https://github.com/lorf/zapache/archive/master.zip
#解压zip格式压缩文件
[root@apache ~]# unzip master
[root@apache ~]# ls -d zapache-master
zapache-master
[root@apache ~]# cd zapache-master/
[root@apache ~]# tree zapache-master/
zapache-master/
├── httpd-server-status.conf.sample
├── README.md
├── userparameter_zapache.conf.sample
├── zapache
├── zapache-template-active.xml
└── zapache-template.xml

0 directories, 6 files
  • 此模版文件中包含了监控apache的脚本文件,zabbix的apache模版文件,还有客户端zabbix自定义传key文件。
  • 首先将zapache放到需要监控的apache服务器上的/etc/zabbix/scripts目录下,如果没有scripts目录,自行创建一个即可。然后执行授权:
[root@apache zapache-master]# chmod 755 /etc/zabbix/scripts/zapache
[root@apache scripts]# cd /etc/zabbix/scripts/
[root@apache scripts]# ./zapache
zapache version: 1.5
usage:
  ./zapache [<url>] TotalAccesses                 - Check total accesses.
  ./zapache [<url>] TotalKBytes                   - Check total KBytes.
  ./zapache [<url>] CPULoad                       - Check CPU load.
  ./zapache [<url>] Uptime                        - Check uptime.
  ./zapache [<url>] ReqPerSec                     - Check requests per second.
  ./zapache [<url>] BytesPerSec                   - Check Bytes per second.
  ./zapache [<url>] BytesPerReq                   - Check Bytes per request.
  ./zapache [<url>] BusyWorkers                   - Check busy workers.
  ./zapache [<url>] IdleWorkers                   - Check idle workers.
  ./zapache [<url>] version                       - Version of this script.
  ./zapache [<url>] ping                          - Check if Apache is up.
  ./zapache [<url>] WaitingForConnection          - Check Waiting for Connection processess.
  ./zapache [<url>] StartingUp                    - Check Starting Up processess.
  ./zapache [<url>] ReadingRequest                - Check Reading Request processess.
  ./zapache [<url>] SendingReply                  - Check Sending Reply processess.
  ./zapache [<url>] KeepAlive                     - Check KeepAlive Processess.
  ./zapache [<url>] DNSLookup                     - Check DNSLookup Processess.
  ./zapache [<url>] ClosingConnection             - Check Closing Connection Processess.
  ./zapache [<url>] Logging                       - Check Logging Processess.
  ./zapache [<url>] GracefullyFinishing           - Check Gracefully Finishing Processess.
  ./zapache [<url>] IdleCleanupOfWorker           - Check Idle Cleanup of Worker Processess.
  ./zapache [<url>] OpenSlotWithNoCurrentProcess  - Check Open Slots with No Current Process.
  • 接着将userparameter_zapache.conf.sample文件放到/etc/zabbix/zabbix_agentd.d目录下,并重命名为userparameter_zapache.conf文件,然后修改键值命令的路径。
  • 最后,重启zabbix-agent服务
[root@apache zapache-master]# mv userparameter_zapache.conf.sample /etc/zabbix/zabbix_agentd.d/userparameter_zapache.conf
[root@apache zabbix_agentd.d]# tail -1 userparameter_zapache.conf
UserParameter=zapache[*],/etc/zabbix/scripts/zapache \$1    #本行要修改
[root@apache zapache-master]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

3.1.4 测试键值

#在zabbix-agent端查看脚本用法
[root@apache zabbix_agentd.d]# cd /etc/zabbix/scripts/
[root@apache scripts]# ./zapache
zapache version: 1.5
usage:
  ./zapache [<url>] TotalAccesses                 - Check total accesses.
  ./zapache [<url>] TotalKBytes                   - Check total KBytes.
  ./zapache [<url>] CPULoad                       - Check CPU load.
  ./zapache [<url>] Uptime                        - Check uptime.
  ./zapache [<url>] ReqPerSec                     - Check requests per second.
  ./zapache [<url>] BytesPerSec                   - Check Bytes per second.
  ./zapache [<url>] BytesPerReq                   - Check Bytes per request.
  ./zapache [<url>] BusyWorkers                   - Check busy workers.
  ./zapache [<url>] IdleWorkers                   - Check idle workers.
  ./zapache [<url>] version                       - Version of this script.
  ./zapache [<url>] ping                          - Check if Apache is up.
  ./zapache [<url>] WaitingForConnection          - Check Waiting for Connection processess.
  ./zapache [<url>] StartingUp                    - Check Starting Up processess.
  ./zapache [<url>] ReadingRequest                - Check Reading Request processess.
  ./zapache [<url>] SendingReply                  - Check Sending Reply processess.
  ./zapache [<url>] KeepAlive                     - Check KeepAlive Processess.
  ./zapache [<url>] DNSLookup                     - Check DNSLookup Processess.
  ./zapache [<url>] ClosingConnection             - Check Closing Connection Processess.
  ./zapache [<url>] Logging                       - Check Logging Processess.
  ./zapache [<url>] GracefullyFinishing           - Check Gracefully Finishing Processess.
  ./zapache [<url>] IdleCleanupOfWorker           - Check Idle Cleanup of Worker Processess.
  ./zapache [<url>] OpenSlotWithNoCurrentProcess  - Check Open Slots with No Current Process.

我们发现脚本需要传递两个参数,即url和选项

然后我们在zabbix-server端进行键值测试

[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.222 -p 10050 -k "zapache[127.0.0.1 TotalAccesses]"
9
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.222 -p 10050 -k "zapache[www.yunjisuan.com version]"
1.5
[root@Zabbix_Server scripts]# zabbix_get -s 192.168.0.222 -p 10050 -k "zapache[www.yunjisuan.com ping]"
1

3.1.5 在zabbix-server的Web页面上监控apache

(1)创建一个监控apache的主机

(2)导入带有apache监控项的模版

zabbix默认并没有监控apache的监控项模版。我们需要将它导入到apache中。在之前解压出来的目录中,有待导入的web模版

[root@apache ~]# tree zapache-master/
zapache-master/
├── httpd-server-status.conf.sample
├── README.md
├── zapache-template-active.xml #Web模版
└── zapache-template.xml    #Web模版

0 directories, 4 files

我们将这两个.xml后缀的拷贝到windows上,然后从Web界面导入进去

导入以后Web端就有监控apache的监控项模版了

(3)将模版链接到apache主机

3.2 实战监控nginx

3.2.1 开启nginx状态页

#在nginx的配置文件中,添加status配置
location = /nginx-status {
    stub_status on;
    access_log  off;
    allow 127.0.0.1;
    allow 192.168.0.220;    #zabbix服务器地址一般是内网地址
    deny all;
}

3.2.2 访问设置好的nginx-status链接

#在zabbix-server上通过如下方式获取nginx状态页面信息:
root@Zabbix_Server ~]# curl 192.168.0.221/nginx-status
Active connections: 1
server accepts handled requests
 634 634 618
Reading: 0 Writing: 1 Waiting: 0 

nginx status详细说明如下:
Active connections:对后端发起的活动连接数;
accepts:nginx总共处理了多少个连接;
handled:nginx成功创建了几次握手;
requests:nginx总共处理了多少请求。
Reading:nginx读取客户端的header数;
Writing:nginx返回给客户端的header数;
Waiting:nginx请求处理完成,正在等待下一请求指令的连接

3.2.3 编写nginx状态监控脚本

#下面是nginx状态监控抓取脚本,内容如下:
[root@nginx scripts]# cat nginx_status.sh
#!/bin/bash
# Set Variables

HOST="127.0.0.1"
PORT="80"

#Functions to return nginx stats

function active(){
    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | grep "Active" | awk '{print $NF}'
}

function reading(){

    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | grep "Reading" | awk '{print $2}'
}

function writing(){

    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | grep "Writing" | awk '{print $4}'
}

function accepts(){

    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | awk 'NR==3' | awk '{print $1}'

}

function handled(){

    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | awk 'NR==3' | awk '{print $2}'
}

function requests(){

    /usr/bin/curl "http://$HOST:$PORT/nginx-status" 2>/dev/null | awk 'NR==3' | awk '{print $3}'
}

function ping(){

    /sbin/pidof nginx | wc -l
}

# Run the requested function

$1

3.2.4 给脚本可执行权限并且授权

[root@nginx scripts]# chmod +x nginx_status.sh
[root@nginx scripts]# chown zabbix.zabbix nginx_status.sh

3.2.5 在zabbix-agent端配置nginx键值配置文件

[root@nginx zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@nginx zabbix_agentd.d]# cat nginx.conf
UserParameter=nginx.active,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep "Active" | awk '{print $NF}'
UserParameter=nginx.status[*],/etc/zabbix/scripts/nginx_status.sh $1
#重启agent客户端
[root@nginx zabbix_agentd.d]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

3.2.6 在zabbix-server端测试键值

[root@Zabbix_Server ~]# zabbix_get -s 192.168.0.221 -k "nginx.status[reading]" -p 10050
0
[root@Zabbix_Server ~]# zabbix_get -s 192.168.0.221 -k "nginx.status[active]" -p 10050
1
[root@Zabbix_Server ~]# zabbix_get -s 192.168.0.221 -k "nginx.status[reading]" -p 10050
0
[root@Zabbix_Server ~]# zabbix_get -s 192.168.0.221 -k "nginx.status[writing]" -p 10050
1
[root@Zabbix_Server ~]# zabbix_get -s 192.168.0.221 -k "nginx.status[ping]" -p 10050
1

3.2.7 接下来我们需要在Web端导入nginx监控模版

3.2.8 异常调试

如果Zabbix图形界面一直没有获取到数据,可以通过在zabbix server上执行zabbix_get手动测试:

/usr/local/zabbix/bin/zabbix_get -s 192.168.0.221 -p 10050 -k "nginx.status[active]"

如果获取数据有问题,会给出相应提示,如果能够获取到数据,那就没问题了。

zabbix监控tomcat,需要zabbix_server开启java poller,zabbix_java开启javaGateway,端口10052,Tomcat JMX开启12345端口,提供性能数据。

数据获取流程为:java poller<-->javaGateway:10052<-->Tomcat:12345

4.1 配置Tomcat JMX

#配置jmx,在需要监控的tomcat服务器上,编辑catalina.sh,加入如下配置
[root@Tomcat bin]# sed -n '249p' /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.0.224 -Dcom.sun.management.jmxremote.port=12345"

这里需要注意,必须增加-Djava.rmi.server.hostname选项,并且后面的IP就是tomcat服务器的IP

4.2 重启Tomcat

[root@Tomcat bin]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@Tomcat ~]# netstat -antup | grep java
[root@Tomcat bin]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@Tomcat zabbix]# netstat -antup | grep java
tcp        0      0 :::54031                    :::*                        LISTEN      1521/java
tcp        0      0 :::8080                     :::*                        LISTEN      1521/java
tcp        0      0 :::53881                    :::*                        LISTEN      1521/java
tcp        0      0 :::12345                    :::*                      LISTEN      1521/java          #新增端口
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1521/java
tcp        0      0 :::8009                     :::*                        LISTEN      1521/java       

4.3 编译zabbix,加入java支持

在zabbix server服务器上,编译安装zabbix-server,需要加上--enable-java,以支持jmx监控,如果之前的zabbix server没加此选项,那么需要重新编译安装,编译参数如下:

./configure --prefix=/usr/local/zabbix --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy --enable-java --with-libxml2

特别提示:

在启用--enable-java编译zabbix之前,zabbix server服务器上需要安装JDK,并需要设置JAVA_HOME,以让系统能够识别到jdk的路径

4.3.1 在zabbix-server端安装JDK

#解压jdk
[root@Zabbix_Server ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
[root@Zabbix_Server ~]# ln -s /usr/local/jdk1.8.0_60/ /usr/local/jdk
#配置java环境变量
[root@Zabbix_Server ~]# sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@Zabbix_Server ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
#让环境变量立刻生效
[root@Zabbix_Server ~]# source /etc/profile
#检查java环境变量情况
[root@Zabbix_Server ~]# which java
/usr/local/jdk/bin/java
[root@Zabbix_Server ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

4.3.2 重新编译zabbix-server服务器端

#重新编译zabbix-server服务器端之前
[root@Zabbix_Server ~]# ll /usr/local/zabbix/sbin/
total 8604
-rwxr-xr-x 1 root root 1165774 Jan 20 15:16 zabbix_agentd
-rwxr-xr-x 1 root root 3672055 Jan 20 15:16 zabbix_proxy
-rwxr-xr-x 1 root root 3966037 Jan 20 15:16 zabbix_server

#开始重新编译zabbix-server服务器端
[root@Zabbix_Server ~]#
[root@Zabbix_Server ~]# /etc/init.d/zabbix_server stop
Shutting down zabbix_server:                               [  OK  ]
[root@Zabbix_Server ~]# cd /usr/src/zabbix-3.2.4/
[root@Zabbix_Server zabbix-3.2.4]# ./configure --prefix=/usr/local/zabbix --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy --enable-java --with-libxml2
[root@Zabbix_Server zabbix-3.2.4]# make && make install

#重新编译zabbix-server服务器端之后
[root@Zabbix_Server zabbix-3.2.4]# cd /usr/local/zabbix/sbin/
[root@Zabbix_Server sbin]# ll
total 8608
-rwxr-xr-x 1 root root 1165774 Jan 25 22:22 zabbix_agentd
drwxr-xr-x 4 root root    4096 Jan 25 22:22 zabbix_java     #多了一个目录
-rwxr-xr-x 1 root root 3672055 Jan 25 22:22 zabbix_proxy
-rwxr-xr-x 1 root root 3966037 Jan 25 22:22 zabbix_server
[root@Zabbix_Server sbin]# cd zabbix_java/
[root@Zabbix_Server zabbix_java]# ll
total 20
drwxr-xr-x 2 root root 4096 Jan 25 22:22 bin
drwxr-xr-x 2 root root 4096 Jan 25 22:22 lib
-rw-r--r-- 1 root root  791 Jan 25 22:22 settings.sh    #java gateway配置脚本
-rwxr-xr-x 1 root root  545 Jan 25 22:22 shutdown.sh    #停止java gateway服务
-rwxr-xr-x 1 root root 2025 Jan 25 22:22 startup.sh     #启动java gateway服务

提示:

java gateway服务的配置脚本settings.sh不需要修改任何配置。

4.3.3 启动java Gateway服务

[root@Zabbix_Server zabbix_java]# /usr/local/zabbix/sbin/zabbix_java/startup.sh
[root@Zabbix_Server zabbix_java]# netstat -antup | grep 10052
tcp        0      0 :::10052                    :::*                        LISTEN      13126/java 

4.4 修改zabbix server 配置

默认的情况下,zabbix server未启用javaPollers,需要修改zabbix_server.conf的如下配置

[root@Zabbix_Server zabbix]# cd /usr/local/zabbix/etc/

#修改以下配置文件的内容
[root@Zabbix_Server etc]# cat -n zabbix_server.conf | sed -n '215p;223p;231p'
   215  # JavaGateway=
   223  # JavaGatewayPort=10052
   231  # StartJavaPollers=0

#将上述配置文件内容修改成如下
[root@Zabbix_Server etc]# cat -n zabbix_server.conf | sed -n '215p;223p;231p'
   215  JavaGateway=127.0.0.1   #JavaGateway的地址
   223  JavaGatewayPort=10052
   231  StartJavaPollers=5

#查看已经打开的java poller进程
[root@Zabbix_Server ~]# ps -ef | grep "java poller" | grep -v grep
zabbix    13233  13172  0 Jan25 ?        00:00:00 /usr/local/sbin/zabbix_server: java poller #1 [got 0 values in 0.000001 sec, idle 5 sec]
zabbix    13234  13172  0 Jan25 ?        00:00:00 /usr/local/sbin/zabbix_server: java poller #2 [got 0 values in 0.000015 sec, idle 5 sec]
zabbix    13235  13172  0 Jan25 ?        00:00:00 /usr/local/sbin/zabbix_server: java poller #3 [got 0 values in 0.000001 sec, idle 5 sec]
zabbix    13236  13172  0 Jan25 ?        00:00:00 /usr/local/sbin/zabbix_server: java poller #4 [got 0 values in 0.000001 sec, idle 5 sec]
zabbix    13237  13172  0 Jan25 ?        00:00:00 /usr/local/sbin/zabbix_server: java poller #5 [got 0 values in 0.000001 sec, idle 5 sec]

4.5 重启zabbix_server服务

[root@Zabbix_Server ~]# /etc/init.d/zabbix_server start
Starting zabbix_server:                                    [  OK  ]
[root@Zabbix_Server ~]# netstat -antup | grep 10051
tcp        0      0 0.0.0.0:10051               0.0.0.0:*                   LISTEN      13172/zabbix_server
tcp        0      0 192.168.0.220:10051         192.168.0.221:56752         TIME_WAIT   -
tcp        0      0 192.168.0.220:10051         192.168.0.221:56754         TIME_WAIT   -
tcp        0      0 192.168.0.220:10051         192.168.0.221:56751         TIME_WAIT   -
tcp        0      0 192.168.0.220:10051         192.168.0.220:47162         TIME_WAIT   -           

4.6 Zabbix图形界面配置

4.6.1 创建一个主机利用JMX接口监控tomcat被监控端

4.6.2 导入zabbix监控tomcat的模版

因为Zabbix自带的Tomcat模版有兼容性问题,并不好用,因此,我们导入自己制作的监控项模版

最后我们关联模版即可。

php-fpm和nginx一样内建了一个状态页,对于想了解php-fpm的状态以及监控php-fpm非常有帮助

5.1 启用php-fpm状态功能

修改php-fpm配置文件,确保如下配置是打开状态:

pm.status_path = /status,具体操作如下

#在Zabbix-server端操作如下
[root@Zabbix_Server etc]# pwd
/usr/local/php/etc
[root@Zabbix_Server etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@Zabbix_Server etc]# sed -n '360p' php-fpm.conf
;pm.status_path = /status
[root@Zabbix_Server etc]# vim php-fpm.conf +360
[root@Zabbix_Server etc]# sed -n '360p' php-fpm.conf
pm.status_path = /status

#重启php-fpm服务
[root@Zabbix_Server ~]# netstat -antup | grep php-fpm
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      1145/php-fpm
[root@Zabbix_Server ~]# pkill php-fpm
[root@Zabbix_Server ~]# netstat -antup | grep 9000
[root@Zabbix_Server ~]# /usr/local/php/sbin/php-fpm
[root@Zabbix_Server ~]# netstat -antup | grep php-fpm
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      18918/php-fpm

5.2 nginx配置php-fpm状态页面

在nginx配置文件nginx.conf里配置php状态页,操作如下

[root@Zabbix_Server ~]# cd /usr/local/nginx/
[root@Zabbix_Server nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
#配置php-fpm状态页面
[root@Zabbix_Server nginx]# vim conf/nginx.conf
[root@Zabbix_Server nginx]# cat conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.php index.html index.htm;
        }
        location = /nginx-status {
            stub_status on;
            access_log off;
        }
        location = /status {         #添加此location
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        }
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}
#重启动nginx服务
[root@Zabbix_Server nginx]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Zabbix_Server nginx]# /usr/local/nginx/sbin/nginx -s reload

5.3 状态页浏览器访问测试

php-fpm状态页比较个性化的一个地方是它可以带参数,可以带的参数有json、xml、html,使用zabbix或者nagios监控可以考虑使用xml或者默认方式。

#具体含义说明如下
[root@Zabbix_Server nginx]# curl 127.0.0.1/status
pool:                 www           #fpm进程池名称,大多数为www
process manager:      dynamic       #进程管理方式(static,dynamic or nodemand.dynamic)
start time:           26/Jan/2018:02:56:58 -0500    #启动日期
start since:          2972          #运行时长
accepted conn:        517           #当前FPM进程池接受的请求数
listen queue:         0             #请求等待队列,如果值不是0,那么要增加FPM的进程数
max listen queue:     4             #请求等待队列最高的数量
listen queue len:     128           #socket等待队列长度
idle processes:       2             #空闲进程数量
active processes:     1             #活跃进程数量
total processes:      3             #总进程数量
max active processes: 3             #最大的活跃进程数量(FPM启动开始算)
max children reached: 0             #达到最大子进程的次数,如果值不为0,那么需要调高最大进程数
slow requests:        0             #当启用了php-fpm的slow-log功能时,如果出现php-fpm慢请求这个计数器会增加,一般不当的MySQL查询会触发这个值

其他状态参数显示形式的数据(json,xml,html)

#以xml的格式输出PHP-fpm状态页
[root@Zabbix_Server nginx]# curl 127.0.0.1/status?xml
<?xml version="1.0" ?>
<status>
<pool>www</pool>
<process-manager>dynamic</process-manager>
<start-time>1516953418</start-time>
<start-since>3731</start-since>
<accepted-conn>647</accepted-conn>
<listen-queue>0</listen-queue>
<max-listen-queue>4</max-listen-queue>
<listen-queue-len>128</listen-queue-len>
<idle-processes>2</idle-processes>
<active-processes>1</active-processes>
<total-processes>3</total-processes>
<max-active-processes>3</max-active-processes>
<max-children-reached>0</max-children-reached>
<slow-requests>0</slow-requests>

#以json的格式输出PHP-fpm的状态页
</status>[root@Zabbix_Server nginx]# curl 127.0.0.1/status?json
{"pool":"www","process manager":"dynamic","start time":1516953418,"start since":3736,"accepted conn":648,"listen queue":0,"max listen queue":4,"listen queue len":128,"idle processes":2,"active processes":1,"total processes":3,"max active processes":3,"max children reached":0,"slow requests":0}[root@Zabbix_Server nginx]# 

#以html的格式输出PHP-fpm的状态页
[root@Zabbix_Server nginx]# curl 127.0.0.1/status?html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>PHP-FPM Status Page</title></head>
<body>
<table>
<tr><th>pool</th><td>www</td></tr>
<tr><th>process manager</th><td>dynamic</td></tr>
<tr><th>start time</th><td>26/Jan/2018:02:56:58 -0500</td></tr>
<tr><th>start since</th><td>3748</td></tr>
<tr><th>accepted conn</th><td>650</td></tr>
<tr><th>listen queue</th><td>0</td></tr>
<tr><th>max listen queue</th><td>4</td></tr>
<tr><th>listen queue len</th><td>128</td></tr>
<tr><th>idle processes</th><td>2</td></tr>
<tr><th>active processes</th><td>1</td></tr>
<tr><th>total processes</th><td>3</td></tr>
<tr><th>max active processes</th><td>3</td></tr>
<tr><th>max children reached</th><td>0</td></tr>
<tr><th>slow requests</th><td>0</td></tr>
</table>
</body></html>

5.4 在Zabbix agent端修改配置

在创建Zabbix的agent端键值配置文件的时候,我们可以考虑利用PHP-fpm状态页的不同输出格式来抓取数据。例如我们利用xml格式获取数据,操作如下:

#查看xml格式PHP-fpm状态页数据
root@Zabbix_Server nginx]# curl 127.0.0.1/status?xml
<?xml version="1.0" ?>
<status>
<pool>www</pool>
<process-manager>dynamic</process-manager>
<start-time>1516953418</start-time>
<start-since>3731</start-since>
<accepted-conn>647</accepted-conn>
<listen-queue>0</listen-queue>
<max-listen-queue>4</max-listen-queue>
<listen-queue-len>128</listen-queue-len>
<idle-processes>2</idle-processes>
<active-processes>1</active-processes>
<total-processes>3</total-processes>
<max-active-processes>3</max-active-processes>
<max-children-reached>0</max-children-reached>
<slow-requests>0</slow-requests>

#创建zabbix监控的agent端键值配置文件
[root@Zabbix_Server ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@Zabbix_Server zabbix_agentd.d]# cat userparameter_php-fpm.conf
UserParameter=php-fpm.status[*],/usr/bin/curl -s "http://127.0.0.1/status?xml" | grep "<$1>" | awk -F "[>|<]" '{print $$3}'    #这里需要注意在脚本里如果写成$3的话,脚本会认识是一个变量,因此我们需要用$$3

#重启动agent客户端
[root@Zabbix_Server ~]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

5.5 进行键值配置文件测试

[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "php-fpm.status[process-manager]"
dynamic
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "php-fpm.status[start-since]"
5634
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "php-fpm.status[active-processes]"
1

5.6 Zabbix图形界面导入我们的监控模版

Zabbix的Web监测功能,没有任何依赖,不需要agent端,全部依赖于Server的主动监测

利用Web监测,监测Server端的nginx首页

到这里Web监测我们就创建好了,最后再看一下监控结果

请同学们在Zabbix监控MySQL的模版示例的基础上,自定义一个监控数据库主从复制的监控项

IP地址

主机名

用途

192.168.0.220

Zabbix_Server服务器

Zabbix监控端/主MySQL

192.168.0.221

Nginx服务器

Nginx服务器/从MySQL