一、Zabbix 基于SNMP监控1、介绍SNMP：简单网络管理协议；（非常古老的协议）三种通信方式：读（get, getnext）、写（set）、trap（陷阱）；端口： 161/udp 162/udpSNMP协议：年代久远 v1: 1989 v2c 1993 v3: 1998监控网络设备：交换机、路由器MIB：Management Information Base 信息管理基础OID：Object ID 对象ID2、Linux 启用 snmp[root@node1 ~]# yum install net-snmp net-snmp-utils配置文件：定义ACL[root@node1 ~]# vim /etc/snmp/snmpd.conf启动服务：[root@node1 ~]# systemctl start snmpd # 被监控端开启的服务 [root@node1 ~]# systemctl start snmptrapd # 监控端开启的服务（如果允许被监控端启动主动监控时启用）3、配置文件的介绍开放数据：4步1、定义认证符，将社区名称"public"映射为"安全名称"2、将安全名称映射到一个组名3、为我们创建一个视图，让我们的团队有权利掩码：我列出一些注释，有很多，可以再网上查询.1.3.6.1.2.1. 1.1.0：系统描述信息，SysDesc 1.3.0：监控时间， SysUptime 1.5.0：主机名，SysName 1.7.0：主机提供的服务，SysService.1.3.6.1.2.2. 2.1.0：网络接口数目 2.2.1.2:网络接口的描述信息 2.2.1.3:网络接口类型 ……4、授予对systemview视图的只读访问权4、测试工具[root@node1 ~]# snmpget -v 2c -c public HOST OID [root@node1 ~]# snmpwalk -v 2c -c public HOST OID # 通过这个端口查询到的数据，全列出了4、配置SNMP监控1、下载，修改配置文件[root@node1 ~]# vim /etc/snmp/snmpd.conf view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.2 # 网络接口的相关数据 view systemview included .1.3.6.1.4.1.2021 # 系统资源负载，memory, disk io, cpu load view systemview included .1.3.6.1.2.1.252、在 agent 上测试[root@node1 ~]# snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.3.0 [root@node1 ~]# snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.5.03、在监控页面，给node2加一个snmp的接口4、在 node2 上加一个 Template OS Linux SNMPv2 模板模板添加成功，生成一系列东西点开一个item 看一下5、生成一些最新数据的图形 graph了5、设置入站出站packets 的SNMP监控1、监控网络设备：交换机、路由器的步骤：把交换机、路由器的SNMP 把对应的OID的分支启用起来了解这些分支下有哪些OID，他们分别表示什么意义我们要监控的某一数据：如交换机的某一个接口流量、报文，发送、传入传出的报文数有多少个；传入传出的字节数有多少个，把OID取出来，保存2、定义入站出站的item监控项interface traffic packets(in)interface traffic packets(out)二、基于JVM接口监控1、介绍Java虚拟机(JVM)具有内置的插件，使您能够使用JMX监视和管理它。您还可以使用JMX监视工具化的应用程序。1、配置设置介绍1、zabbix-java-gateway主机设置安装 zabbix-java-gateway程序包，启动服务；[root@qfedu.com ~]# yum -y install zabbix-java-gateway2、zabbix-server端设置（需要重启服务）JavaGateway=172.16.0.70 #即 zabbix server IP地址 JavaGatewayPort=10052 StartJavaPollers=5 #监控项3、tomcat主机设置监控tomcat：[root@qfedu.com ~]# vim /etc/sysconfig/tomcat CATALINA_OPTS="-Djava.rmi.server.hostname=TOMCAT_SERVER_IP -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" #启用JVM接口，默认没有启用 jmx[object_name,attribute_name] object name # 它代表MBean的对象名称 attribute name - # 一个MBean属性名称，可选的复合数据字段名称以点分隔 示例： jmx["java.lang:type=Memory","HeapMemoryUsage.used"4、 jmx的详细文档：https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html注意: 如果是手动安装的tomcat 需要编辑 catalina.sh 文件 ，重启 tomcat2、配置JVM接口监控1、安装配置 tomcat1、下载安装tomcat，主要是用JVM[root@qfedu.com ~]# yum -y install java-1.8.0-openjdk-devel tomcat-admin-webapps tomcat-docs-webapp2、加CATALINA_OPTS= #启用JVM接口，默认没有启用[root@qfedu.com ~]# vim /etc/sysconfig/tomcat CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.30.2 -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"3、开启服务[root@qfedu.com ~]# systemctl start tomcat2、在 zabbix-server 端安装配置 java-gateway1、安装配置 java-gateway[root@qfedu.com ~]# yum -y install zabbix-java-gateway [root@qfedu.com ~]# vim /etc/zabbix/zabbix_java_gateway.conf # 安装完后，会生成一个java_gateway 的配置文件 LISTEN_IP="0.0.0.0" #监听服务器地址 LISTEN_PORT=10052 #监听zabbix_java进程的端口，默认是10052 PID_FILE="/tmp/zabbix_java.pid" #zabbix_java的pid路径 START_POLLERS=5 #zabbix_java的进程数 TIMEOUT=10 #zabbix_java的超时时间 [root@qfedu.com ~]# systemctl start zabbix-java-gateway.service # 可不用修改，直接开启服务 2、修改 server 配置开启 java-gateway 的配置[root@qfedu.com ~]# vim /etc/zabbix/zabbix_server.conf JavaGateway=192.168.30.107 JavaGatewayPort=10052 StartJavaPollers=5 # 打开5个监控项3、 重启zabbix-server 服务[root@qfedu.com ~]# systemctl restart zabbix-server 3、在node2 主机上添加JMX接口，实验模板1、添加JMX接口2、在 node2 上连接 tomcat JMX 模板3、随便查看一个监控项 item4、自己定义一个堆内存使用的监控项，基于JVM接口（没必要，使用模板就好）三、Zabbix 分布式监控1、介绍分布式监控概述：proxy and node1、Zabbix 的三种架构Server-agentServer-Node-agentServer-Proxy-agent2、配置介绍Zabbix Proxy的配置：server-node-agentserver-proxy-agent1、配置proxy主机1、安装程序包zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender2、准备数据库 创建、授权用户、导入schema.sql；3、修改配置文件Server= zabbix server # 主机地址； Hostname= # 当前代理服务器的名称；在server添加proxy时，必须使用此处指定的名称；需要事先确保server能解析此名称； DBHost= DBName= DBUser= DBPassword= ConfigFrequency=10 # proxy被动模式下，server多少秒同步配置文件至proxy。该参数仅用于被动模式下的代理。范围是1-3600*24*7 DataSenderFrequency=1 #代理将每N秒将收集的数据发送到服务器。 对于被动模式下的代理，该参数将被忽略。范围是1-36004、在 server 端添加此 PorxyAdministration --> Proxies5、在Server端配置通过此Proxy监控的主机；注意：zabbix agent 端要允许 zabbix proxy 主机执行数据采集操作：2、实现分布式 zabbix proxy 监控1、实验前准备ntpdate 172.168.30.1 同步时间关闭防火墙，selinux设置主机名 hostnamectl set-hostname zbproxy.qfedu.comvim /etc/hosts 每个机器都设置hosts，以解析主机名；DNS也行2、环境配置（4台主机）机器名称IP配置服务角色zabbix-server192.168.30.107监控agent-node1192.168.30.7被监控端agent-node2192.168.30.2被监控端node3192.168.30.3代理proxyzabbix-server 直接监控一台主机 node1zabbix-server 通过代理 node3 监控 node23、在 node3 上配置 mysql1、创建配置 mysql1、创建 mariadb.repo[root@node3 ~]# vim /etc/yum.repos.d/mariadb.repo 写入以下内容： [mariadb] name = MariaDB baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64 gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=12、yum 安装最新版本 mariadb[root@node3 ~]# yum install -y MariaDB-server MariaDB-clien修改配置文件[root@node3 ~]# vim /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve = ON # 跳过主机名解析 innodb_file_per_table = ON # 开启独立表空间 innodb_buffer_pool_size = 256M # 缓存池大小 max_connections = 2000 # 最大连接数 log-bin = master-log # 开启二进制日志3、重启我们的数据库服务[root@node3 ~]# systemctl restart mariadb [root@node3 ~]# mysql_secure_installation # 初始化mariadb4、创建数据库 和 授权用户MariaDB [(none)]> create database zbxproxydb character set 'utf8'; MariaDB [(none)]> grant all on zbxproxydb.* to 'zbxproxyuser'@'192.168.30.%' identified by 'zbxproxypass'; MariaDB [(none)]> flush privileges;3、在node3 上下载zabbix 相关的包，主要是代理proxy的包[root@node3 ~]# yum -y install zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender1、初始化数据库zabbix-proxy-mysql 包里带有，导入数据的文件[root@node3 ~]# cp /usr/share/doc/zabbix-proxy-mysql-3.4.4/schema.sql.gz ./ 复制 [root@node3 ~]# gzip -d schema.sql.gz 解包 [root@node3 ~]# mysql -root -p zbxproxydb < schema.sql 导入数据2、查看数据已经生成4、配置 proxy 端[root@node3 ~]# vim /etc/zabbix/zabbix_proxy.confServer=192.168.30.107 # server 的IP ServerPort=10051 # server 的端口 Hostname=zbxproxy.qfedu.com # 主机名 ListenPort=10051 # proxy自己的监听端口 EnableRemoteCommands=1 # 允许远程命令 LogRemoteCommands=1 # 记录远程命令的日志 # 数据的配置 DBHost=192.168.30.3 DBName=zbxproxydb DBUser=zbxproxyuser DBPassword=zbxproxypass ConfigFrequency=30 # 多长时间，去服务端拖一次有自己监控的操作配置；为了实验更快的生效，这里设置30秒，默认3600s DataSenderFrequency=1 # 每一秒向server 端发一次数据，发送频度2、开启服务[root@node3 ~]# systemctl start zabbix-proxy5、配置node2端允许proxy代理监控[root@node3 ~]# vim /etc/zabbix/zabbix_agentd.conf Server=192.168.30.107,192.168.30.3 ServerActive=192.168.30.107,192.168.30.3 [root@node3 ~]# systemctl restart zabbix-agent # 启动服务 6、把代理加入监控 server 创建配置agent 代理1、创建agent 代理2、配置7、创建node2 主机并采用代理监控设置代理成功8、创建item监控项1、随便创一个监控项 CPU Switches2、进程里设置每秒更改3、成功graph 图形生成四、zabbix查询使用模板监控1、官方的 share 分享网站https://share.zabbix.com/zabbix-tools-and-utilities例如：我们要实现监控Nginx ，我们查找一个模板就以这个模板为例2、在node1 上使用此模板1、安装配置 nginx[root@node1 ~]# yum -y install nginx [root@node1 ~]# vim /etc/nginx/nginx.conf # 按照网页的操作指示 location /stub_status { stub_status on; access_log off; # allow 127.0.0.1; #为了操作方便，我取消的访问控制 # deny all; }2、启动服务[root@node1 ~]# systemctl restart nginx2、下载模板所依赖的脚本[root@node1 ~]# mkdir -p /srv/zabbix/libexec/ [root@node1 ~]# cd /srv/zabbix/libexec/ [root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/nginx.sh # 从网页上获取脚本 [root@node1 ~]# chmod +x nginx.sh # 加执行权限3、配置 agent 的用户参数 UserParameter[root@node1 ~]# cd /etc/zabbix/zabbix_agentd.d/ [root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/userparameter_nginx.conf # 很短自己写也行4、在 windows 上下载模板并导入server 的模板中[root@node1 ~]# wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/zbx_export_templates.xml可以现在linux上下载，再sz 导出到 windows 上1、导入下载的模板2、主机 node1 链接这个模板3、模板生效五、Zabbix-server 监控自己，数据库，nginx1、下载安装配置agent[root@qfedu.com ~]# vim /etc/zabbix/zabbix_agentd.conf EnableRemoteCommands=1 允许远程命令 LogRemoteCommands=1 记录远程命令 Server=127.0.0.1 #建议真实ip地址 ServerActive=127.0.0.1 Hostname=server.qfedu.com2、自动生成 Zabbix server 的主机3、在主机中添加模板4、启用Zabbix server5、监控到数据zabbix_agent 客户端操作1、mysql 创建 zabbix 账号连接本地mysqlmysql> GRANT ALL ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES;2、在 zabbix_agentd 创建 .my.cnf （用户名密码登录配置文件）[root@qfedu.com ~]# cat /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf # 获取登录配置文件创建路径 [root@qfedu.com ~]# mkdir -p /var/lib/zabbix # 在/var/lib/zabbix下创建(隐藏).my.cnf [root@qfedu.com ~]# cat ./.my.cnf [client] user=zabbix password=123456六、zabbix微信警报配置1、申请企业微信1、填写注册信息2、配置微信企业号1、创建告警组，然后把接受消息人加进来2、记录账号名称，等下填写接收人信息需要用到3、点击我的企业，查看企业信息，要记录企业CorpID4、点击企业应用，创建应用5、填写信息和通知用户组6、创建完，记录Agentld和Secret3、配置zabbix服务器1、首先确认已经记录的信息告警组用户的账号，企业CorpID和创建应用的Secret、Agentld2、修改zabbix.conf[root@lqfedu.com ~]# grep alertscripts /etc/zabbix/zabbix_server.conf # AlertScriptsPath=${datadir}/zabbix/alertscripts AlertScriptsPath=/usr/lib/zabbix/alertscripts 我们设置zabbix默认脚本路径，这样在web端就可以获取到脚本3、下载并设置脚本[root@lqfedu.com ~]# cd /usr/lib/zabbix/alertscripts/ [root@lqfedu.com alertscripts]# wget https://raw.githubusercontent.com/OneOaaS/weixin-alert/master/weixin_linux_amd64 [root@lqfedu.com alertscripts]# mv weixin_linux_amd64 wechat [root@lqfedu.com alertscripts]# chmod 755 wechat [root@lqfedu.com alertscripts]# chown zabbix:zabbix wechat 4、执行脚本进行测试[root@lqfedu.com alertscripts]# ./wechat --corpid=xxx --corpsecret=xxx --msg="您好，告警测试" --user=用户账号 --agentid=xxx {"errcode":0,"errmsg":"ok","invaliduser":""}提示：-corpid= 我们企业里面的id --corpsecret= 这里就是我们Secret里面的id -msg= 内容 -user=我们邀请用户的账号因为脚本是编译过的，无法进行编辑，我们可以使用 ./wechat -h or --help 查看4、zabbix web页面配置告警信息1、管理-报警媒介类型-创建告警媒介2、填写报警媒介信息--corpid=我们企业里面的id --corpsecret=这里就是我们Secret里面的id --agentid= Agentld ID --user={ALERT.SENDTO} --msg={ALERT.MESSAGE}3、设置告警用户4、设置告警动作1、动作信息2、填写告警时候操作信息故障告警:{TRIGGER.STATUS}: {TRIGGER.NAME} 告警主机:{HOST.NAME} 主机地址:{HOST.IP} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.NAME} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 事件代码:{EVENT.ID} 3、填写恢复操作信息故障解除:{TRIGGER.STATUS}: {TRIGGER.NAME} 恢复主机:{HOST.NAME} 主机地址:{HOST.IP} 恢复时间:{EVENT.DATE} {EVENT.TIME} 恢复等级:{TRIGGER.SEVERITY} 恢复信息:{TRIGGER.NAME} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 事件代码:{EVENT.ID}5、手动触发告警，测试微信接收信息在agent端使用yum安装一下redis：[root@node1 ~]# yum install redis -y修改配置文件[root@node1 ~]# vim /etc/redis.conf bind 0.0.0.0 #不做任何认证操作修改完成以后启动服务并检查端口：[root@node1 ~]# systemctl start redis [root@node1 ~]# ss -nutlp | grep redis tcp LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=5250,fd=4))1、定义监控项进入 配置 ---> 主机 ---> node1 ---> 监控项（items）---> 创建监控项填写完毕以后点击下方的添加。该监控项已成功添加。查看一下他的值：检测中 ---> 最新数据2、定义触发器进入 配置 ---> 主机 ---> node1 ---> 触发器（trigger）---> 创建触发器填写完毕以后点击下方的添加该触发器已成功添加。查看：监测中 ---> 最新数据手动关闭 redis 服务来检测：[root@node1 ~]# systemctl stop redis.service进入监测中 ---> 问题已经显示的是问题了。并且有持续的时间，当服务被打开，会转为已解决状态：[root@node1 ~]# systemctl start redis.service 6、微信客户端检测七、Zabbix 调优1、调优1、Database：历史数据不要保存太长时长；尽量让数据缓存在数据库服务器的内存中；2、触发器表达式：减少使用聚合函数min(), max(), avg()；尽量使用last()，nodata()，因为聚合函数，要运算数据收集：polling较慢(减少使用SNMP/agentless/agent）；尽量使用trapping（agent(active）主动监控）；数据类型：文本型数据处理速度较慢；尽量少收集类型为文本 text或string类型的数据；多使用类型为numeric 数值型数据 的；2、zabbix服务器的进程1、服务器组件的数量；alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ...StartPollers=60StartPingers=10 ...StartDBSyncer=5 ...2、设定合理的缓存大小CacheSize=8MHistoryCacheSize=16MHistoryIndexCacheSize=4MTrendCacheSize=4MValueCacheSize=4M3、数据库优化 分表： history_* trends* events*3、其它解决方案grafana：展示collectd：收集influxdb：存储4、grafana+collectd+influxdb5、prometheus：exporter：收集alertmanager:grafana：展示八、Zabbix监控实战-Tomcat监控1、方法一：开发java监控页面[root@qfedu.com tomcat8_1]# cat /application/tomcat/webapps/memtest/meminfo.jsp <% Runtime rtm = Runtime.getRuntime(); long mm = rtm.maxMemory()/1024/1024; long tm = rtm.totalMemory()/1024/1024; long fm = rtm.freeMemory()/1024/1024; out.println("JVM memory detail info : "); out.println("Max memory:"+mm+"MB"+" "); out.println("Total memory:"+tm+"MB"+" "); out.println("Free memory:"+fm+"MB"+" "); out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+" "); %>2、方法二：使用jps命令进行监控[root@qfedu.com ~]# jps -lvm 31906 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_1/endorsed -Dcatalina.base=/application/tomcat8_1 -Dcatalina.home=/application/tomcat8_1 -Djava.io.tmpdir=/application/tomcat8_1/temp 31812 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp 31932 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_2/endorsed -Dcatalina.base=/application/tomcat8_2 -Dcatalina.home=/application/tomcat8_2 -Djava.io.tmpdir=/application/tomcat8_2/temp 32079 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m3、Tomcat 远程监控功能1、修改配置文件，开启远程监控[root@qfedu.com ~]# vim /application/tomcat8_1/bin/catalina.sh +97 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.17"2、重启服务，检查12345端口是否开启[root@qfedu.com ~]# /application/tomcat8_1/bin/shutdown.sh [root@qfedu.com ~]# /application/tomcat8_1/bin/startup.sh [root@qfedu.com ~]# netstat -tunlp|grep 123453、 检查端口[root@qfedu.com ~]# netstat -tunlp|grep 12345 tcp6 0 0 :::12345 :::* LISTEN 33158/java 4、在windows上监控tomcat注意：windwos需要安装jdk环境！查考：http://www.oracle.com/technetwork/java/javase/downloads/index.html1、软件路径C:\Program Files\Java\jdk1.8.0_31\bin jconsole.exe jvisualvm.exe2、jconsole.exe 使用说明连接成功即可进行监控，连接的时候注意端口信息。3、jvisualvm.exe 使用说明输入ip地址主机添加完成，添加JMX监控注意添加的时候输入端口信息添加完成后就能够多tomcat程序进行监控。4、zabbix 监控 tomcat 程序1、zabbix 服务端安装配置 java监控服务[root@qfedu.com ~]# yum install zabbix-java-gateway -y2、查看配置文件配置文件路径：/etc/zabbix/zabbix_java_gateway.conf [root@qfedu.com ~]# sed -i -e '220a JavaGateway=127.0.0.1' -e '236a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf3、启动zabbix-java-gateway服务，与zabbix服务[root@qfedu.com ~]# systemctl start zabbix-java-gateway.service [root@qfedu.com ~]# systemctl restart zabbix-server.service4、检查java端口是否开启[root@qfedu.com ~]# netstat -lntup |grep java tcp6 0 0 :::10052 :::* LISTEN 72971/java 5、检查java进程是否存在[root@qfedu.com ~]# ps -ef |grep [j]ava zabbix 72971 1 0 11:29 ? 00:00: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.13.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java.pid -Dzabbix.timeout=3 -Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway zabbix 73255 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #1 [got 0 values in 0.000002 sec, idle 5 sec] zabbix 73256 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #2 [got 0 values in 0.000002 sec, idle 5 sec] zabbix 73257 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #3 [got 0 values in 0.000002 sec, idle 5 sec] zabbix 73258 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #4 [got 0 values in 0.000002 sec, idle 5 sec] zabbix 73259 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #5 [got 0 values in 0.000004 sec, idle 5 sec]6、web界面添加1、添加主机2、主机管理模板，注意是JMX模板3、监控完成5、排除 tomcat 故障步骤1、查看 catalina.out2、使用 sh show-busy-java-threads.sh 脚本进行检测#!/bin/bash # @Function # Find out the highest cpu consumed threads of java, and print the stack of these threads. # # @Usage # $ ./show-busy-java-threads.sh # # @author Jerry Lee readonly PROG=`basename $0` readonly -a COMMAND_LINE=("$0" "$@") usage() { cat <<EOF Usage: ${PROG} [OPTION]... Find out the highest cpu consumed threads of java, and print the stack of these threads. Example: ${PROG} -c 10 Options: -p, --pid find out the highest cpu consumed threads from the specifed java process, default from all java process. -c, --count set the thread count to show, default is 5 -h, --help display this help and exit EOF exit $1 } readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"` [ $? -ne 0 ] && usage 1 eval set -- "${ARGS}" while true; do case "$1" in -c|--count) count="$2" shift 2 ;; -p|--pid) pid="$2" shift 2 ;; -h|--help) usage ;; --) shift break ;; esac done count=${count:-5} redEcho() { [ -c /dev/stdout ] && { # if stdout is console, turn on color output. echo -ne "\033[1;31m" echo -n "$@" echo -e "\033[0m" } || echo "$@" } yellowEcho() { [ -c /dev/stdout ] && { # if stdout is console, turn on color output. echo -ne "\033[1;33m" echo -n "$@" echo -e "\033[0m" } || echo "$@" } blueEcho() { [ -c /dev/stdout ] && { # if stdout is console, turn on color output. echo -ne "\033[1;36m" echo -n "$@" echo -e "\033[0m" } || echo "$@" } # Check the existence of jstack command! if ! which jstack &> /dev/null; then [ -z "$JAVA_HOME" ] && { redEcho "Error: jstack not found on PATH!" exit 1 } ! [ -f "$JAVA_HOME/bin/jstack" ] && { redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!" exit 1 } ! [ -x "$JAVA_HOME/bin/jstack" ] && { redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!" exit 1 } export PATH="$JAVA_HOME/bin:$PATH" fi readonly uuid=`date +%s`_${RANDOM}_$$ cleanupWhenExit() { rm /tmp/${uuid}_* &> /dev/null } trap "cleanupWhenExit" EXIT printStackOfThread() { local line local count=1 while IFS=" " read -a line ; do local pid=${line[0]} local threadId=${line[1]} local threadId0x=`printf %x ${threadId}` local user=${line[2]} local pcpu=${line[4]} local jstackFile=/tmp/${uuid}_${pid} [ ! -f "${jstackFile}" ] && { { if [ "${user}" == "${USER}" ]; then jstack ${pid} > ${jstackFile} else if [ $UID == 0 ]; then sudo -u ${user} jstack ${pid} > ${jstackFile} else redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})." redEcho "User of java process($user) is not current user($USER), need sudo to run again:" yellowEcho " sudo ${COMMAND_LINE[@]}" echo continue fi fi } || { redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})." echo rm ${jstackFile} continue } } blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):" sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile} done } ps -Leo pid,lwp,user,comm,pcpu --no-headers | { [ -z "${pid}" ] && awk '$4=="java"{print $0}' || awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}' } | sort -k5 -r -n | head --lines "${count}" | printStackOfThread九、zabbix 监控 php-fpmzabbix监控php-fpm主要是通过nginx配置php-fpm的状态输出页面，在正则取值.要nginx能输出php-fpm的状态首先要先修改php-fpm的配置，没有开启nginx是没有法输出php-fpm status。1、修改文件php-fpmvim /application/php-5.5.32/etc/php-fpm.conf文件2、修改nginx配置文件vim /application/nginx/conf/extra/www.conf，在server 区块下添加一行内容重启nginx3、curl 127.0.0.1/php_status 我们可以看到php-fpm 的状态信息字段含义poolphp-fpm pool的名称，大多数情况下为wwwprocess manager进程管理方式，现今大多都为dynamic，不要使用staticstart timephp-fpm上次启动的时间start sincephp-fpm已运行了多少秒accepted connpool接收到的请求数listen queue处于等待状态中的连接数，如果不为0，需要增加php-fpm进程数max listen queuephp-fpm启动到现在处于等待连接的最大数量listen queue len处于等待连接队列的套接字大小idle processes处于空闲状态的进程数active processes处于活动状态的进程数total processess进程总数max active process从php-fpm启动到现在最多有几个进程处于活动状态max children reached当pm试图启动更多的children进程时，却达到了进程数的限制，达到一次记录一次，如果不为0，需要增加php-fpm pool进程的最大数slow requests当启用了php-fpm slow-log功能时，如果出现php-fpm慢请求这个计数器会增加，一般不当的Mysql查询会触发这个值4、编写监控脚本和监控文件vim /server/scripts/php_fpm-status.sh #!/bin/sh #php-fpm status case $1 in ping) #检测php-fpm进程是否存在 /sbin/pidof php-fpm | wc -l ;; start_since) #提取status中的start since数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==4{print $3}' ;; conn) #提取status中的accepted conn数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==5{print $3}' ;; listen_queue) #提取status中的listen queue数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==6{print $3}' ;; max_listen_queue) #提取status中的max listen queue数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==7{print $4}' ;; listen_queue_len) #提取status中的listen queue len /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==8{print $4}' ;; idle_processes) #提取status中的idle processes数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==9{print $3}' ;; active_processes) #提取status中的active processes数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==10{print $3}' ;; total_processes) #提取status中的total processess数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==11{print $3}' ;; max_active_processes) #提取status中的max active processes数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==12{print $4}' ;; max_children_reached) #提取status中的max children reached数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==13{print $4}' ;; slow_requests) #提取status中的slow requests数值 /usr/bin/curl 127.0.0.1/php_status 2>/dev/null | awk 'NR==14{print $3}' ;; *) echo "Usage: $0 {conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processess|total_processes|max_active_processes|max_children_reached|slow_requests}" exit 1 ;; esac vim /etc/zabbix/zabbix_agentd.d/test.conf UserParameter=php_status[*],/bin/sh /server/scripts/php_fpm-status.sh $15、重启服务在服务端测试6、在web端进行配置这时候我们再来看最新监控数据，就可以看到我们监控的内容了配置到这，我们PHP状态监控基本完成，根据需求配置相应的触发器，即可。你要的模板链接: https://pan.baidu.com/s/1z0IU82uGId-LH1EryyuwCw 提取码: q6n9十、zabbix 监控 mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么，怎么监控，监控数据如何存储，监控数据如何展现，如何处理报警等。要进行监控的系统规划需要对Zabbix很了解，这里只是提出监控的需求。需求一：监控MySQL的状态，当状态发生异常，发出报警；需求二：监控MySQL的操作，并用图表展现；2、自定义脚本监控扩展AgentZabbix Server与Agent之间监控数据的采集主要是通过Zabbix Server主动向Agent询问某个Key的值，Agent会根据Key去调用相应的函数去获取这个值并返回给Server端。Zabbix 2.4.7的Agent本并没有内置MySQL的监控功能（但是Server端提供了相应的Template配置），所以我们需要使用Zabbix的User Parameters功能，为MySQL添加监控脚本。3、授权mysql登录用户（agent端）mysql> grant usage on *.* to zabbix@localhost identified by '123456'; mysql> flush privileges;4、agent端配置存活检测利用UserParameter参数自定义Agent Key。对于需求一 ，我们采用mysqladmin这个工具来实现，命令如下：# mysqladmin -h 127.0.0.1 -u zabbix -p123456 ping mysqld is alive 如果MySQL状态正常，会显示mysqld is alive，否则会提示连接不上。对于服务器端，mysqld is alive这样的句子不好理解，服务器端最好只接收1和0，1表示服务可用，0表示服务不可用。那么再改进一下这个命令，如下：# mysqladmin -h 127.0.0.1 -u zabbix -p123456 ping |grep -c alive 1 用户名和密码放在命令中对于以后的维护不好，所以我们在/var/lib/zabbix/下创建一个包含MySQL用户名和密码的配置文件“.my.cnf”，如下：user=zabbix host=127.0.0.1 password='123456' 有了这个文件后的命令变更为HOME=/var/lib/zabbix/ mysqladmin ping |grep -c alive 1 做完这一步后需要做的就是，将这个监控命令添加到Zabbix Agent中，并与一个Key对应，这样Zabbox Server就能通过这个Key获取MySQL的状态了。我们使用mysql.ping作为MySQL状态的Key。首先在去除/etc/zabbix/zabbix_agentd.conf中“Include=/etc/zabbix_agentd.d/” 这一行的注释符。其次，在/etc/zabbix/zabbix_agentd.d/目录下创建userparameter_mysql.conf文件。在文件中添加如下命令：UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive使用下面的命令测试是否正常工作。# /usr/sbin/zabbix_agentd -t mysql.ping mysql.ping [t|1]其他性能指标1.添加userparameter_mysqlvim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf ####监控mysql性能的脚本 UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1 #####mysql版本 UserParameter=mysql.version,mysql -V2.check_mysql.sh#!/bin/bash # ------------------------------------------------------------------------------- # FileName: check_mysql.sh # Revision: 1.0 # ------------------------------------------------------------------------------- # Copyright: # License: GPL # 用户名 MYSQL_USER='zabbix' # 密码 MYSQL_PWD='zabbix@123' # 主机地址/IP MYSQL_HOST='ip' # 端口 MYSQL_PORT='3306' # 数据连接 MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}" # 参数是否正确 if [ $# -ne "1" ];then echo "arg error!" fi # 获取数据 case $1 in Uptime) result=`${MYSQL_CONN} status 2>/dev/null |cut -f2 -d":"|cut -f1 -d"T"` echo $result ;; Com_update) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_update"|cut -d"|" -f3` echo $result ;; Slow_queries) result=`${MYSQL_CONN} status 2>/dev/null |cut -f5 -d":"|cut -f1 -d"O"` echo $result ;; Com_select) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_select"|cut -d"|" -f3` echo $result ;; Com_rollback) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_rollback"|cut -d"|" -f3` echo $result ;; Questions) result=`${MYSQL_CONN} status 2>/dev/null |cut -f4 -d":"|cut -f1 -d"S"` echo $result ;; Com_insert) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_insert"|cut -d"|" -f3` echo $result ;; Com_delete) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_delete"|cut -d"|" -f3` echo $result ;; Com_commit) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_commit"|cut -d"|" -f3` echo $result ;; Bytes_sent) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Bytes_sent" |cut -d"|" -f3` echo $result ;; Bytes_received) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Bytes_received" |cut -d"|" -f3` echo $result ;; Com_begin) result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_begin"|cut -d"|" -f3` echo $result ;; *) echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)" ;; esac 3.授权：chmod +x /etc/zabbix/zabbix_agentd.d/check_mysql.sh chown zabbix.zabbix /etc/zabbix/zabbix_agentd.d/check_mysql.sh脚本解释：这个脚本是用来监控MySQL数据库状态的一个Shell脚本。它通过执行一系列命令来获取不同指标的数据，然后根据用户的输入参数返回相应的结果。该脚本首先定义了一些变量，如用户名、密码、主机地址和端口等。然后判断输入参数的个数，如果不等于1，则输出"arg error!"。接下来使用输入参数的值，利用不同的命令获取相应的数据，并将结果打印出来。脚本中给出了以下可用的参数：Uptime：获取MySQL服务器已经运行的时间（秒）Com_update：获取执行UPDATE语句的次数Slow_queries：获取慢查询的数量Com_select：获取执行SELECT语句的次数Com_rollback：获取执行回滚操作的次数Questions：获取处理的查询请求的数量Com_insert：获取执行INSERT语句的次数Com_delete：获取执行DELETE语句的次数Com_commit：获取执行提交操作的次数Bytes_sent：获取发送的字节数Bytes_received：获取接收的字节数Com_begin：获取执行BEGIN语句的次数如果用户提供了以上列表以外的参数，则输出"Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"。该脚本的目的是为了方便监控MySQL数据库的运行状态以及各项性能指标的变化情况。4. zabbix_agent上测试：zabbix_agentd -t mysql.ping5.Zabbix_server测试zabbix_get -s ip -p 10050 -k mysql.ping5、在web端进行配置创建主机 关联模板创建监控项创建图形查看监控图像其他监控项以此配置完成6、zabbix自带mysql监控项version:数据库版本 key_buffer_size:myisam的索引buffer大小 sort_buffer_size:会话的排序空间（每个线程会申请一个） join_buffer_size:这是为链接操作分配的最小缓存大小，这些连接使用普通索引扫描、范围扫描、或者连接不适用索引 max_connections:最大允许同时连接的数量 max_connect_errors：允许一个主机最多的错误链接次数，如果超过了就会拒绝之后链接（默认100）。可以使用flush hosts命令去解除拒绝 open_files_limits:操作系统允许mysql打开的文件数量，可以通过opened_tables状态确定是否需要增大table_open_cache,如果opened_tables比较大且一直还在增大说明需要增大table_open_cache max-heap_tables_size:建立的内存表的最大大小（默认16M）这个参数和tmp_table_size一起限制内部临时表的最大值(取这两个参数的小的一个），如果超过限制，则表会变为innodb或myisam引擎，（5.7.5之前是默认是myisam，5.7.6开始是innodb，可以通过internal_tmp_disk_storage_engine参数调整）。 max_allowed_packet:一个包的最大大小 ##########GET INNODB INFO #INNODB variables innodb_version: innodb_buffer_pool_instances：将innodb缓冲池分为指定的多个（默认为1） innodb_buffer_pool_size:innodb缓冲池大小、5.7.5引入了innodb_buffer_pool_chunk_size, innodb_doublewrite：是否开启doublewrite（默认开启） innodb_read_io_threads:IO读线程的数量 innodb_write_io_threads:IO写线程的数量 ########innodb status innodb_buffer_pool_pages_total:innodb缓冲池页的数量、大小等于innodb_buffer_pool_size/(16*1024) innodb_buffer_pool_pages_data:innodb缓冲池中包含数据的页的数量 ########## GET MYSQL HITRATE 1、查询缓存命中率 如果Qcache_hits+Com_select<>0则为 Qcache_hits/（Qcache_hits+Com_select），否则为0 2、线程缓存命中率 如果Connections<>0,则为1-Threads_created/Connections，否则为0 3、myisam键缓存命中率 如果Key_read_requests<>0,则为1-Key_reads/Key_read_requests，否则为0 4、myisam键缓存写命中率 如果Key_write_requests<>0,则为1-Key_writes/Key_write_requests，否则为0 5、键块使用率 如果Key_blocks_used+Key_blocks_unused<>0，则Key_blocks_used/（Key_blocks_used+Key_blocks_unused），否则为0 6、创建磁盘存储的临时表比率 如果Created_tmp_disk_tables+Created_tmp_tables<>0,则Created_tmp_disk_tables/（Created_tmp_disk_tables+Created_tmp_tables），否则为0 7、连接使用率 如果max_connections<>0，则threads_connected/max_connections，否则为0 8、打开文件比率 如果open_files_limit<>0，则open_files/open_files_limit，否则为0 9、表缓存使用率 如果table_open_cache<>0，则open_tables/table_open_cache，否则为0十一、 zabbix其他常用自定义监控项redis相关的自定义项vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/redis.conf UserParameter=Redis.Status,/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG UserParameter=Redis_conn[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "connected_clients" | awk -F':' '{print $2}' UserParameter=Redis_rss_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_rss" | awk -F':' '{print $2}' UserParameter=Redis_lua_mem[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_memory_lua" | awk -F':' '{print $2}' UserParameter=Redis_cpu_sys[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys" | awk -F':' '{print $2}' UserParameter=Redis_cpu_user[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user" | awk -F':' '{print $2}' UserParameter=Redis_cpu_sys_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}' UserParameter=Redis_cpu_user_cline[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "used_cpu_user_children" | awk -F':' '{print $2}' UserParameter=Redis_keys_num[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep -w "$$1" | grep -w "keys" | grep db$3 | awk -F'=' '{print $2}' | awk -F',' '{print $1}' UserParameter=Redis_loading[*],/usr/local/redis/bin/redis-cli -h $1 -p $2 info | grep loading | awk -F':' '{print $$2}' Redis.Status --检测Redis运行状态， 返回整数 Redis_conn --检测Redis成功连接数，返回整数 Redis_rss_mem --检测Redis系统分配内存，返回整数 Redis_lua_mem --检测Redis引擎消耗内存，返回整数 Redis_cpu_sys --检测Redis主程序核心CPU消耗率，返回整数 Redis_cpu_user --检测Redis主程序用户CPU消耗率，返回整数 Redis_cpu_sys_cline --检测Redis后台核心CPU消耗率，返回整数 Redis_cpu_user_cline --检测Redis后台用户CPU消耗率，返回整数 Redis_keys_num --检测库键值数，返回整数 Redis_loding --检测Redis持久化文件状态，返回整数nginx相关的自定义项vim /etc/nginx/conf.d/default.conf location /nginx-status { stub_status on; access_log off; allow 127.0.0.1; deny all; } vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/nginx.conf UserParameter=Nginx.active,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/Active/ {print $NF}' UserParameter=Nginx.read,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Reading' | cut -d" " -f2 UserParameter=Nginx.wrie,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Writing' | cut -d" " -f4 UserParameter=Nginx.wait,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | grep 'Waiting' | cut -d" " -f6 UserParameter=Nginx.accepted,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $1}' UserParameter=Nginx.handled,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $2}' UserParameter=Nginx.requests,/usr/bin/curl -s "http://127.0.0.1:80/nginx-status" | awk '/^[ \t]+[0-9]+[ \t]+[0-9]+[ \t]+[0-9]+/ {print $3}'TCP相关的自定义项vim /usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh #!/bin/bash function ESTAB { /usr/sbin/ss -ant |awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}' } function TIMEWAIT { /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}' } function LISTEN { /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}' } $1 vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/cattcp.conf UserParameter=tcp[*],/usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh $1 tcp[TIMEWAIT] --检测TCP的驻留数，返回整数 tcp[ESTAB] --检测tcp的连接数、返回整数 tcp[LISTEN] --检测TCP的监听数，返回整数系统监控常用自带监控项agent.ping 检测客户端可达性、返回nothing表示不可达。1表示可达 system.cpu.load --检测cpu负载。返回浮点数 system.cpu.util -- 检测cpu使用率。返回浮点数 vfs.dev.read -- 检测硬盘读取数据，返回是sps.ops.bps浮点类型，需要定义1024倍 vfs.dev.write -- 检测硬盘写入数据。返回是sps.ops.bps浮点类型，需要定义1024倍 net.if.out[br0] --检测网卡流速、流出方向，时间间隔为60S net-if-in[br0] --检测网卡流速，流入方向（单位：字节） 时间间隔60S proc.num[] 目前系统中的进程总数，时间间隔60s proc.num[,,run] 目前正在运行的进程总数，时间间隔60S ###处理器信息 通过zabbix_get 获取负载值 合理的控制用户态、系统态、IO等待时间剋保证进程高效率的运行 系统态运行时间较高说明进程进行系统调用的次数比较多，一般的程序如果系统态运行时间占用过高就需要优化程序，减少系统调用 io等待时间过高则表明硬盘的io性能差，如果是读写文件比较频繁、读写效率要求比较高，可以考虑更换硬盘，或者使用多磁盘做raid的方案 system.cpu.swtiches --cpu的进程上下文切换，单位sps，表示每秒采样次数，api中参数history需指定为3 system.cpu.intr --cpu中断数量、api中参数history需指定为3 system.cpu.load[percpu,avg1] --cpu每分钟的负载值，按照核数做平均值(Processor load (1 min average per core))，api中参数history需指定为0 system.cpu.load[percpu,avg5] --cpu每5分钟的负载值，按照核数做平均值(Processor load (5 min average per core))，api中参数history需指定为0 system.cpu.load[percpu,avg15] --cpu每5分钟的负载值，按照核数做平均值(Processor load (15 min average per core))，api中参数history需指定为0系统监控常用自定义监控项####内存相关 vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/catcarm.conf UserParameter=ram.info[*],/bin/cat /proc/meminfo |awk '/^$1:{print $2}' ram.info[Cached] --检测内存的缓存使用量、返回整数，需要定义1024倍 ram.info[MemFree] --检测内存的空余量，返回整数，需要定义1024倍 ram.info[Buffers] --检测内存的使用量，返回整数，需要定义1024倍 ####TCP相关的自定义项 vim /usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh #!/bin/bash function ESTAB { /usr/sbin/ss -ant |awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'ESTAB' | awk '{print $2}' } function TIMEWAIT { /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'TIME-WAIT' | awk '{print $2}' } function LISTEN { /usr/sbin/ss -ant | awk '{++s[$1]} END {for(k in s) print k,s[k]}' | grep 'LISTEN' | awk '{print $2}' } $1 vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/cattcp.conf UserParameter=tcp[*],/usr/local/zabbix/share/zabbix/alertscripts/tcp_connection.sh $1 tcp[TIMEWAIT] --检测TCP的驻留数，返回整数 tcp[ESTAB] --检测tcp的连接数、返回整数 tcp[LISTEN] --检测TCP的监听数，返回整数十二、错误日志造成返回数据异常如下，这里正确返回0或者1，但是如果有异常数据，zabbix返回的是报错日志再加上我们的报错信息[root@master /]# zabbix_get -s 192.168.136.173 -p 10050 -k Redis.Status 1 [root@master /]# zabbix_get -s 192.168.136.173 -p 10050 -k Redis.Status Could not connect to Redis at 127.0.0.1:6379: Connection refused 0我们先来看看我们的keyUserParameter=Redis.Status,/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 ping |grep -c PONG我们把它改成UserParameter=Redis.Status,/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 ping 2> /dev/null |grep -c PONG即可正确进行输出数值。[root@master /]# zabbix_get -s 192.168.136.173 -p 10050 -k Redis.Status 1 [root@master /]# zabbix_get -s 192.168.136.173 -p 10050 -k Redis.Status 02>/dev/null 是将标准错误重定向到 /dev/null，这意味着任何错误信息都会被丢弃，不会显示在终端上。这样就能避免在执行命令时产生错误信息的输出。数字2代表标准错误流（standard error stream）。在Linux系统中，每个命令执行时都会产生两个输出流，分别是标准输出（standard output）和标准错误（standard error）。标准输出（stdout）用于正常的命令输出，而标准错误（stderr）用于错误和警告信息的输出。默认情况下，这两个流都会显示在终端上。在命令行中，使用>符号来重定向输出，其中1>表示将结果重定向到标准输出，而2>表示将结果重定向到标准错误。在命令中，2>/dev/null这部分指定了将标准错误重定向到/dev/null。/dev/null是一个特殊的设备文件，它会丢弃所有写入的数据并返回一个空值。因此，使用2>/dev/null可以将标准错误丢弃，不在终端上显示。这样就可以避免在执行命令时，标准错误的输出干扰正常结果的显示。
一、监控介绍你用过哪些监控软件？zabbix 和 nagios、cacti、ganglia 有什么区别？zabbix 有那些好处？zabbix 的监控流程是什么？zabbix 常见监控项有那些？1、CactiCacti 是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具,Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时,轮询的结果就不能即时的反应设备的状态了。Cacti 监控关注的是对数据的展示,却不关注数据异常后的反馈。如果凌晨 3 点的时候设备的某个数据出现异常,除非监控人员在屏幕前发现这个异常变化,否则是没有任何报警机制能够让我们道出现了异常。2、NagiosNagios 是一款开源的免费网络监控报警服务,能有效监控 Windows、Linux 和 Unix 的主机状态,交换机、路由器和防火墙等网络设置,打印机、网络投影、网络摄像等设备。在系统或服务状态异常时发出邮件或短信报警第一时间通知运维人员,在状态恢复后发出正常的邮件或短信通知。Nagios 有完善的插件功能,可以方便的根据应用服务扩展功能。Nagios 已经可以支持由数万台服务器或上千台网络设备组成的云技术平台的监控,它可以充分发挥自动化运维技术特点在设备和人力资源减少成本。只是 Nagios 无法将多个相同应用集群的数据集合起来,也不能监控到集群中特殊节点的迁移和恢复。3、GangliaGanglia 是 UC Berkeley 发起的一个开源集群监视项目,设计用于测量数以千计的节点。Ganglia 的核心包含 gmond、gmetad 以及一个 Web 前端。主要是用来监控系统性能,如:CPU 、内存、硬盘利用率, I/O 负载、网络流量情况等,通过曲线很容易见到每个节点的工作状态,对合理调整、分配系统资源,提高系统整体 性能起到重要作用,目前是监控HADOOP 的官方推荐服务。4、ZabbixZabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。Zabbix 是由 Alexei Vladishev 创建，目前由 Zabbix SIA 在持续开发和支持。Zabbix 是一个企业级的分布式开源监控方案。Zabbix 是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix 使用灵活的通知机制，允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据，Zabbix提供了出色的报告和数据可视化功能。这些功能使得Zabbix成为容量规划的理想方案。Zabbix 支持主动轮询和被动捕获。Zabbix所有的报告、统计信息和配置参数都可以通过基于Web的前端页面进行访问。基于Web的前端页面可以确保您从任何方面评估您的网络状态和服务器的健康性。Zabbix是免费的。Zabbix是根据GPL通用公共许可证第2版编写和发行的。这意味着它的源代码都是免费发行的，可供公众任意使用, 商业支持 由Zabbix公司提供。二、监控区别nagios 图形不是特别好，也可以安装图形插件，但是也不怎么好看nagios 一般情况下如果需要图形可以和 cacti 配合使用cacti 的监控是轮询监控,效率低，图形相对 nagios 比较好看zabbix 和 nagios 因为是并发监控，对 cpu 的要求更高zabbix 在性能和功能上都强大很多zabbix 的图形相当漂亮支持多种监控方式 zabbix-agent snmp 等等支持分布式监控,能监控的 agent 非常多zabbix 有图形的 web 配置界面，配置简洁zabbix 支持自动发现功能三、Zabbix 监控介绍1、Zabbix 监控架构3、Zabbix 优点开源,无软件成本投入Server 对设备性能要求低支持设备多,自带多种监控模板支持分布式集中管理,有自动发现功能,可以实现自动化监控开放式接口,扩展性强,插件编写容易当监控的 item 比较多服务器队列比较大时可以采用主动状态,被监控客户端主动 从server 端去下载需要监控的 item 然后取数据上传到 server 端。 这种方式对服务器的负载比较小。Api 的支持,方便与其他系统结合4、Zabbix 缺点需在被监控主机上安装 agent,所有数据都存在数据库里, 产生的数据据很大,瓶颈主要在数据库。项目批量修改不方便社区虽然成熟，但是中文资料相对较少，服务支持有限；入门容易，能实现基础的监控，但是深层次需求需要非常熟悉Zabbix并进行大量的二次定制开发难度较大系统级别报警设置相对比较多，如果不筛选的话报警邮件会很多；并且自定义的项目报警需要自己设置，过程比较繁琐；缺少数据汇总功能，如无法查看一组服务器平均值，需进行二次开发；5、Zabbix 监控系统监控对象数据库： MySQL,MariaDB,Oracle,SQL Server agent应用软件：Nginx,Apache,PHP,Tomcat agent-------------------------------------------------------------------------------------------------------------------------------集群： LVS,Keepalived,HAproxy,RHCS,F5 agent虚拟化： VMware,KVM,XEN ,docker,k8s agent操作系统：Linux,Unix,Windows性能参数 agent-------------------------------------------------------------------------------------------------------------------------------硬件： 服务器，存储，网络设备 IPMI网络： 网络环境（内网环境，外网环境） SNMP-------------------------------------------------------------------------------------------------------------------------------6、Zabbix监控方式1、被动模式被动检测：相对于agent而言；agent, server向agent请求获取配置的各监控项相关的数据，agent接收请求、获取数据并响应给server；2、主动模式主动检测：相对于agent而言；agent(active),agent向server请求与自己相关监控项配置，主动地将server配置的监控项相关的数据发送给server；主动监控能极大节约监控server 的资源。7、Zabbix 架构Zabbix由几个主要的软件组件构成，这些组件的功能如下。1、Zabbix ServerZabbix server 是 agent 程序报告系统可用性、系统完整性和统计数据的核心组件，是所有配置信息、统计信息和操作数据的核心存储器。2、Zabbix 数据库存储所有配置信息和 Zabbix 收集到的数据都被存储在数据库中。3、Zabbix Web 界面为了从任何地方和任何平台都可以轻松的访问Zabbix, 我们提供基于Web的Zabbix界面。该界面是Zabbix Server的一部分，通常(但不一定)跟Zabbix Server运行在同一台物理机器上。如果使用 SQLite,Zabbix Web 界面必须要跟Zabbix Server运行在同一台物理机器上。4、Zabbix Proxy 代理服务器Zabbix proxy 可以替Zabbix Server收集性能和可用性数据。Proxy代理服务器是Zabbix软件可选择部署的一部分；当然，Proxy代理服务器可以帮助单台Zabbix Server分担负载压力。5、Zabbix Agent 监控代理Zabbix agents监控代理 部署在监控目标上，能够主动监控本地资源和应用程序，并将收集到的数据报告给Zabbix Server。6、Zabbix 数据流监控方面，为了创建一个监控项(item)用于采集数据，必须先创建一个主机（host）。告警方面，在监控项里创建触发器（trigger），通过触发器（trigger）来触发告警动作（action）。 因此，如果你想收到Server XCPU负载过高的告警，必须满足1、为Server X创建一个host并关联一个用于对CPU进行监控的监控项（Item）。2、创建一个Trigger，设置成当CPU负载过高时会触发3、Trigger被触发，发送告警邮件虽然看起来有很多步骤，但是使用模板的话操作起来其实很简单，Zabbix 这样的设计使得配置机制非常灵活易用。8、Zabbix 常用术语的含义1、主机 (host)一台你想监控的网络设备，用IP或域名表示2、主机组 (host group)主机的逻辑组；它包含主机和模板。一个主机组里的主机和模板之间并没有任何直接的关联。通常在给不同用户组的主机分配权限时候使用主机组。3、监控项 (item)你想要接收的主机的特定数据，一个度量数据。4、触发器 (trigger)一个被用于定义问题阈值和“评估”监控项接收到的数据的逻辑表达式当接收到的数据高于阈值时，触发器从“OK”变成“Problem”状态。当接收到的数据低于阈值时，触发器保留/返回一个“OK”的状态。5、事件 (event)单次发生的需要注意的事情，例如触发器状态改变或发现有监控代理自动注册6、异常 (problem)一个处在“异常”状态的触发器7、动作 (action)一个对事件做出反应的预定义的操作。一个动作由操作(例如发出通知)和条件(当时操作正在发生)组成8、升级 (escalation)一个在动作内执行操作的自定义场景; 发送通知/执行远程命令的序列9、媒介 (media)发送告警通知的手段；告警通知的途径10、通知 (notification)利用已选择的媒体途径把跟事件相关的信息发送给用户11、远程命令 (remote command)一个预定义好的，满足一些条件的情况下，可以在被监控主机上自动执行的命令12、模版 (template)一组可以被应用到一个或多个主机上的实体（监控项，触发器，图形，聚合图形，应用，LLD，Web场景）的集合模版的任务就是加快对主机监控任务的实施；也可以使监控任务的批量修改更简单。模版是直接关联到每台单独的主机上。13、应用 (application)一组监控项组成的逻辑分组14、web 场景 (web scenario)利用一个或多个HTTP请求来检查网站的可用性15、前端 (frontend)Zabbix提供的web界面16、Zabbix APIZabbix API允许你使用JSON RPC协议 (是一个无状态且轻量级的远程过程调用（RPC）传送协议，其传递内容透过 JSON 为主) 来创建、更新和获取Zabbix对象（如主机、监控项、图形和其他）信息或者执行任何其他的自定义的任务17、Zabbix serverZabbix软件实现监控的核心程序，主要功能是与Zabbix proxies和Agents进行交互、触发器计算、发送告警通知；并将数据集中保存等18、Zabbix agent一个部署在监控对象上的，能够主动监控本地资源和应用的程序Zabbix agent 部署在监控的目标上，主动监测本地的资源和应用(硬件驱动，内存，处理器统计等)。Zabbix agent收集本地的操作信息并将数据报告给Zabbix server用于进一步处理。一旦出现异常 (比如硬盘空间已满或者有崩溃的服务进程), Zabbix server会主动警告管理员指定机器上的异常。. Zabbix agents 的极端高效缘于它可以利用本地系统调用来完成统计数据的收集。19、被动（passive）和主动（active）检查Zabbix agents 可以执行被动和主动两种检查方式1、被动检查（passive check） 模式中 agent 应答数据请求，Zabbix server（或者proxy）询问agent数据,如CPU 的负载情况，然后 Zabbix agent 回送结果。2、主动检查（Active checks） 处理过程将相对复杂。 Agent 必须首先从 Zabbix sever 索取监控项列表以进行独立处理，然后周期性地发送新的值给server。执行被动或主动检查是通过选择相应的监测项目类型来配置的。item type. Zabbix agent 处理监控项类型有 Zabbix agent 和 Zabbix agent (active)。20、Zabbix proxy--一个帮助 Zabbix Server 收集数据，分担Zabbix Server的负载的程序Zabbix Proxy 是一个可以从一个或多个受监控设备收集监控数据，并将信息发送到Zabbix sever的进程，基本上是代表 sever工作的。 所有收集的数据都在本地进行缓存，然后传送到 proxy 所属的 Zabbix sever。部署 Proxy 是可选的，但是可能非常有益于分散单个 Zabbix sever 的负载。 如果只有 proxy 收集数据，sever上的进程就会减少 CPU 消耗和磁盘 I / O 负载。Zabbix proxy 是完成远程区域、分支机构、没有本地管理员的网络的集中监控的理想解决方案。Zabbix proxy需要使用独立的数据库。四、Zabbix 监控系统部署1、实验准备 centos7.5 系统服务器3台、 一台作为监控服务器， 两台台作为被监控节点， 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信。1、所有机器关闭防火墙和 selinux[root@fivk.cn ~]# setenforce 0 （修改配置文件关闭） [root@fivk.cn ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config [root@fivk.cn ~]# systemctl stop firewalld.service2、实验服务器配置2、Zabbix的安装1、更新 yum 仓库1、下载 yum 仓库[root@fivk.cn ~]# yum -y install wget [root@fivk.cn ~]# wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm # 安装zabbix源（官方） [root@fivk.cn ~]# rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm2、安装 yum 仓库[root@fivk.cn ~]# rpm -ivh zabbix-release-4.2-1.el7.noarch.rpm3、更新 yum 仓库[root@fivk.cn ~]# yum repolist Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile zabbix-non-supported 4/4 repo id repo name status base base 9,363 epel epel 11,349 zabbix/x86_64 Zabbix Official Repository - x86_64 80 zabbix-non-supported/x86_64 Zabbix Official Repository non-supported - 4 repolist: 20,7964、安装 Zabbix[root@fivk.cn~]# yum -y install epel-release.noarch [root@fivk.cn~]# yum -y install zabbix-agent zabbix-get zabbix-sender zabbix-server-mysql zabbix-web zabbix-web-mysql 或者（官方） [root@fivk.cn~]# yum-config-manager --enable rhel-7-server-optional-rpms2）安装设置数据库：1、创建 mariadb.repo[root@fivk.cn ~]# vim /etc/yum.repos.d/mariadb.repo 写入以下内容： [mariadb] name = MariaDB baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64 gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=12、yum 安装最新版本 mariadb[root@fivk.cn ~]# yum install -y MariaDB-server MariaDB-client3、修改配置文件[root@fivk.cn ~]# vim /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve = ON # 跳过主机名解析 innodb_file_per_table = ON # 开启独立表空间 innodb_buffer_pool_size = 256M # 缓存池大小 max_connections = 2000 # 最大连接数 log-bin = master-log # 开启二进制日志4、重启数据库服务[root@fivk.cn~]# systemctl restart mariadb [root@fivk.cn~]# mysql_secure_installation # 初始化mariadb5、创建数据库并授权账号MariaDB [(none)]> create database zabbix character set 'utf8'; # 创建zabbix数据库 MariaDB [(none)]> grant all on zabbix.* to 'zbxuser'@'192.168.37.%' identified by 'keer'; # 注意授权网段 MariaDB [(none)]> flush privileges; # 刷新授权6、导入 Zabbix 服务表查看 zabbix-server-mysql 这个包提供了什么[root@fivk.cn~]# rpm -ql zabbix-server-mysql /etc/logrotate.d/zabbix-server /etc/zabbix/zabbix_server.conf /usr/lib/systemd/system/zabbix-server.service /usr/lib/tmpfiles.d/zabbix-server.conf /usr/lib/zabbix/alertscripts /usr/lib/zabbix/externalscripts /usr/sbin/zabbix_server_mysql /usr/share/doc/zabbix-server-mysql-3.2.6 /usr/share/doc/zabbix-server-mysql-3.2.6/AUTHORS /usr/share/doc/zabbix-server-mysql-3.2.6/COPYING /usr/share/doc/zabbix-server-mysql-3.2.6/ChangeLog /usr/share/doc/zabbix-server-mysql-3.2.6/NEWS /usr/share/doc/zabbix-server-mysql-3.2.6/README /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz # 生成表的各种脚本 /usr/share/man/man8/zabbix_server.8.gz /var/log/zabbix /var/run/zabbix使用 create.sql.gz 生成所需要的表[root@fivk.cn~]# gzip -d create.sql.gz [root@fivk.cn~]# head create.sql #查看一下表头 CREATE TABLE `users` ( `userid` bigint unsigned NOT NULL, `alias` varchar(100) DEFAULT '' NOT NULL, `name` varchar(100) DEFAULT '' NOT NULL, `surname` varchar(100) DEFAULT '' NOT NULL, `passwd` char(32) DEFAULT '' NOT NULL, `url` varchar(255) DEFAULT '' NOT NULL, `autologin` integer DEFAULT '0' NOT NULL, `autologout` integer DEFAULT '900' NOT NULL, `lang` varchar(5) DEFAULT 'en_GB' NOT NULL,查看表头发现没有创建数据库的命令，这正是手动创建数据库的原因。把所需表导入数据库即可：[root@fivk.cn ~]# mysql -uzbxuser -h192.168.37.111 -p zabbix < create.sql Enter password:导入以后，我们进去数据库查看一下：[root@fivk.cn ~]# mysql -uzbxuser -h192.168.37.111 -p Enter password: MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | zabbix | +--------------------+ MariaDB [(none)]> use zabbix; Database changed MariaDB [zabbix]> show tables; +----------------------------+ | Tables_in_zabbix | +----------------------------+ | acknowledges | | actions | | alerts | …… | usrgrp | | valuemaps | +----------------------------+ 127 rows in set (0.00 sec)可以看出来，我们的数据已经导入成功了。3、配置 server 端数据库准备好了以后，我们要去修改 server 端的配置文件。[root@fivk.cn ~]# cd /etc/zabbix/ [root@fivk.cn zabbix]# ls web zabbix_agentd.conf zabbix_agentd.d zabbix_server.conf #为了方便我们以后恢复，我们把配置文件备份一下 [root@fivk.cn zabbix]# cp zabbix_server.conf{,.bak} [root@fivk.cn zabbix]# vim zabbix_server.conf ListenPort=10051 # 默认监听端口 SourceIP=192.168.37.111 # 发采样数据请求的 IP1、Zabbix 日志默认用文件记录，也可以发送给我们的 rsyslog 日志记录系统，如果我们选择默认，则日志存放在 LogFile=/var/log/zabbix/zabbix_server.log 中，也可以自己设置。2、日志的滚动默认值为1，表示滚动。我们设为0则表示不滚动。当数据特别多的时候，我们也可以设置成为1，然后在 Maximum size of log file in MB 设置当数据文件最大到多少时会自动滚动。3、日志的级别一共有6个级别。我们可以根据自己的需要来设置级别。其中0表示输出最少的信息，5表示输出最详细的信息，默认值为3，设置为3的话就表示，0、1、2、3四个级别都显示。考虑到生产系统中的压力时，这里的信息，如果没有必要的话，越简单越好，只要在出错的时候，我们可以依据其进行排错即可。4、数据库相关的设置 DBHost=192.168.37.111 #数据库对外的主机 DBName=zabbix #数据库名称 DBUser=zbxuser #数据库用户 DBPassword=keer #数据库密码 DBPort=3306 #数据库启动端口补充：1、使用 grep -i "^####" zabbix_server.conf 来查看配置文件中有哪些大段2、使用 grep -i "^###" zabbix_server.conf 来查看配置文件中每一段中的配置项有哪些5、启动服务[root@server zabbix]# systemctl start zabbix-server.service6、确认服务端口开启[root@server zabbix]# ss -nutl |grep 10051 tcp LISTEN 0 128 *:10051 *:* tcp LISTEN 0 128 :::10051 :::* 4、配置 web GUI 1、查找 web GUI 的配置文件[root@fivk.cn ~]# rpm -ql zabbix-web | less /etc/httpd/conf.d/zabbix.conf /etc/zabbix/web /etc/zabbix/web/maintenance.inc.php /etc/zabbix/web/zabbix.conf.php /usr/share/doc/zabbix-web-3.2.6 /usr/share/doc/zabbix-web-3.2.6/AUTHORS /usr/share/doc/zabbix-web-3.2.6/COPYING /usr/share/doc/zabbix-web-3.2.6/ChangeLog /usr/share/doc/zabbix-web-3.2.6/NEWS /usr/share/doc/zabbix-web-3.2.6/README ……2、编辑配置文件/etc/httpd/conf.d/zabbix.conf 文件，这个配置文件就是做映射的文件Alias /zabbix /usr/share/zabbix # 访问的时候要在主机后加上/zabbix来访问服务注意： 时区是一定要设置的，这里被注释掉是因为，在 php 的配置文件中设置时区，如果在php配置文件中设置时区，则对所有的 php 服务均有效，如果在 zabbix.conf 中设置时区，则仅对zabbix服务有效。所以，在 php 配置文件中设置时区：[root@fivk.cn ~]# vim /etc/php.ini [Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Shanghai3、启动 httpd 服务[root@fivk.cn ~]# systemctl enable httpd [root@fivk.cn ~]# systemctl start httpd5、浏览器访问并进行初始化设置浏览器访问http://192.168.37.111/zabbix，第一次访问时需要进行一些初始化的设置，按照提示操作：点击Finish以后，跳转到登录页面，使用账号密码登录即可：默认用户名为：Admin ，密码为：zabbix ，登录后进入仪表盘：6、配置 agent 端在被监控的主机安装好agent，设置好 server，并添加到 server 端，将其纳入监控系统中。1、安装 zabbix 安装源[root@node1 ~]# wget https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm [root@node1 ~]# rpm -ivh zabbix-release-4.2-1.el7.noarch.rpm [root@node1 ~]# yum -y install epel-release.noarch [root@node1 ~]# yum install zabbix-agent zabbix-sender -y2、修改配置文件1、确认配置文件[root@node1 zabbix]# rpm -ql zabbix-agent /etc/logrotate.d/zabbix-agent /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.d /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf /usr/lib/systemd/system/zabbix-agent.service /usr/lib/tmpfiles.d/zabbix-agent.conf /usr/sbin/zabbix_agentd /usr/share/doc/zabbix-agent-3.4.4 /usr/share/doc/zabbix-agent-3.4.4/AUTHORS /usr/share/doc/zabbix-agent-3.4.4/COPYING /usr/share/doc/zabbix-agent-3.4.4/ChangeLog /usr/share/doc/zabbix-agent-3.4.4/NEWS /usr/share/doc/zabbix-agent-3.4.4/README /usr/share/man/man8/zabbix_agentd.8.gz /var/log/zabbix /var/run/zabbix2、编辑配置文件对配置文件做一个备份，然后修改配置文件[root@node1 ~]# cd /etc/zabbix/ [root@node1 ~]# cd /etc/zabbix/ [root@node1 zabbix]# ls zabbix_agentd.conf zabbix_agentd.d [root@node1 zabbix]# cp zabbix_agentd.conf{,.bak} [root@node1 zabbix]# vim zabbix_agentd.conf重点需要修改 GENERAL PARAMETERS 段：是否允许别人执行远程操作命令，默认是禁用的，打开的话会有安全风险。Server=192.168.37.111 # 指明服务器是谁的 ListenPort=10050 # 自己监听的端口 ListenIP=0.0.0.0 # 自己监听的地址，0.0.0.0表示本机所有地址 StartAgents=3 # 优化时使用的 ServerActive=192.168.37.111 # 主动监控时的服务器 Hostname=node1.keer.com # 自己能被server端识别的名称启动服务[root@node1 zabbix]# systemctl start zabbix-agent.service查看端口是否已开启[root@node1 zabbix]# ss -ntul |grep 10050 tcp LISTEN 0 128 *:10050 *:* 已经开启成功就可以去 server 端添加主机了，其他主机进行同样的操作，唯一不同的就是配置文件中的 Hostname 要设为对应主机名7、监控过程详解1、修改密码及中文版按如上操作即可，选择中文以后，点击下面的update即可更新成功为了安全起见修改密码修改完成后同样点击更新即可。2、创建主机及主机群组 1、定义一个主机群组 2、添加主机当然，上面有很多选择卡，有一个加密：设置完成后，点击添加。添加的主机已经出现在列表中同样的把node2节点添加进来：3、监控项 (items)1、 介绍点击 node1 的监控项，即可创建监控项，首先，创建三个应用集：应用集一般配合监控项使用，是多个同类型的监控项的分类目录定义监控项任何一个被监控项，如果想要能够被监控，一定要在 zabbix-server 端定义了能够连接至 zabbix-agent 端，并且能够通过命令获取信息。或者在 agent 端定义了能够让server 端获取命令。一般都是内建的命令，都对应的有其名字，被我们称之为 key。关于key值，可以直接在网页上设置(服务器自动执行)，也可以使用命令行命令(手动执行)来获取：[root@fivk.cn ~]# zabbix_get -s 192.168.37.122 -p 10050 -k "system.cpu.intr"在 agent 端，也可以使用命令来查看 intr 的速率变化：继续配置监控项：2、定义一个不带参数的监控项设置完以后，点击更新，即可加入，并会自动跳转至如下页面定义完成，回到所有主机，等待5秒，可以看到，node1节点后面的选项已经变成绿色：回到仪表盘，可以看到，监控项有一个处于启用状态：点击最新数据，选择要查看主机，应用一下，就可以看到数据状态：可以看到，还有一个图形页面，点进去则可以看图形的分布：事实上，需要关注的指标有很多种，一一添加进来即可。以上定义的监控项是很简单的，指定一个key即可，但是有些监控项是带有参数的，这样一来，监控项就有更多的灵活性。接下来，简单说明需要带参数的监控项：3、定义一个带参数的监控项[] 就是需要参数的意思，里面的值即为参数<> 为不可省略的。我们就以这个例子来说明：if 表示是接口名； 表示是那种模式，包括但不限于：packets(包)、bytes(字节)、errors(错误)、dropped(丢包)、overuns等等（上述内容通过 ifconfig 查看） 设置一个监控值：通过命令行来查看：[root@fivk.cn~]# zabbix_get -s 192.168.37.122 -p 10050 -k "net.if.in[ens33,packets]"查看网页的显示情况：检测中 ---> 最新数据 ---> Network Interface Stats(图形)中文乱码解决方法Zabbix监控页面中文显示异常，具体为显示为方块，如图所示。1、查找zabbix安装目找到字体具体位置。#查找zabbix安装位置 [root@fivk.cn~]# whereis zabbix zabbix: /usr/lib/zabbix /etc/zabbix /usr/share/zabbix [root@fivk.cn~]# ls /usr/share/zabbix/ actionconf.php app charts.php hostinventories.php items.php report2.php styles adm.gui.php applications.php conf host_prototypes.php js report4.php sysmap.php adm.housekeeper.php audio conf.import.php host_screen.php jsLoader.php robots.txt sysmaps.php adm.iconmapping.php auditacts.php correlation.php hosts.php jsrpc.php screenconf.php templates.php adm.images.php auditlogs.php discoveryconf.php httpconf.php latest.php screenedit.php toptriggers.php adm.macros.php browserwarning.php disc_prototypes.php httpdetails.php local screen.import.php tr_events.php adm.other.php chart2.php favicon.ico image.php locale screens.php trigger_prototypes.php adm.regexps.php chart3.php fonts images maintenance.php search.php triggers.php adm.triggerdisplayoptions.php chart4.php graphs.php img map.import.php services.php usergrps.php adm.triggerseverities.php chart5.php history.php imgstore.php map.php setup.php users.php adm.valuemapping.php chart6.php host_discovery.php include overview.php slideconf.php zabbix.php adm.workingtime.php chart7.php hostgroups.php index_http.php profile.php slides.php api_jsonrpc.php chart.php hostinventoriesoverview.php index.php queue.php srv_status.php #字体文件位置 [root@fivk.cn~]# ls /usr/share/zabbix/fonts/ graphfont.ttf [root@fivk.cn~]# cd /usr/share/zabbix/fonts/ [root@server fonts]# pwd /usr/share/zabbix/fonts [root@server fonts]# ls -l 总用量 0 lrwxrwxrwx. 1 root root 33 3月 25 15:24 graphfont.ttf -> /etc/alternatives/zabbix-web-font采用 winscp/xftp等工具将 Windows 中文字体上传到 /usr/share/zabbix/fonts/ 文件夹。本文中文字体为宋体。字体权限修改后截图如下所示：切换至/etc/alternatives 目录查看软链接。删除旧软链接并新建。也可以修改为其他中文字体，例如仿宋或者微软雅黑。# 删除旧软链接 [root@fivk.cn fonts]# rm -f /etc/alternatives/zabbix-web-font # 新建软链接 [root@fivk.cn fonts]# ln -s /usr/share/zabbix/fonts/simsun.ttc /etc/alternatives/zabbix-web-font刷新浏览器页面即可，如果显示异常，请重新启动 zabbix-server 服务。[root@fivk.cn fonts]# systemctl restart zabbix-server正常显示字体如图所示。4、快速定义类似指标要定义一个类似的指标，直接选择克隆，然后简单的修改参数即可。就以定义的 net.if.in[ens33,packets] 为例，如果我们想要在定义一个out的进行如下操作即可：如果要以字节为单位需要定义的话，进行同样的操作：如果有需要的话也可以把 byte 再克隆成out。可以看一下，已经定义的指标：进入检测中 ---> 最新数据，可以看到，我们定义的监控项都已经有值了：5、删除监控项如果有一个监控项，用不上了，就可以删除掉。但是如果你直接删除的话，默认数据是会留下的，所以要先清除数据，然后再删除，具体操作步骤如下：6、监控项存储的值对于监控项存储的值，老一点的版本只有以下三种方式：As is： 不对数据做任何处理(存储的为原始值)Delta：（simple change)(变化)，本次采样减去前一次采样的值的结果Delta：（speed per second)(速率)，本次采样减去前一次采样的值，再除以经过的时长；在3.4版本以后有了更多的表现形式：4、触发器（trigger）1、简介当采集的值定义完了以后，就可以来定义触发器了。触发器的定义是：界定某特定的item采集到的数据的非合理区间或非合理状态。通常为逻辑表达式。逻辑表达式（阈值）：通常用于定义数据的不合理区间，其结果如下：OK (不符合条件)：正常状态 --> 较老的zabbix版本，其为FALSE；PROBLEM(符合条件)：非正常状态 --> 较老的zabbix版本，其为TRUE；评定采样数值是否为合理区间的比较稳妥的方法是——根据最后N次的平均值来判定结果；这个最后N次通常有两种定义方式：最近N分钟所得结果的平均值最近N次所得结果的平均值触发器存在可调用的函数：nodata() #是否采集到数据，采集不到则为异常last() #最近几次date() #时间，返回当前的时间，格式YYYYMMDDtime() #返回当前的时间，HHMMSS格式的当前时间。now() #返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数dayofmonth() #返回当前是本月的第几天注：能用数值保存的就不要使用字符串2、触发器表达式基本的触发器表达式格式如下所示{<server>:<key>.<function>(<parameter>)}<operator><constant>server：主机名称；key：主机上关系的相应监控项的key；function：评估采集到的数据是否在合理范围内时所使用的函数，其评估过程可以根据采取的数据、当前时间及其它因素进行；目前触发器所支持的函数有avg、count、change、date、dayofweek、delta、diff、iregexp、last、max、min、nodata、now、sum等parameter：函数参数；大多数数值函数可以接受秒数为其参数，而如果在数值参数之前使用“#”做为前缀，则表示为最近几次的取值，如sum(300)表示300秒内所有取值之和，而sum(#10)则表示最近10次取值之和；此外，avg、count、last、min和max还支持使用第二个参数，用于完 成时间限定；例如，max(1h,7d)将返回一周之前的最大值；表达式所支持的运算符及其功能如下图所示： 3、定义一个触发器 查看一下 rate of packets(in) 的值，并以其为标准确定我们的非正常的值：图中最大值为74，最小值为4，平均值为24。这样的话，可以定义50以上的都是非正常的值。定义一个触发器：进入：配置 ---> 主机 ---> node1 ---> 触发器 ---> 创建触发器表达式可以直接点击右侧的添加，然后定义自己所需的内容，即可自动生成：生成完毕后，我们就点击页面下方的添加，即成功定义了一个触发器，同时页面自动跳转：查看定义了触发器的监控项：看到里面就有了一根线，就是定义的值，超过线的即为异常状态，看起来非常直观。现在即使超过了这根线，也仅仅会产生一个触发器事件而不会做其他任何事。因此，需要去定义一个动作(action)。4、触发器的依赖关系触发器彼此之间可能会存在依赖关系的，一旦某一个触发器被触发了，那么依赖这个触发器的其余触发器都不需要再报警。多台主机是通过交换机的网络连接线来实现被监控的。如果交换机出了故障，我们的主机自然也无法继续被监控，如果此时，所有主机统统报警……想想也是一件很可怕的事情。要解决这样的问题，就是定义触发器之间的依赖关系，当交换机挂掉，只有自己报警就可以了，其余的主机就不需要在报警了。这样，也更易于我们判断真正故障所在。注意：目前zabbix不能够直接定义主机间的依赖关系，其依赖关系仅能通过触发器来定义。定义一个依赖关系：打开任意一个触发器，上面就有依赖关系，我们进行定义即可：由于当前只定义了一个触发器，就不演示了，过程就是这样~添加以后点击更新即可。触发器可以有多级依赖关系，比如我们看下面的例子：5、定义动作（action）1、 简介需要去基于一个对应的事件为条件来指明该做什么事，一般就是执行远程命令或者发警报。有一个告警升级的机制，所以，当发现问题的时候，一般是先执行一个远程操作命令，如果能够解决问题，就会发一个恢复操作的讯息给接收人，如果问题依然存在，则会执行发警报的操作，一般默认的警报接收人是当前系统中有的 zabbix 用户，所以当有人需要收到警报操作的话，我们则需要把它加入我们的定义之中。每一个用户也应该有一个接收告警信息的方式，即媒介，就像我们接收短信是需要有手机号的一样。每一个监控主机，能够传播告警信息的媒介有很多种，就算我们的每一种大的媒介，能够定义出来的实施媒介也有很多种。而对于一个媒介来说，每一个用户都有一个统一的或者不同的接收告警信息的端点，我们称之为目标地或者目的地。综上为了能够发告警信息，第一，我们要事先定义一个媒介，第二，还要定义这个媒介上用户接收消息的端点（当然，在用户上，我们也称之为用户的媒介）。系统内建的媒介类型：这只是基本的媒介类型，里面还有更多的细分，以 Email为例：注意：同一个类型也可以定义多个，以 Email 为例，可以定义一个腾讯的服务器，一个网易的服务器，一个阿里的服务器等等。2、定义一个媒介（media）以 Email 为例定义一个媒介：定义后更新就可以媒介定义好了，怎么才能够让用户接收到邮件呢？比如让Admin用户接收邮件，应该怎么操作呢？具体步骤如下进入 管理 ---> 用户 ---> Admin ---> 报警媒介添加一条进来：添加过后是这样的更新就可以注意： 一个用户可以添加多个接收的媒介类型。 请使用163/qq邮箱测试3、定义一个动作（action） 动作是在某些特定条件下触发的，比如，某个触发器被触发了，就会触发动作。现在基于redis来定义一个动作。在 agent 端使用 yum 安装一下 redis：[root@node1 ~]# yum install redis -y修改配置文件：[root@node1 ~]# vim /etc/redis.conf bind 0.0.0.0 #不做任何认证操作启动服务检查端口：[root@node1 ~]# systemctl start redis [root@node1 ~]# ss -nutlp | grep redis tcp LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=5250,fd=4))1、定义监控项进入 配置 ---> 主机 ---> node1 ---> 监控项（items）---> 创建监控项填写完毕以后点击下方的添加该监控项已成功添加。查看值：检测中 ---> 最新数据2、定义触发器定义好了监控项以后，定义一个触发器，当服务有问题的时候，才能及时知道：进入 配置 ---> 主机 ---> node1 ---> 触发器（trigger）---> 创建触发器填写完毕以后点击下方的添加。该触发器已成功添加查看：监测中 ---> 最新数据手动关闭 redis 服务来检测一下：[root@node1 ~]# systemctl stop redis.service进入 监测中 ---> 问题看到已经显示的是问题了。并且有持续的时间，当服务被打开，会转为已解决状态：[root@node1 ~]# systemctl start redis.service 3、定义动作（action）进入 配置 ---> 动作 ---> 创建动作（注意选择事件源为触发器）操作添加：需要在虚拟机上进行两项操作，修改 sudo 配置文件使 zabbix 用户能够临时拥有管理员权限；修改 zabbix 配置文件使其允许接收远程命令。进行如下操作：[root@node1 ~]# visudo # 相当于“vim /etc/sudoers” ## Allow root to run any commands anywhere root ALL=(ALL) ALL zabbix ALL=(ALL) NOPASSWD: ALL # 添加的一行，表示不需要输入密码 [root@node1 ~]# vim /etc/zabbix/zabbix_agentd.conf EnableRemoteCommands=1 # 允许接收远程命令 LogRemoteCommands=1 # 把接收的远程命令记入日志 [root@node1 ~]# systemctl restart zabbix-agent.service添加了第一步需要做的事情，重启服务，如果重启不成功怎么办呢？就需要来添加第二步：添加完成以后操作添加完了，如果服务自动恢复了，可以发送消息来提示：动作设置完毕，可以点击添加了，添加完成会自动跳转至如下页面：可以手动停止服务来进行测试：[root@node1 ~]# systemctl stop redis.service 到问题页面来查看，发现确实有问题，并且已经解决：server 端查看是否收到邮件agent 端查看端口是否开启[root@node1 ~]# systemctl stop redis.service [root@node1 ~]# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:6379 *:* LISTEN 0 128 *:111 *:* LISTEN 0 5 192.168.122.1:53 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 *:23000 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* 端口正常开启，动作触发已经完成。补充：可以使用脚本来发送警报，脚本存放路径在配置文件中可以找到，定义为：AlterScriptsPath=/usr/lib/zabbix/alertscripts手动修改一下redis服务的监听端口，这样就不能通过重启服务恢复了：[root@node1 ~]# vim /etc/redis.conf #port 6379 port 6380 #注释掉原来的端口，更换为新的端口 [root@node1 ~]# systemctl restart redis网页查看状态：进入 监测中 ---> 问题，可以看到是报错的：经过了重启服务以后还是没能把解决问题，就会发邮件告警把服务端口改回来，然后重启服务。这样，等到问题自动解决了以后，会再次收到邮件：动作设定已经全部测试完成。6、zabbix可视化1、 简介数据日积月累，想要更直观的了解到各项数据的情况，图形无疑是最佳选择。zabbix 提供了众多的可视化工具直观展示，如 graph、screen 及 map 等。前面也看到过一些简单的图形展示。如果想要把多个相关的数据定义在同一张图上去查看，就需要去自定义图形2、自定义图形（Graphs）自定义图形中可以集中展示多个时间序列的数据流。支持四种不同形式的图形线状图(normal)堆叠面积图(stacked)、饼图(pie)”分离型饼图(exploded)设置过程如下：进入 配置 ---> 主机 ---> node1 ---> 图形，选择右上角创建图形：看一看四种状态：主机都可以自定义，一般线型是看的最清晰的，通常会使用这个。克隆一个 packets 来更改为 bytes 用同样的，如果想添加别的内容，也都可以添加的。这里添加了三个图形，我们可以在 监测中 ---> 图形 来查看3、聚合图形（Screens）创建的自定义图形也可以放在一个聚合图里显示，具体的设置方法： 进入 监测中 ---> 聚合图形 ---> 选择右上角创建聚合图形可以选择分享：定义好了添加即可定义完成以后，需要编辑一下，来指定保存哪些图：依次添加即可，添加完成之后：因为只有三张图，所以添加的有重复的。4、幻灯片演示（Slide shows）如果有多个聚合图形想要按顺序展示的话，我们就可以定义一个幻灯片。具体步骤：进入 监测中 ---> 聚合图形 ---> 右上角选择幻灯片演示 ---> 创建幻灯片打开以后显示的是图片1，5s以后会自动切换为图片2。这样就可以实现幻灯片演示，就不需要去手动切换了。5、 定义拓扑图（Maps）在拓扑图中，可以定义成一个复杂的网络连接图，可以使用一台主机来连接另一台主机，这样的话，就可以查看出到底是哪个链接出了问题。进入 监测中 ---> 拓扑图 ---> 所有地图 ---> Local network(默认就有的)通过 Ping 和 Traceroute 就可以实验我们上述的功能。7、模板1、创建模板每一个主机的监控项都很多，一个一个的添加实在是太头疼了，更何况，可能不止一个主机。可以把一个 redis 的监控项添加进一个模板里，这样更方便于我们以后的添加。具体操作：进入 配置 ---> 模板 ---> 选择右上角创建模板填写完以后，点击下方的添加即可。基于组过滤，就能看到定义的模板：可以向里面添加应用集、监控项、触发器、图形等等，添加完成以后，后期再有主机需要添加就直接套用模板即可。需要注意的一点是，现在添加的是模板，所以不会立即采用数据，只有链接到主机上以后，才会真正生效。2、模板的导入与导出可以直接导入一个模板，在互联网上可以找到很多，导入的步骤如下：创建好的模板也可以导出为文件：任意选中一个准备好的模板，然后页面的最下方就有导出按钮：就可以非常方便的进行应用了3、模板的应用进入 配置 ---> 主机 ---> node1 ---> 模板，选择要添加的模板了：点击更新了。成功链接至模板，主机数据就会更新了：注意：一个主机可以链接多个模板，但尽量不要让一个指标被采样两次。如果有多个主机，同时这些主机也在一个主机组里，这样的话，只需要在这个主机组里添加模板，就能够让在主机组里的所有主机进行监控4、移除模板链接当一个主机的模板不想要用了，可以移除模板链接，具体操作步骤：进入 配置 ---> 主机 ---> node1 ---> 模板，可以把不需要的模板移除：删除试试看，移除并清理以后，点击更新。就会自动跳转至如下界面：模板已经被移除8、宏（macro）1、简介宏是一种抽象(Abstraction)，它根据一系列预定义的规则替换一定的文本模式，而解释器或编译器在遇到宏时会自动进行这一模式替换。类似地，zabbix基于宏保存预设文本模式，并且在调用时将其替换为其中的文本。zabbix有许多内置的宏，如{HOST.NAME}、{HOST.IP}、{TRIGGER.DESCRIPTION}、{TRIGGER.NAME}、{TRIGGER.EVENTS.ACK}等。详细信息请参考官方文档2、级别宏一共有三种级别，分别是全局宏、模板宏、主机宏。不同级别的宏的适用范围也不一样。全局宏也可以作用于所有的模板宏和主机宏，优先级最低。模板宏则可以作用于所有使用该模板的主机，优先级排在中间。主机宏则只对单个主机有效，优先级最高。3、类型宏的类型分为系统内建的宏和用户自定义的宏。为了更强的灵活性，zabbix还支持在全局、模板或主机级别使用用户自定义宏(user macro)。系统内建的宏在使用的时候需要{MACRO}的语法格式，用户自定义宏要使用{$MACRO}这种特殊的语法格式。宏可以应用在item keys和descriptions、trigger名称和表达式、主机接口IP/DNS及端口、discovery机制的SNMP协议的相关信息中……宏的名称只能使用大写字母、数字及下划线。进一步信息请参考官方文档。4、定义一个宏 如果想要在监控项(items)上使用宏，就要先去定义一个宏，然后去创建监控项，直接引用定义好的宏即可。具体操作步骤：1、定义全局宏进入 管理 ---> 一般 ---> 右上角选择宏全局宏就添加好了2、定义监控项，调用宏进入 配置 ---> 主机 ---> 所有主机 ---> 监控项 ---> 右上角创建监控项填写完成以后，点击添加。看到这个调用宏的监控项已经添加成功：查看监控项现在的状态：进入 监测中 ---> 最新数据把服务停掉。就会变成 down 的状态[root@node1 ~]# systemctl stop redis发现监控项是可以正常使用的。3、修改宏如果把 node1 节点上的 redis 服务监听端口手动改掉，定义的监控项就不能正常使用了，这样的话，就需要去修改宏。因为只是个例，所以我们不需要去修改全局宏，只用修改模板宏或者主机宏就可以了。模板宏和主机宏的不同修改操作：模板宏：模板宏的修改，配置 ---> 模板 ---> redis stats（相应的模板） ---> 宏点击添加就可以了。主机宏：主机宏的修改，配置 ---> 主机 ---> 所有主机 ---> node1 ---> 宏点击添加就可以了。五、Zabbix 用户参数1、介绍和用法1、介绍自定义用户参数，也就是自定义key，有时可能想要运行一个代理检查，而不是 Zabbix 的预定义，就可以编写一个命令来检索需要的数据，并将其包含在代理配置文件("UserParameter"配置参数)的用户参数中2、用法格式 syntaxUserParameter=,A user parameter also contains a key 一个用户参数也包含一个键The key will be necessary when configuring an item 在配置监控项时，key是必需的Note: Need to restart the agent 注意:需要重新启动 agent 服务2、用法展示1、修改 agent 端的配置，设置用户参数1、查找的参数的命令[root@centos7 ~]# free | awk '/^Mem/{print $3}'2、修改配置文件，把查找参数的命令设为用户参数[root@centos7 ~]# cd /etc/zabbix/zabbix_agentd.d/ [root@centos7 ~]# vim memory_usage.conf UserParameter=memory.used,free | awk '/^Mem/{print $3}'3、重启agent 服务[root@centos7 ~]# systemctl restart zabbix-agent.service 4、在 zabbix-server 端，查询[root@centos7 ~]# zabbix_get -s 192.168.30.7 -p 10050 -k "memory.used"5、在监控上，设置一个item监控项，使用这个用户参数6、查询 graph 图形3、用法升级1、修改 agent 端的配置，设置用户参数1、命令行查询参数的命令2、修改配置文件，把查找参数的命令设为用户参数UserParameter=memory.stats[*],cat /proc/meminfo | awk '/^$1/{print $$2}'分析：$$2：表示不是调前边位置参数的$2 ，而是 awk 的参数 $2注意：$1是调用前边的[*]，位置参数，第一个参数2、在zabbix-server 端，查询使用这个用户参数的key3、在监控上，设置一个item监控项，使用这个用户参数1、添加 Memory Total 的 item 监控项，使用 memory.stats[MemTotal] 的用户参数在进程中定义倍数，规定单位2、clone 克隆 Memory Total 创建Memory Free 的监控项memory.stats[MemFree] 用户参数3、创建 Memory Buffers 的 item 监控项，使用 memory.stats[Buffers] 的key4、上面3个监控项的 graph 图形1、memory total2、memory free3、buffers4、使用用户参数监控 php-fpm 服务的状态在agent 端：1、下载，设置php-fpm[root@centos7 ~]# yum -y install php-fpm [root@centos7 ~]# vim /etc/php-fpm.d/www.conf # 打开php-fpm的状态页面user = nginx group = nginx pm.status_path = /status # php-fpm 的状态监测页面 ping.path = /ping # ping 接口，存活状态是否ok ping.response = pong # 响应内容pong2、 开启 php-fpm 服务[root@centos7 ~]# systemctl start php-fpm3、设置 nginx ，设置代理php，和php-fpm的状态页面匹配[root@centos7 ~]# vim /etc/nginx/nginx.conf 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; } location ~* /(php-fpm-status|ping) { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; include fastcgi_params; allow 127.0.0.1; # 因为这个页面很重要，所有需加访问控制 deny all; access_log off; # 访问这个页面就不用记录日志了 }4、复制状态信息页面到网站根目录[root@centos7 ~]# cp /usr/share/fpm/status.html /usr/share/nginx/html/5、开启nginx服务[root@centos7 ~]# systemctl start nginx6、在agent 端，设置用户参数1、查询 curl 192.168.30.7/php-fpm-status2、设置[root@centos7 ~]# cd /etc/zabbix/zabbix_agentd.d/ [root@centos7 ~]# vim php_status.conf UserParameter=php-fpm.stats[\*],curl -s http://127.0.0.1/status | awk '/^$1/{print $$NF}'分析：设置用户参数为php-fpm.stats[*]，$1为第一个参数；$$NF为awk中的参数，倒数第一列3、重启服务[root@centos7 ~]# systemctl restart zabbix-agent4、在zabbix-server 端，查询使用这个用户参数的key[root@centos7 ~]# zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[idle]" [root@centos7 ~]# zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[active]" [root@centos7 ~]# zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[max active]"5、创建一个模板，在模板上创建4个item监控项，使用定义的用户参数1、创建一个模板2、在模板上配置 items 监控项，使用刚定义的用户参数fpm.stats[total processes]3、再clone克隆几个items监控项fpm.stats[active processes]fpm.stats[max active processes] fpm.stats[idle processes]6、host主机链接模板7、查看graph 图形1、php-fpm total processes2、php-fpm active processes3、php-fpm max active processes4、php-fpm idle processes8、把模板导出，可以给别人使用1、导出模板最下面有导出2、自己定义用户参数的文件，也不要忘记导出[root@centos7 ~]# /etc/zabbix/zabbix_agentd.d/php_status.conf 六、Zabbix 网络发现1、介绍网络发现：zabbix server 扫描指定网络范围内的主机；网络发现是zabbix 最具特色的功能之一，它能够根据用户事先定义的规则自动添加监控的主机或服务等优点：加快Zabbix部署简化管理在快速变化的环境中使用Zabbix，而不需要过度管理2、发现方式ip地址范围可用服务（ftp, ssh, http, ...）zabbix_agent的响应snmp_agent的响应3、发现过程网络发现通常包含两个阶段：discovery 发现和 actions 动作1、discoveryZabbix定期扫描网络发现规则中定义的IP范围；检查的频率对于每个规则都是可配置的，每个规则都有一组用于为IP范围执行的服务检查由网络发现模块执行的服务和主机(IP)的每个检查都会生成一个发现事件8种响应事件2、actions网络发现中的事件可以触发 action，从而自动执行指定的操作，把 discvery events当作前提条件；Sending notifications 发送通知Adding/removing hosts 添加/删除主机Enabling/disabling hosts 启用/禁用hostAdding hosts to a group 向组中添加主机Removing hosts from a group 移除组中的主机Linking hosts to/unlinking from a template 从模板链接主机或取消链接Executing remote scripts 执行远程脚本这些事件的配置还可以基于设备的类型、IP 、状态、上线/ 离线等进行配置3、网络发现：接口添加网络发现中添加主机时会自动创建 interface 接口例如：如果基于SNMP 检测成功，则会创建SNMP 接口如果某服务同时响应给了agent 和SNMP ，则两种接口都会创建如果同一种发现机制( 如agent) 返回了非惟一数据，则第一个接口被识别为默认，其它的为额外接口即便是某主机开始时只有agent 接口，后来又通过snmp 发现了它，同样会为其添加额外的snmp 接口不同的主机如果返回了相同的数据，则第一个主机将被添加，余下的主机会被当作第一个主机的额外接口4、配置网络发现 Network discovery1、准备一台可被扫描发现的主机1、安装 agent 段的包[root@node1 ~]# yum -y install zabbix-agent zabbix-sender2、设置 agent 配置，可以把之前设置好的node1的配置传过来[root@node1 ~]# vim /etc/zabbix/zabbix_agentd.conf Hostname=node2.qfedu.com #只需修改hostname3、 visudo 修改sudo的配置[root@node1 ~]# visudo #Defaults !visiblepw zabbix ALL=(ALL) NOPASSWD: ALL4、开启服务[root@node1 ~]# systemctl start zabbix-agent2、设置自动发现规则 discovery注释：3、key[root@node1 ~]# zabbix_get -s 192.168.30.2 -p 10050 -k "system.hostname"2、更新间隔1h就好，不要扫描太过频繁，扫描整个网段，太废资源；这里为了实验，设为1m4、自动发现成功5、设置自动发现discovery 的动作action1、创建2、设置action动作1、设置A条件，自动发现规则=test.net2、设置B条件，自动发现状态=up3、要做什么操作添加主机到监控自动链接Template OS Linux 到此host3、配置action 完成，默认是 disabled 停用的4、启用动作，查看效果确实已经生效，添加主机成功，模板链接成功5、如果自己需要添加的主机已经扫描添加完成，就可以关闭网络扫描了，因为太耗资源七、Zabbix web 监控1、介绍1、 Web 监控监控指定的站点的资源下载速度，及页面响应时间，还有响应代码；1、术语web Scenario： web场景（站点）web page ：web页面，一个场景有多个页面內建key：要测一个页面，要测三个步骤（下边3个內建key）2、内建 keyweb.test.in[Scenario,Step,bps]：传输速率web.test.time[Scenario,Step]： 响应时长web.test.rspcode[Scenario,Step]：响应码2、创建设置web场景1、创建2、配置 web 监测1、点击步骤，设置 web page web 页面1、设置名为 home pageURL为http://192.168.30.7/index.html 的web页面2、设置名为 fpm statusURL为http://192.168.30.7/fpm-status 的web页面3、设置2个 web 页面成功如果有特殊认证，也可以添加3、查看测试八、Zabbix 主动/被动 监控1、介绍被动检测：相对于agent而言；agent, server向agent请求获取配置的各监控项相关的数据，agent接收请求、获取数据并响应给server；主动检测：相对于agent而言；agent(active),agent向server请求与自己相关监控项配置，主动地将server配置的监控项相关的数据发送给server；主动监控能极大节约监控server 的资源。zabbix_sender 发送数据：实现人工生成数据，发给server端zabbix server上的某主机上，直接定义Item时随便定义一个不与其它已有key冲突的key即可，即item type为"zabbix trapper"；用法选项：zabbix_sender -z zabbix_server_ip -p zabbix_server_port -s zabbix_agent_hostname -k key -o value 值2、设置一个通过內建key发送数据的主动监控1、agent 端所需要基本配置ServerActive=192.168.30.107 # 给哪个监控server 发送数据 Hostname=node1.qfedu.com # 自己的主机名，假设主机定死了，不设置下一项 #HostnameItem= # 如果自己的主机名易变动，这一项相当于key一样去匹配注意：若后两项同时启用，下边一个选择生效2、设置一个主动监测1、选择进程，每秒更改，因为key：system.cpu.switches ：上下文的数量进行切换，它返回一个整数值。为了监控效果，选择下一秒减上一秒的值作为监控3、已经有 graph 图形3、设置一个通过命令zabbix_sender发送数据的主动监控1、配置一个zabbix traper(采集器) 的item 监控项2、agent 端手动发送数据3、监控到数据的变化