centos7部署zabbix监控服务
zabbix服务部署
在安装zabbix之前请确保防火墙以及selinux关闭,并做好时间同步,还要安装阿里的EPEL源,为接下来的zabbix的yum安装做准备
此部署方式为yum安装zabbix3.0的方式部署
1、安装zabbix的yum源
yum install -y http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
2、安装zabbix和zabbix相关软件包,这里同时安装了zabbix的客户端,让zabbix服务端也作为客户端被监控起来
yum install zabbix-server zabbix-web zabbix-server-mysql zabbix-web-mysql mariadb-server mariadb zabbix-agent -y
zabbix运行的web容器是apache,它默认把apache和php作为依赖安装上了
3、修改php的时区配置
[root@linux-node1 ~]# vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai
4、数据库配置
修改数据库配置文件,配置数据库的字符集为utf8
[root@linux-node1 ~]# vim /etc/my.cnf [mysqld] default-storage-engine = innodb innodb_file_per_table collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8
启动数据库并做开机自启动
systemctl start mariadb
创建zabbix所用的数据库及用户
create database zabbix; grant all on zabbix.* to zabbix@'localhost' identified by 'zabbix';
导入zabbix数据的表结构到zabbix数据库中,用zcat命令来导入,zcat命令导入不会解压数据库表的压缩文件,它会将压缩包中的内容导入到指定的数据库中
[root@linux-node1 ~]# cd /usr/share/doc/zabbix-server-mysql-3.0.13/ [root@linux-node1 zabbix-server-mysql-3.0.13]# zcat create.sql.gz | mysql -uzabbix -pzabbix zabbix
5、修改zabbix的配置文件,配置相关的数据库选项
vim /etc/zabbix/zabbix_server.conf DBHost=localhost #数据库所在主机 DBName=zabbix #数据库名 DBUser=zabbix #数据库用户 DBPassword=zabbix #数据库密码
6、启动zabbix及http
zabbix-server启动失败,httpd启动成功
[root@linux-node1 ~]# systemctl start zabbix-server Job for zabbix-server.service failed because a fatal signal was delivered to the control process. See "systemctl status zabbix-server.service" and "journalctl -xe" for details. [root@linux-node1 ~]# systemctl start httpd [root@linux-node1 ~]# systemctl enable httpd
解决zabbix-server服务启动失败的办法为升级trousers,然后再启动zabbix-server后成功执行,并对zabbix-server做开机自启动操作
[root@linux-node1 ~]# yum update trousers [root@linux-node1 ~]# systemctl start zabbix-server [root@linux-node1 ~]# systemctl enable zabbix-server
7、使用http://192.168.1.180/zabbix打开zabbix的配置初始化界面
按照zabbix的配置提示,配置好数据库的连接信息,最后用默认的Admin账号和zabbix密码来登录即可

zabbix服务配置管理
启动zabbix服务端的zabbix-agent服务,让服务端作为客户端被监控起来
[root@linux-node1 ~]# systemctl start zabbix-agent [root@linux-node1 ~]# systemctl enable zabbix-agent #查看zabbix服务端和客户端的监控端口分别为10051 10050 [root@linux-node1 ~]# netstat -lntup tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 25328/zabbix_agentd tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 25232/zabbix_server
修改zabbix-agent配置文件如下,修改Server参数,现在的配置为zabbix的被动模式(这里的被动模式相对于agent来说的)
[root@linux-node1 zabbix_agentd.d]# vim /etc/zabbix/zabbix_agentd.conf Server=192.168.1.180
登录zabbix管理页面,让zabbix服务端作为客户端被监控起来

