通过zabbix监控 tomcat
jvm监控
需要安装一个tomcat 并且需要安装agent
jvm监控 需要 zabbix-server 还需要一个java gateway 通过java gatewat 监控java 的app
java的app 就是 tomcat
所有的数据 还是写在mysql数据库里面
开始操作
架构图
先给java gate way 机器 安装zabbix源 1.209
wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3%2Bbionic_all.deb
dpkg -i zabbix-release_4.0-3+bionic_all.deb
安装
apt update
java gateway 机器不用装agent
apt -y install zabbix-java-gateway
直接安装 zabbix-java-gateway
###注意注意!!!!
如果想用
server---proxy----java gateway---tomcat
proxy和server需要配置的内容一样!!!!
都需要改!!如下
root@zabbix-proxy-2:~# egrep -v '^$|^#' /etc/zabbix/zabbix_proxy.conf
ProxyMode=0
Server=192.168.1.201
Hostname=Zabbix-proxy-2
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=192.168.1.202
DBName=zabbix_proxy2
DBUser=zabbix2
DBPassword=123456
JavaGateway=192.168.1.209
StartJavaPollers=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=30
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
并且tomcat agent内容如下
root@agent-tomcat-1:/apps# egrep -v '^$|^#' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.1.201,192.168.1.205
##server端和proxy端
ServerActive=192.168.1.205
##proxy端
Hostname=192.168.1.207
Include=/etc/zabbix/zabbix_agentd.d/*.conf
Zabbix-server的端口号是10051
Zabbixa-gent端口号是10050
Zabbix-proxy端口号是10050
Java-gateway 端口号是10052
装完java-gateway 后会在/etc/zabbix 产生配置文件
vim /etc/zabbix/zabbix_java_gateway.conf
打开
配置文件并没有指定zabbix-server
保存退出
systemctl start zabbix-java-gateway
启动java-gateway
然后去zabbix-server 机器上调用 这个java-gateway
切换 server端
vim /etc/zabbix/zabbix_server.conf
打开server的配置文件
保存退出
systemctl restart zabbix-server.service
重启server
egrep -v "^$|^#" /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.1.202
DBName=zabbix_server_247
DBUser=zabbix
DBPassword=123456
JavaGateway=192.168.1.209
StartJavaPollers=20
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
这是java-gateway 地址 端口号 以及启动多少个进程来获取数据
ps -ef | grep zabbix
重启后看下server服务 他会启动很多进程
然后去配置tomcat
如何让java-gateway 去获取 tomcat 的信息
去tomcat 官网
tomcat.apache.org
我也不截图了 反正也看不懂
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.207"
把这些加到
这个 192.168.1.207 是tomcat 的ip
vim /apps/tomcat/bin/catalina.sh
里面
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
##启动一个端口号12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.207"
##tomcat的本机的ip地址
保存退出 重启tomcat
注意!!!这台机器要安装agent 并且 指向server
在server控制台上找到这台机器 tomcat
添加jmx接口
端口号默认是12345
然后添加模板 官方给我们自带了一个jmx模板
一般都用第一个 叫通用的java 模板
添加 然后更新
等待
等待jmx变绿
不绿就重启 server端 或者本机agent端 之类的
然后可以看图了
这是官方给自带的模板
我把这个模板删了 不使用这个
然后我们加一个模板
导入模板
tomcat-template-weixiedu.xml
文件
然后切换到tomcat机器 将导入的模板添加到这个机器上
这时候再等jmx 变绿
再看图
这就是tomcat 的监控
监控一个jmx 方法:
1 首先安装java-gateway 启动他 端口号10052
2 在zabbix-server 上添加java-gateway 让他知道java-gateway在哪里
3 然后在tomcat上 添加jmx配置
4 在zabbix-web 界面上添加主机和jmx接口
tcp监控
tcp状态值
tcp有十一种状态
tcp三次握手和四次断开
中有11种状态
三次握手状态:
三台握手客户端 服务端
没连接之前 他们的状态值都是closed(关闭)
一旦客户端需要连接 服务端的时候
肯定是服务端有个服务启动了 他的状态值 变成listen 有个端口号
然后客户端去连接 这个连接 是三次握手的第一步 发起请求 叫SYN请求
发起SYN请求 同时带有seq序列号 比如是x SYN,seq=x
正常三次握手第一次 服务端有一个服务器启动了 肯定会启动一个端口号
这个端口号 客户端会去连接比如服务的是80端口号
客户端要去连接服务的的80端口
这时候 客户端的状态不是 closed了 就会变成syn-sent
现在服务端接收到了 客户端的请求
服务的状态值就变了 不是listen了 就是syn-rcvd
同时服务端 也会响应客户端请求 给客户端响应报文 ACK,ack=x+1,SYN,syn=y
(有个人ack确认消息 同时有个ack序列号 ack=x+1 比上面x大1 同时 他会发起SYN请求他也有一个序列值 seq=y)
第二个包是服务的同时发两个
现在客户端接收到ACK的响应包 同时又接收SYN请求包
这时候 客户端会给服务端响应 然后客户端给服务端响应 ACK,ack=y+1
然后客户端状态会变成established
同样这个时候服务端也会变成established 状态值
当都是ESTABLISHED这时候 在传输数据
这就是tcp三次握手的整个过程
状态值客户端有三 CLOSED SYN-SENT ESTABLISHED
服务端有四个 CLOSED LISTEN SYN-RCVD ESTABLISHED
整个三次握手一共出现了 五个状态值
一共是七次
但是有重复的 CLOSED ESTABLISHED
除了这五种以外 还有六种 是在断开数据 四次挥手的过程中 产生的
四次挥手状态
客户端 服务端
数据传输完成后 要做四次断开
第一个状态值 首先客户端状态值是ESTABLISHED
服务端也是 ESTABLISHED
首先客户端已经把所有数据都传给服务端了 要求断开
客户端 发起FIN 请求 序列号假设为p FIN,seq=p
然后客户端发完请求 状态值改为FIN-WAIT-1
这时候服务端收到 断开连接的请求 收到后 立即给客户端响应消息
服务端响应 ACK,ack=p+1
同时服务端状态值变为 CLOSED-WAIT(等待关闭的状态)
同时客户端接收响应后 状态值也变成了 FIN-WAIT-2
虽然服务端给响应了 但是 服务端可能没有传输完数据
服务端如果传输完数据了 会发送断开请求
服务端发FIN,seq=q,ACK,ack=p+1
然后服务端状态值变为LAST-ACK
客户端收到以后 给服务端发送确认消息 ACK,seq=q+1
状态值变为 TIME-WAIT(等待时间)
最终TIME-WAIT时间过了后 客户端状态变为CLOSED
同样服务端也变为CLOSED
当客户端和服务端 状态都为CLOSED 的时候 说明断开了
四次
tcp四次挥手
四次断开 一共有 客户端 有5种状态码
服务端 有 4种状态
一共出现了 7种状态
三次握手 四次挥手 一共11 种状态
监控这11种状态
需要写脚本
如何获取这些值
ss -tnl
这些就是状态值
还有
ss -ant
传个脚本 去获取这些值
cd /etc/zabbix/zabbix_agentd.d/
去这个目录写脚本
注意脚本要写在被监控端!!!
tcp_conn_plugin.sh
把这个脚本传进去
脚本内容如下
#!/bin/bash
tcp_conn_status(){
TCP_STAT=$1
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt| cut -d ' ' -f2)
if [ -z $TCP_NUM ];then
TCP_NUM=0
fi
echo $TCP_NUM
}
main(){
case $1 in
tcp_status)
tcp_conn_status $2;
;;
esac
}
main $1 $2
解释:
#!/bin/bash
tcp_conn_status(){
TCP_STAT=$1
##定义一个变量TCP_STAT=$1 最终引用传两个值给他 看最后一行
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
##命令来获取
##获取当前11种状态值 出现的次数
##把这个值写到/tmp/tcp_conn.txt这个文件里面了 然后过滤这个文件
TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt| cut -d ' ' -f2)
##过滤这个文件 执行$TCP_STAT 是因为 我需要手工加参数 比如我要获取 ESTAB就需要在执行脚本的时候 加上这个参数
if [ -z $TCP_NUM ];then
TCP_NUM=0
##如果获取的这个值为空 那么给他弄个数0 因为如果没有值zabbix会报错 如果没有这个值 说明 系统当时没有出现这个状态
fi
echo $TCP_NUM
##如果有的就输出
}
main(){
case $1 in
tcp_status)
tcp_conn_status $2;
##如果$1传的是tcp_status 我就引用上面那个函数 然后给他传个$2 这个$2就相当于上面的 TCP_STAT
##注意!!!虽然上面那个函数写的是$1 但是外面脚本只执行了 第二个函数 然后跟上两个参数 第一个函数的 $1 在tcp_conn_status $2 执行第一个参数 并且后面跟上了 真正的$2 也就是说 上面第一个函数的$1 其实 是$2 因为 tcp_conn_status $2 这就相当于一个独立的脚本 然后跟上了 外面脚本的第二个参数 但是 对于这个第一个函数 来说是第一个参数!!所以 上面$1 等于 外面$2
;;
esac
}
main $1 $2
测试一下
sh tcp_conn_plugin.sh tcp_status LISTEN
比如我们想获取LISTEN 状态值
$1 是tcp_status $2就是状态名
rm -rf /tmp/tcp_conn.txt
删掉那个文件
这样的话 就能看到 某个状态 当前有多少数量
给脚本加权限
chmod +x tcp_conn_plugin.sh
去修改zabbix_agtent 配置文件 让他支持脚本
vim /etc/zabbix/zabbix_agentd.conf
UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/tcp_conn_plugin.sh "$1" "$2"
加入这么一条 指向脚本目录 脚本必须有执行权限
systemctl restart zabbix-agent.service
重启 agent
手工测试一下 去server用命令行测试
切换到zabbix-server 安装
apt -y install zabbix-get
-s 主机ip
-p 端口号
-k key值 这个key值就是在agent配置文件中定义的
zabbix_get -s 192.168.1.207 -k linux_status["tcp_status","LISTEN"]
中括号里的第一个是 $1 第二个是$2
这样通过远程zabbix get 的方式获取
能获取到 说明 server 和agent 通信没有问题
然后需要在服务端 添加
我们先导入一个模板
template Linux TCP_CONN Status.xml
直接导入
然后看下模板里面有啥内容
有11个监控项
就是监控11个状态值的
还有个触发器
TCP ESTABLISHED大于5500会报警
然后将模板添加到主机
然后去看图 有没有数据
zabbix添加监控过程:
1 在zabbix-agent的zabbix-agentd.conf目录下添加监控脚本
2在zabbix-agent.conf配置文件内添加UserParameter=<item key>,/etc/zabbix/zabbix_agent.d/monitor-scripts “$1” “$2”
3 在zabbix-server上使用zabbix-get命令测试监控项是否正常;zabbix-get -s zabbix-agent-ip -p zabbix-agent-port -k <item key>[“1”,”2”]
4 在zabbix web上对应主机上添加监控项,或者添加到模板内