使用snmp协议来监控客户端
如果客户端无法使用zabbix-agent来监控客户端的话,可以使用snmp协议来监控管理客户端,比如使用snmp协议来监控网络设备、打印机等
下面在linux系统上安装snmp客户端作为被监控的客户端设备,在zabbix服务端安装snmp管理工具即可,这样zabbix服务就可以通过snmp协议来监控启用snmp服务的设备了
#在客户端安装snmp协议软件包,并启动snmp服务 [root@linux-node2 ~]# yum install -y net-snmp [root@linux-node2 ~]# cd /etc/snmp/ [root@linux-node2 snmp]# mv snmpd.conf snmpd.conf.bak [root@linux-node2 snmp]# vim snmpd.conf rocommunity goser 192.168.1.190 [root@linux-node2 ~]# systemctl enable snmpd [root@linux-node2 ~]# systemctl start snmpd #zabbix服务端安装snmp工具 [root@linux-node1 ~]# yum install -y net-snmp-utils #用snmp来测试可以监控客户端,比如监控客户端的负载 [root@linux-node1 ~]# snmpwalk -v2c -c goser 192.168.182.190 1.3.6.1.4.1.2021.10.1.3 UCD-SNMP-MIB::laLoad.1 = STRING: 0.00 UCD-SNMP-MIB::laLoad.2 = STRING: 0.01 UCD-SNMP-MIB::laLoad.3 = STRING: 0.05
服务器负载: 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 内存使用: 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 系统运行时间: .1.3.6.1.2.1.1.3.0 SNMP System Group: 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 sysLocation 1.3.6.1.2.1.1.6 sysServices 1.3.6.1.2.1.1.7 SNMP Interfaces Group: ifNumber 1.3.6.1.2.1.2.1 ifTable 1.3.6.1.2.1.2.2 ifEntry 1.3.6.1.2.1.2.2.1 ifIndex 1.3.6.1.2.1.2.2.1.1 ifDescr 1.3.6.1.2.1.2.2.1.2 ifType 1.3.6.1.2.1.2.2.1.3 ifMtu 1.3.6.1.2.1.2.2.1.4 ifSpeed 1.3.6.1.2.1.2.2.1.5 ifPhysAddress 1.3.6.1.2.1.2.2.1.6 ifAdminStatus 1.3.6.1.2.1.2.2.1.7 ifOperStatus 1.3.6.1.2.1.2.2.1.8 ifLastChange 1.3.6.1.2.1.2.2.1.9 ifInOctets 1.3.6.1.2.1.2.2.1.10 ifInUcastPkts 1.3.6.1.2.1.2.2.1.11 ifInNUcastPkts 1.3.6.1.2.1.2.2.1.12 ifInDiscards 1.3.6.1.2.1.2.2.1.13 ifInErrors 1.3.6.1.2.1.2.2.1.14 ifInUnknownProtos 1.3.6.1.2.1.2.2.1.15 ifOutOctets 1.3.6.1.2.1.2.2.1.16 ifOutUcastPkts 1.3.6.1.2.1.2.2.1.17 ifOutNUcastPkts 1.3.6.1.2.1.2.2.1.18 ifOutDiscards 1.3.6.1.2.1.2.2.1.19 ifOutErrors 1.3.6.1.2.1.2.2.1.20 ifOutQLen 1.3.6.1.2.1.2.2.1.21 ifSpecific 1.3.6.1.2.1.2.2.1.22 SNMP IP Group ipForwarding 1.3.6.1.2.1.4.1 ipDefaultTTL 1.3.6.1.2.1.4.2 ipInReceives 1.3.6.1.2.1.4.3 ipInHdrErrors 1.3.6.1.2.1.4.4 ipInAddrErrors 1.3.6.1.2.1.4.5 ipForwDatagrams 1.3.6.1.2.1.4.6 ipInUnknownProtos 1.3.6.1.2.1.4.7 ipInDiscards 1.3.6.1.2.1.4.8 ipInDelivers 1.3.6.1.2.1.4.9 ipOutRequests 1.3.6.1.2.1.4.10 ipOutDiscards 1.3.6.1.2.1.4.11 ipOutNoRoutes 1.3.6.1.2.1.4.12 ipReasmTimeout 1.3.6.1.2.1.4.13 ipReasmReqds 1.3.6.1.2.1.4.14 ipReasmOKs 1.3.6.1.2.1.4.15 ipReasmFails 1.3.6.1.2.1.4.16 ipFragsOKs 1.3.6.1.2.1.4.17 ipFragsFails 1.3.6.1.2.1.4.18 ipFragCreates 1.3.6.1.2.1.4.19 ipAddrTable 1.3.6.1.2.1.4.20 ipAddrEntry 1.3.6.1.2.1.4.20.1 ipAdEntAddr 1.3.6.1.2.1.4.20.1.1 ipAdEntIfIndex 1.3.6.1.2.1.4.20.1.2 ipAdEntNetMask 1.3.6.1.2.1.4.20.1.3 ipAdEntBcastAddr 1.3.6.1.2.1.4.20.1.4 ipAdEntReasmMaxSize 1.3.6.1.2.1.4.20.1.5 SNMP ICMP Group icmpInMsgs 1.3.6.1.2.1.5.1 icmpInErrors 1.3.6.1.2.1.5.2 icmpInDestUnreachs 1.3.6.1.2.1.5.3 icmpInTimeExcds 1.3.6.1.2.1.5.4 icmpInParmProbs 1.3.6.1.2.1.5.5 icmpInSrcQuenchs 1.3.6.1.2.1.5.6 icmpInRedirects 1.3.6.1.2.1.5.7 icmpInEchos 1.3.6.1.2.1.5.8 icmpInEchoReps 1.3.6.1.2.1.5.9 icmpInTimestamps 1.3.6.1.2.1.5.10 icmpInTimestampReps 1.3.6.1.2.1.5.11 icmpInAddrMasks 1.3.6.1.2.1.5.12 icmpInAddrMaskReps 1.3.6.1.2.1.5.13 icmpOutMsgs 1.3.6.1.2.1.5.14 icmpOutErrors 1.3.6.1.2.1.5.15 icmpOutDestUnreachs 1.3.6.1.2.1.5.16 icmpOutTimeExcds 1.3.6.1.2.1.5.17 icmpOutParmProbs 1.3.6.1.2.1.5.18 icmpOutSrcQuenchs 1.3.6.1.2.1.5.19 icmpOutRedirects 1.3.6.1.2.1.5.20 icmpOutEchos 1.3.6.1.2.1.5.21 icmpOutEchoReps 1.3.6.1.2.1.5.22 icmpOutTimestamps 1.3.6.1.2.1.5.23 icmpOutTimestampReps 1.3.6.1.2.1.5.24 icmpOutAddrMasks 1.3.6.1.2.1.5.25 icmpOutAddrMaskReps 1.3.6.1.2.1.5.26 SNMP TCP Group: tcpRtoAlgorithm 1.3.6.1.2.1.6.1 tcpRtoMin 1.3.6.1.2.1.6.2 tcpRtoMax 1.3.6.1.2.1.6.3 tcpMaxConn 1.3.6.1.2.1.6.4 tcpActiveOpens 1.3.6.1.2.1.6.5 tcpPassiveOpens 1.3.6.1.2.1.6.6 tcpAttemptFails 1.3.6.1.2.1.6.7 tcpEstabResets 1.3.6.1.2.1.6.8 tcpCurrEstab 1.3.6.1.2.1.6.9 tcpInSegs 1.3.6.1.2.1.6.10 tcpOutSegs 1.3.6.1.2.1.6.11 tcpRetransSegs 1.3.6.1.2.1.6.12 tcpConnTable 1.3.6.1.2.1.6.13 tcpConnEntry 1.3.6.1.2.1.6.13.1 tcpConnState 1.3.6.1.2.1.6.13.1.1 tcpConnLocalAddress 1.3.6.1.2.1.6.13.1.2 tcpConnLocalPort 1.3.6.1.2.1.6.13.1.3 tcpConnRemAddress 1.3.6.1.2.1.6.13.1.4 tcpConnRemPort 1.3.6.1.2.1.6.13.1.5 tcpInErrs 1.3.6.1.2.1.6.14 tcpOutRsts 1.3.6.1.2.1.6.15 SNMP UDP Group udpInDatagrams 1.3.6.1.2.1.7.1 udpNoPorts 1.3.6.1.2.1.7.2 udpInErrors 1.3.6.1.2.1.7.3 udpOutDatagrams 1.3.6.1.2.1.7.4 udpTable 1.3.6.1.2.1.7.5 udpEntry 1.3.6.1.2.1.7.5.1 udpLocalAddress 1.3.6.1.2.1.7.5.1.1 udpLocalPort 1.3.6.1.2.1.7.5.1.2 SNMP Group: snmpInPkts 1.3.6.1.2.1.11.1 snmpOutPkts 1.3.6.1.2.1.11.2 snmpInBadVersions 1.3.6.1.2.1.11.3 snmpInBadCommunityNames 1.3.6.1.2.1.11.4 snmpInBadCommunityUses 1.3.6.1.2.1.11.5 snmpInASNParseErrs 1.3.6.1.2.1.11.6 NOT USED 1.3.6.1.2.1.11.7 snmpInTooBigs 1.3.6.1.2.1.11.8 snmpInNoSuchNames 1.3.6.1.2.1.11.9 snmpInBadValues 1.3.6.1.2.1.11.10 snmpInReadOnlys 1.3.6.1.2.1.11.11 snmpInGenErrs 1.3.6.1.2.1.11.12 snmpInTotalReqVars 1.3.6.1.2.1.11.13 snmpInTotalSetVars 1.3.6.1.2.1.11.14 snmpInGetRequests 1.3.6.1.2.1.11.15 snmpInGetNexts 1.3.6.1.2.1.11.16 snmpInSetRequests 1.3.6.1.2.1.11.17 snmpInGetResponses 1.3.6.1.2.1.11.18 snmpInTraps 1.3.6.1.2.1.11.19 snmpOutTooBigs 1.3.6.1.2.1.11.20 snmpOutNoSuchNames 1.3.6.1.2.1.11.21 snmpOutBadValues 1.3.6.1.2.1.11.22 NOT USED 1.3.6.1.2.1.11.23 snmpOutGenErrs 1.3.6.1.2.1.11.24 snmpOutGetRequests 1.3.6.1.2.1.11.25 snmpOutGetNexts 1.3.6.1.2.1.11.26 snmpOutSetRequests 1.3.6.1.2.1.11.27 snmpOutGetResponses 1.3.6.1.2.1.11.28 snmpOutTraps 1.3.6.1.2.1.11.29 snmpEnableAuthenTraps 1.3.6.1.2.1.11.30
通过上面的snmp工具测试监控客户端是没有问题的,这时候就可以通过zabbix服务端来对snmp协议的客户端做监控了




通过上面的操作,这时运行snmp协议的客户端就可以被zabbix服务端监控起来了,监控的状态如下:

自定义一个nginx连接数的监控项
安装nginx软件的依赖包
[root@linux-node1 ~]# yum install -y glibc gcc-c++ pcre pcre-devel gcc openssl openssl-devel
下载nginx,并编译安装nginx
[root@linux-node1 ~]# cd /usr/local/src/ [root@linux-node1 src]# wget http://nginx.org/download/nginx-1.10.3.tar.gz [root@linux-node1 src]# tar xfz nginx-1.10.3.tar.gz [root@linux-node1 src]# cd nginx-1.10.3 #新建一个用户nginx,用于以普通用户运行nginx;配置,生成Makefile文件 [root@linux-node1 nginx-1.10.3]# useradd -s /sbin/nologin -M nginx [root@linux-node1 nginx-1.10.3]# ./configure --prefix=/usr/local/nginx-1.10.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module [root@linux-node1 nginx-1.10.3]# make && make install [root@linux-node1 ~]# ln -s /usr/local/nginx-1.10.3/ /usr/local/nginx
其实make install 之后,可以把这个目录拷贝到别的机器运行,但是你得保证这两台机器环境一致,必须安装的依赖包都一致
怎么监控nginx,可以搜索一些做监控的产品他们做的文档,比较好,网站上很多人写的博客其实有的有错误,监控宝这种即使出现错误也不会太大。
比如监控宝的nginx相关的wiki:http://www.jiankongbao.com/search.php?q=nginx
修改nginx的配置文件,让其支持查看连接数,只要在nginx的配置文件的server标签中添加如下配置即可,当然也可以在此配置中添加一些安全设置
location /nginx-status {
stub_status on;
access_log off;
}
nginx的配置文件设置如下:
[root@linux-node1 snmp]# vim /usr/local/nginx/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 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /nginx-status {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
启动nginx,并设置开机自启动
[root@linux-node1 conf]# /usr/local/nginx/sbin/nginx -t [root@linux-node1 conf]# /usr/local/nginx/sbin/nginx [root@linux-node1 ~]# vim /etc/rc.local /usr/local/nginx/sbin/nginx
先用curl命令方式获取活动连接数
[root@linux-node1 conf]# curl -s http://192.168.1.180:8080/nginx-status | grep Active |awk '{print $NF}'
1
由于在zabbix-agent配置文件中有这个选项Include=/etc/zabbix/zabbix_agentd.d/。说明zabbix-agent的配置文件会加载这个目录,因此可以单独新建一个文件,用于存放自定义的key
写一个名叫nginx.conf的配置文件,配置如下:
UserParameter=nginx.active,/usr/bin/curl -s http://192.168.1.180:8080/nginx-status | grep Active |awk '{print $NF}'
重启agent,安装zabbix-get工具,它是个测试工具,只有它能获取到了自定义的key的值,然后加入到item中才没问题。
[root@linux-node1 ~]# systemctl restart zabbix-agent [root@linux-node1 ~]# yum install -y zabbix-get [root@linux-node1 ~]# zabbix_get -s 192.168.1.180 -p 10050 -k "nginx.active" 1
上面通过zabbix_get命令测试key值没问题后,就可以在zabbix中添加item了,操作如下:

为nginx.active监控项创建图形

手动制造点连接数数据,然后再查看监控的nginx.active监控项的图形:[root@linux-node1 ~]# ab -c 20 -n 100000 http://192.168.1.180:8080/

当然图形显示还有很多,比如以堆叠方式显示,以饼状图形显示等。
创建自定义的screen,这种图形显示可以将一些相同的业务放在一起,便于查看,也可以作为屏幕显示的方式展现出来

zabbix监控管理的注意事项:
1、 工作中使用zabbix常遇到的问题:生产一台机器告警了顺手关闭了,然后忘记打开了
2、监控项这里,也尽量不禁用,而是删除。能删除就删除
3、使用触发器的过程中,有时候觉得邮件太多,比较烦,其实触发器可以设置不让告警发邮件,尽量别禁用
4、生产中,一定好划分好主机组,可以按业务划分
添加一台agent主机
添加一台主机名为linux-node2.goser.com IP地址为192.168.1.190的主机,让其被zabbix服务端监控和管理
在linux-node2上安装zabbix的yum源
rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm yum install zabbix-agent -y
配置zabbix-agent配置文件,指定zabbix的服务端为linux-node1的IP地址
[root@linux-node2 ~]# vim /etc/zabbix/zabbix_agentd.conf Server=192.168.1.180 #启动zabbix-agent服务 [root@linux-node2 ~]# systemctl start zabbix-agent [root@linux-node2 ~]# systemctl enable zabbix-agent
在zabbix服务端添加这个agent主机到zabbix监控主机中,使用克隆的方式添加这个agent客户端,这样的好处为只要做简单的修改就可以完成一个agent的添加过程,省略了添加模板等一些选项的设置。
添加MAP视图
首先查看agent客户端的item的监控项,找到网卡接口的item监控项如下:

进入map视图的编辑模式,添加如下:

对于使用了负载均衡的网站或者其余相关的,可以把负载均衡连接后端服务器的的流量画出来
监控事件和报警
事件分触发器的事件,自动发现的事件等。还有内部的事件,自动注册的事件
active动作:意思是在什么条件下触发的一个报警,并将这个报警以什么方式、发送给谁做配置
报警媒介有:email sms短信 微信方式或其他自定义脚本的方式等
在Active的Operations选项可以设置多个操作登记,这样就可以实现故障的升级机制

报警媒介的设置,下面以email的方式配置报警媒介

为用户添加媒介,可以创建一个用户,然后对此用户添加需要的媒介,要添加用户,首先应该添加组,对组授予权限,然后再创建用户并授予此用户的组,那么用户的权限就会受到组的权限约束,用户不可设置自身的权限等。

监控JVM
默认情况下zabbix不能直接监控java的jvm状况,要通过java gateway来对java的jvm做监控,这里的java gateway相当于代理模式,java gateway的服务也不存储数据,只做收集java客户端的状态和数据向zabbix服务端的转发。
关于jvm监控的zabbix官方文档:https://www.zabbix.com/documentation/3.0/manual/concepts/java
安装java gateway和jdk环境
[root@linux-node1 ~]# yum install -y zabbix-java-gateway java-1.8.0
对zabbix-java-gateway的配置文件的说明:
[root@linux-node1 ~]# vim /etc/zabbix/zabbix_java_gateway.conf # LISTEN_IP="0.0.0.0" #默认监听所有ip # LISTEN_PORT=10052 #java gateway监听的默认端口 # START_POLLERS=5 #开启几个探测的进程,默认是5,可以设置和java应用数一致,或者是它的一半值 TIMEOUT=3 #超时时间,1-30 网络环境差的话,超时时间最好改长一点 #上面的设置一般在局域网中不需要修改,使用默认值即可
启动java gateway服务并设置开机启动
[root@linux-node1 ~]# systemctl start zabbix-java-gateway.service [root@linux-node1 ~]# systemctl enable zabbix-java-gateway.service
在zabbix服务端检查监听情况
[root@linux-node1 ~]# netstat -lntp | grep 100 tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 2373/zabbix_agentd tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 1500/zabbix_server tcp6 0 0 :::10050 :::* LISTEN 2373/zabbix_agentd tcp6 0 0 :::10051 :::* LISTEN 1500/zabbix_server tcp6 0 0 :::10052 :::* LISTEN 18836/java
检查java gateway进程和java版本
[root@linux-node1 ~]# ps aux | grep java zabbix 18836 1.2 0.9 3455096 37672 ? Sl 13:42 0:00 java -server -Dlogback.configurationFile=/etc/zabbix/zabbix_java_gateway_logback.xml -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar: lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-3.0.8.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java.pid -Dzabbix.timeout=3 -Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway [root@linux-node1 ~]# java -version openjdk version "1.8.0_121" OpenJDK Runtime Environment (build 1.8.0_121-b13) OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
配置zabbix server配置文件,关联java gateway
vim /etc/zabbix/zabbix_server.conf JavaGateway=192.168.1.180 JavaGatewayPort=10052 StartJavaPollers=5 #这个和java gateway配置文件中的数值对应
重启zabbix-server
[root@linux-node1 ~]# systemctl restart zabbix-server.service
在linux-node2上安装tomcat和jdk,模拟被监控端
[root@linux-node2 ~]# yum install -y java-1.8.0 [root@linux-node2 ~]# cd /usr/local/src/ [root@linux-node2 src]# wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz [root@linux-node2 src]# tar xfz apache-tomcat-8.0.36.tar.gz [root@linux-node2 src]# mv apache-tomcat-8.0.36 /usr/local/ [root@linux-node2 src]# ln -s /usr/local/apache-tomcat-8.0.36/ /usr/local/tomcat [root@linux-node2 src]# /usr/local/tomcat/bin/startup.sh #启动tomcat [root@linux-node2 src]# netstat -lntp | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 8137/java
浏览器http://192.168.168.190:8080就可以打开tomcat的初始界面
关于jvm的监控可以查阅tomcat的文档:http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html
通过jvm的监控文档说明,对/usr/local/tomcat/bin/catalina.sh做配置如下:
[root@linux-node2 ~]# vim /usr/local/tomcat/bin/catalina.sh CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.190"
重启tomcat,是配置生效
[root@linux-node2 src]# /usr/local/tomcat/bin/shutdown.sh [root@linux-node2 src]# /usr/local/tomcat/bin/startup.sh
看到8888端口已经起来了
[root@linux-node2 src]# netstat -lntp tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 6938/zabbix_agentd tcp6 0 0 :::10050 :::* LISTEN 6938/zabbix_agentd tcp6 0 0 127.0.0.1:8005 :::* LISTEN 8522/java tcp6 0 0 :::56614 :::* LISTEN 8522/java tcp6 0 0 :::8009 :::* LISTEN 8522/java tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::8080 :::* LISTEN 8522/java tcp6 0 0 :::22 :::* LISTEN 1160/sshd tcp6 0 0 :::8888 :::* LISTEN 8522/java tcp6 0 0 :::57945 :::* LISTEN 8522/java
在windows系统的电脑的jdk的bin目录下(需要安装jdk),找到jconsole连接jvm
接下来在zabbix上修改linux-node2的agent客户端,在其基础上添加一个jvm监控功能,修改如下:


编辑脚本让zabbix来监控nginx
修改zabbix-agent配置文件,让其包含仅支持.conf文件,这样的话,sh脚本也可以放这个目录下了,然后不会被误认为配置文件而加载
[root@linux-node1 ~]# vim /etc/zabbix/zabbix_agentd.conf Iclude=/etc/zabbix/zabbix_agentd.d/*.conf [root@linux-node1 ~]# systemctl restart zabbix-agent
在/etc/zasbbix/zabbix_agentd.d/目录下创建一个脚本,来监控nginx redis memcache等
#!/bin/bash
############################################################
# $Name: zabbix_linux_plugins.sh
# $Version: v1.0
# $Function: zabbix plugins
# $Author: goser
# $organization: cnblog.com/goser
# $Create Date: 2017-08-10
# $Description: Monitor Linux Service Status
############################################################
tcp_status_fun(){
TCP_STAT=$1
#netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp
TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2)
if [ -z $TCP_STAT_VALUE ];then
TCP_STAT_VALUE=0
fi
echo $TCP_STAT_VALUE
}
nginx_status_fun(){
NGINX_PORT=$1
NGINX_COMMAND=$2
nginx_active(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
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
}
memcached_status_fun(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}
redis_status_fun(){
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
}
main(){
case $1 in
tcp_status)
tcp_status_fun $2;
;;
nginx_status)
nginx_status_fun $2 $3;
;;
memcached_status)
memcached_status_fun $2 $3;
;;
redis_status)
redis_status_fun $2 $3;
;;
*)
echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
esac
}
main $1 $2 $3
因为nginx和agent在同一台机器上,可以 修改nginx的配置文件如下
vim /usr/local/nginx/conf/nginx.conf
location /nginx_status{
allow 127.0.0.1;
}
#重启nginx服务
[root@linux-node1 ~]# /usr/local/nginx/sbin/nginx -s reload
使用此脚本来测试是否可用
[root@linux-node1 zabbix_agentd.d]# ./zabbix_linux_plugin.sh nginx_status 8080 active 1
新建自定义key文件,调用这个脚本
[root@linux-node1 zabbix_agentd.d]# cp nginx.conf linux.conf [root@linux-node1 zabbix_agentd.d]# vim linux.conf UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_linux_plugin.sh "$1" "$2" "$3" #重启agent [root@linux-node1 zabbix_agentd.d]# systemctl restart zabbix-agent.service
使用zabbix_get命令来验证是否可以调用这个key
[root@linux-node1 ~]# zabbix_get -s 192.168.1.180 -k linux_status[nginx_status,8080,active] 1
使用zabbix_get命令成功获取了key的值,这样就可以在zabbix上添加这个监控项了
创建一个nginx的状态模板:

add之后,在模板里找到它,然后点进去,看到items等.创建item

更新间隔,30秒太频繁了,可以改成60秒一次,顺便创建一个叫Nginx Status的application

点击add,添加成功,使用同样的方法,创建writing reading waitding 这里我们使用clone的方式 等item

给linux-node1加这个模板

对nginx这几种状态创建grap图形展示

这时候就可以通过grap来对nginx的状态item做出图展示,当然也可以对这个新创建的模板导出,这样别的机器上安装了nginx服务的话,就可以使用这个模板来做监控了。
导入tcp状态监控模板,对tcp的各个状态进行监控
这个tcp模板要用到上面的linux.conf中的key(linux_status)和shell脚本zabbix_linux_plugin.sh,所以在导入这个模板之间,要有这个key和shell脚本
tcp状态监控模板为:
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.0</version> <date>2016-06-18T06:34:48Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template Linux TCP Status</template> <name>Template Linux TCP Status</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>TCP Stauts</name> </application> </applications> <items> <item> <name>TCP Status CLOSE_WAIT</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,CLOSE-WAIT]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status CLOSED</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,CLOSED]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status CLOSING</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,CLOSING]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status ESTABLISHED</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,ESTAB]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status FIN_WAIT1</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,FIN-WAIT-1]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status FIN_WAIT2</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,FIN-WAIT-2]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status LAST_ACK</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,LAST-ACK]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status LISTEN</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,LISTEN]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status SYN_RCVD</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,SYN-RECV]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status SYN_SENT</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,SYN-SENT]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>TCP Status TIME_WAIT</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>linux_status[tcp_status,TIME-WAIT]</key> <delay>300</delay> <history>30</history> <trends>90</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>TCP Stauts</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <graphs> <graph> <name>TCP Status Statistics</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>C80000</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,CLOSED]</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>00C800</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,CLOSE-WAIT]</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>0000C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,CLOSING]</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>C800C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,ESTAB]</key> </item> </graph_item> <graph_item> <sortorder>4</sortorder> <drawtype>0</drawtype> <color>00C8C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,FIN-WAIT-1]</key> </item> </graph_item> <graph_item> <sortorder>5</sortorder> <drawtype>0</drawtype> <color>C8C800</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,FIN-WAIT-2]</key> </item> </graph_item> <graph_item> <sortorder>6</sortorder> <drawtype>0</drawtype> <color>C8C8C8</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,LAST-ACK]</key> </item> </graph_item> <graph_item> <sortorder>7</sortorder> <drawtype>0</drawtype> <color>960000</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,LISTEN]</key> </item> </graph_item> <graph_item> <sortorder>8</sortorder> <drawtype>0</drawtype> <color>009600</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,SYN-RECV]</key> </item> </graph_item> <graph_item> <sortorder>9</sortorder> <drawtype>0</drawtype> <color>000096</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,SYN-SENT]</key> </item> </graph_item> <graph_item> <sortorder>10</sortorder> <drawtype>0</drawtype> <color>960096</color> <yaxisside>0</yaxisside> <calc_fnc>2</calc_fnc> <type>0</type> <item> <host>Template Linux TCP Status</host> <key>linux_status[tcp_status,TIME-WAIT]</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export>
导入这个模板

对agent监控端添加这个模板

这样就可以通过grap对linux-node1和linux-node2做tcp的出图监控展示
给nginx监控加触发器
如果一个监控项要达到在出问题时可以触发一个动作,报警给相关的人员的话,那么这就要用到触发器。设置触发器是在item基础上判断item的条件来作为判断的根据,当触发器中的判断item的条件满足的情况下就会调用actions来执行操作(以什么媒介发送、发送的内容、发送给谁等)。

浏览器打开http://192.168.1.180:8080 ,模拟问题。让连接数大于1。这时候自动发送了邮件告警

从dashboard界面可以看到正在发送告警信息,以邮件的方式发到接收者的email中,如下:

自定义告警脚本
我们通过/etc/zabbix/zabbix_server.conf知道告警的脚本存放目录为:/usr/lib/zabbix/alertscripts
自定义告警脚本创建流程:
1、脚本放在 /usr/lib/zabbix/alertscripts
2、需要支持3个参数,1 收件人,2 主题, 3内容
3、执行权限
4、web界面添加
5、修改actions
当然告警也可以通过短信通道来做,这个是企业普遍采用的告警方式,比如阿里大于短信服务业务,通过查看短信通道的api可以看到支持python脚本的方式

下面模拟自定义一个告警脚本,首先在/usr/lib/zabbix/alertscripts目录下创建自定义脚本
[root@linux-node1 ~]# cd /usr/lib/zabbix/alertscripts [root@linux-node1 alertscripts]# vim sms.sh #!/bin/bash ALERT_TO=$1 ALERT_TITLE=$2 ALERT_BODY=$3 echo $ALERT_TO >> /tmp/sms.log echo $ALERT_TITLE >> /tmp/sms.log echo $ALERT_BODY >> /tmp/sms.log [root@linux-node1 alertscripts]# chmod +x sms.sh
创建新的告警介质,脚本需要加参数,从脚本里取,用大括号括起来,这3个参数分别是$1,$2,$3

然后修改actions,将发送方式换成Send_SMS,在用户编辑界面添加Send_SMS这个自定义的媒介

浏览器打开http://192.168.1.180:8080 ,模拟问题。让连接数大于1。这时候自动发送了邮件告警
模拟发送成功,实际自己写的脚本就该这么个架构
[root@linux-node1 tmp]# tail -5 /tmp/sms.log xxxxxx@qq.com PROBLEM: Nginx Active > 1 Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tus[nginx_status,8080,active]): 3
zabbix利用percona来监控mysql数据库
zabbix自带有监控mysql的脚本,但真正生产喜欢用的是percona的脚本,因为在某些方面它比官方的性能更好
percona的官方文档:https://www.percona.com/software/documentation
percona的监控教程文档:https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html
安装percona的yum源
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm -y
安装percona-zabbix-templates,这里在linux-node1上安装,因为linux-node1上安装了mysql数据库
[root@linux-node1 ~]# yum install percona-zabbix-templates php php-mysql -y
这里percona依赖php php-mysql,所以agent要按照php包,但是linux-node1上执行上面的安装时并没有安装php和php-mysql,因为在安装zabbix的时候已经作为依赖安装上了
查看percona的安装路径
[root@linux-node1 ~]# rpm -ql percona-zabbix-templates /var/lib/zabbix/percona /var/lib/zabbix/percona/scripts /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php /var/lib/zabbix/percona/templates /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.7.xml
拷贝模板配置文件到zabbix配置文件目录下
[root@linux-node1 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
这个userparameter_percona_mysql.conf配置文件类似于我们创建的nginx.conf文件,里面是一些percona调用mysql信息的key和脚本get_mysql_stats_wrapper.sh执行的方式
[root@linux-node1 zabbix_agentd.d]# tail -10 userparameter_percona_mysql.conf UserParameter=MySQL.log-writes,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh hg UserParameter=MySQL.Query-time-count-04,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh op UserParameter=MySQL.Query-time-count-05,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh oq UserParameter=MySQL.Query-time-count-06,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh or UserParameter=MySQL.Query-time-count-07,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh os UserParameter=MySQL.Query-time-count-08,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ot UserParameter=MySQL.Query-time-count-09,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ou UserParameter=MySQL.Open-files,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ij UserParameter=MySQL.State-closing-tables,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh lq UserParameter=MySQL.running-slave,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
重启zabbix-agent
[root@linux-node1 scripts]# systemctl restart zabbix-agent.service
在/var/lib/zabbix/percona/scripts目录下,创建连接mysql的配置文件,由于root密码是空。所以这里也写的空
[root@linux-node1 scripts]# vim ss_get_mysql_stats.php.cnf <?php $mysql_user = 'root'; $mysql_pass = '';
测试下此目录下脚本执行是否正常
[root@linux-node1 scripts]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg 0 [root@linux-node1 scripts]# ./get_mysql_stats_wrapper.sh gm 1
用zabbix-get来测试mysql数据库的key
[root@linux-node1 scripts]# zabbix_get -s 192.168.58.11 -k MySQL.max-connections rm: cannot remove ‘/tmp/localhost-mysql_cacti_stats.txt’: Operation not permitted 151
根据上面的提示,对/tmp/localhost-mysql_cacti_stats.txt文件授予zabbix所有者权限
[root@linux-node1 scripts]# chown zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt [root@linux-node1 scripts]# zabbix_get -s 192.168.58.11 -k MySQL.max-connections 151
由于percona自带的模板zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.7.xml不能用。这里从别的zabbix服务上导出一个zbx_mysql_export_templates.xml来导入

给linux-node1添加此导入的模板

这样就可以用grap对mysql做监控出图展示
zabbix-web监控操作
这里对linux-node2的tomcat的web做监控,监控其是否可连接
用curl命令来测试连接linux-node2的tomcat服务是否正常。返回200则正常访问
[root@linux-node1 ~]# curl --head http://192.168.58.12:8080/ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Sun, 26 Mar 2017 15:14:17 GMT
对linux-node2创建一个web场景,它不依赖于agent,是server自己的


agent这里你可以选择一个浏览器,以前也有浏览器,但是没3.0这么全



添加完web场景后,系统默认没加触发器,这里手动添加触发器,所以最好写个模板

停止tomcat来测试触发告警
[root@linux-node2 ~]# /usr/local/tomcat/bin/shutdown.sh #告警后再启动tomcat,来恢复 [root@linux-node2 ~]# /usr/local/tomcat/bin/startup.sh
修改action告警信息内容
生产中要对告警的信息内容做部分删除,保证70个字符以内
状态:{TRIGGER.STATUS}
主机:{HOST.NAME1}
监控项:{ITEM.KEY1} : {ITEM.VALUE1}

模拟故障测试方法2,模拟404故障
[root@linux-node2 webapps]# mv ROOT ROOT2 #待告警信息推送后,再恢复 [root@linux-node2 webapps]# mv ROOT2 ROOT
sms.log显示的内容如下:
状态:PROBLEM 监控项:web.test.rspcode[tomcat web monitor,tomcat index] : 404
监控模式
怎么看zabbix server能不能抗住,看队列就行了,看看item更新超时时间

为什么使用主动模式
1、监控主机多,性能跟不上,延迟大
2、多机房,防火墙
Zabbix轻松解决。Nagios不太好解决
针对Agent来说
1、被动模式
2、主动模式,active
当监控主机超过300+,建议使用主动模式
修改客户端配置文件:
[root@linux-node2 webapps]# vim /etc/zabbix/zabbix_agentd.conf StartAgents=0 #Server=192.168.1.180 ServerActive=192.168.1.180 Hostname=linux-node2.goser.com
然后找到需要修改成主动模式的模板,修改如下:


更改items为主动模式



key的类型都变成active的了

修改node2的模板为主动模式模板

这样主动模式部署完成
分布式监控
根据zabbix官网文档www.zabbix.com图示如下:

根据上图可以连接到,zabbix分布式监控主要用在多机房监控场景,在每个机房中部署一个zabbix-proxy代理服务器,由这个代理服务器收集各个服务器的状态,并缓存在代理服务器本地,同时将收集来的信息发送给zabbix server,最后由zabbix server端发送报警提示。
这里试验的部署为:让linux-node2作为proxy服务端,并且同时监控自己的状态。部署过程如下:
在linux-node2上安装zabbix-proxy,由于收集的信息要缓存在本地,所以还要安装数据库
[root@linux-node2 ~]# yum install -y zabbix-proxy zabbix-proxy-mysql mariadb-server
调整数据库的字符集
[root@linux-node2 ~]# vim /etc/my.cnf [mysqld] default-storage-engine = innodb innodb_file_per_table collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8
启动数据库
[root@linux-node2 ~]# systemctl start mariadb [root@linux-node2 ~]# systemctl enable mariadb.service
创建数据库zabbix-proxy
[root@linux-node2 ~]# mysql MariaDB [(none)]> create database zabbix_proxy; MariaDB [(none)]> grant all on zabbix_proxy.* to zabbix_proxy@localhost identified by 'zabbix_proxy';
导入zabbix-proxy数据库实例表
[root@linux-node2 ~]# cd /usr/share/doc/zabbix-proxy-mysql-3.0.14/ [root@linux-node2 zabbix-proxy-mysql-3.0.14]# zcat schema.sql.gz |mysql -uzabbix_proxy -p zabbix_proxy
修改zabbix-proxy端的配置文件
[root@linux-node2 ~]# grep '^[a-Z]' /etc/zabbix/zabbix_proxy.conf Server=192.168.182.170 Hostname=zabbix-proxy LogFile=/var/log/zabbix/zabbix_proxy.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_proxy.pid DBHost=localhost DBName=zabbix_proxy DBUser=zabbix_proxy DBPassword=zabbix_proxy SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000
启动zabbix-proxy并设置开机自启动
root@linux-node2 ~]# systemctl start zabbix-proxy root@linux-node2 ~]# systemctl enable zabbix-proxy.service
配置客户端agent让其向zabbix-proxy端汇报数据
[root@linux-node2 ~]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 StartAgents=0 ServerActive=192.168.182.171 Hostname=linux-node2.goser.com Include=/etc/zabbix/zabbix_agentd.d/
重启zabbix-agent
[root@linux-node2 ~]# systemctl restart zabbix-agent.service
自动化监控
自动化监控包括:自动注册(agent在主动模式下向server端请求加入监控)和主动发现(server端主动去添加主机,通过扫描ip地址范围等方式) 。虽然自动注册和主动发现很强大,但生产场景中很少使用,因为这种自动化监控是不可控的,建议使用api的方式来可计划地添加监控主机。
/自动注册部署/
这里以linux-node2来自动注册。注意先把web上的linux-node2主机删除掉
[root@linux-node2 ~]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 StartAgents=0 ServerActive=192.168.182.170 Hostname=linux-node2.goser.com HostMetadataItem=system.uname #设置agent的身份特征 Include=/etc/zabbix/zabbix_agentd.d/
因为是自动注册,所以agent端要在主动模式下,还要有一个active,这样agent才能找到server并根据metadata特征添加到server监控



最后重启agent,稍等一会agent就会自动注册到server端
[root@linux-node2 ~# systemctl restart zabbix-agent.service

/主动发现部署/
主动发现为server端根据discovery rules定义的ip地址范围,通过active定义的条件和操作来添加主机
这里以linux-node2为要主动发现要添加的主机,首先保证linux-node2的agent配置成被动模式
[root@linux-node2 ~]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=192.168.182.170 StartAgents=3 Hostname=linux-node2.goser.com HostMetadataItem=system.uname Include=/etc/zabbix/zabbix_agentd.d/
添加一个discovery rule如下:

为主动发现添加一个active,这里使用zabbix自带的discovery active,启用它即可

这样linux-node2就会t通过server端的主动发现被添加到监控主机中。
/通过zabbix的api来添加主机/
可以通过zabbix的官网的api文档:https://www.zabbix.com/documentation/3.0/manual/api
获取zhangsan账号登录zabbix的token
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "zhangsan",
"password": "zabbix"
},
"id": 1
}' http://192.168.182.170/zabbix/api_jsonrpc.php | python -m json.tool
通过这个token来获取主机列表
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["host"]
},
"auth": "b0564763e18b6f72622b017059919557",
"id": 1
}' http://192.168.182.170/zabbix/api_jsonrpc.php | python -m json.tool
当然也可以通过token来获取linux的模板
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "template.get",
"params": {
"output": "extend",
"filter": {
"host": [
"Template OS Linux",
"Template OS Windows"
]
}
},
"auth": "b0564763e18b6f72622b017059919557",
"id": 1
}' http://192.168.182.170/zabbix/api_jsonrpc.php | python -m json.tool
可以使用python生成一个脚本zabbix_auth.py来获取token
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
url = 'http://192.168.182.170/zabbix/api_jsonrpc.php'
post_data = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "zhangsan",
"password": "zabbix"
},
"id": 1
}
post_header = {'Content-Type': 'application/json'}
ret = requests.post(url, data=json.dumps(post_data), headers=post_header)
zabbix_ret = json.loads(ret.text)
if not zabbix_ret.has_key('result'):
print 'login error'
else:
print zabbix_ret.get('result')
在运行python zabbix_auth.py的时候提示错误,这是系统没有安装pip工具
[root@linux-node1 ~]# yum install python-pip -y [root@linux-node1 ~]# pip install requests [root@linux-node1 ~]# python zabbix_auth.py 2f9a65b3a2e20a5bfd7402aca0b70511
利用这个python脚本生成的token来添加linux-node2的主机
curl -s -X POST -H 'Content-Type: application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "Linux server",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "192.168.182.171",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "9"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "2f9a65b3a2e20a5bfd7402aca0b70511",
"id": 1
}' http://192.168.182.170/zabbix/api_jsonrpc.php | python -m json.tool
这里的groupid和templateid可以通过点击zabbix的web界面的host group和template页面通过url即可获得。
运行完上面的代码后,最后在zabbix的web页面上成功添加了一台主机如下:

浙公网安备 33010602011771号