目录
一.监控tomcat
1.在tomcat服务器上安装zabbix-agent服务
[root@node2 etc]#vim zabbix_agentd.conf
94 Server=192.168.240.13 #指向当前zabbix server
##### Passive checks related #被动检查相关配置
### Option: ListenPort
ListenPort=10050 #监听端口 默认的无需修改
119 StartAgents=3
#启动3个进程收集数据
146 Hostname=192.168.240.11
#指定名称 一般使用 IP地址, 等会需要使用
systemctl restart zabbix-agent.service
systemctl status zabbix-agent.service
2.修改配置文件
vim /usr/local/tomcat/bin/catalina.sh
#一般加在116行
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.240.11"
systemctl restart tomcat
systemctl status tomcat
ss -napt|grep 12345
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote #启用远程监控JMX
-Dcom.sun.management.jmxremote.port=12345 #默认启动的JMX端口号,要和zabbix添加主机时候的端口一致即可
-Dcom.sun.management.jmxremote.authenticate=false #不使用用户名密码
-Dcom.sun.management.jmxremote.ssl=false #不使用ssl认证
-Djava.rmi.server.hostname=x.x.x.x" #tomcat主机自己的IP地址,不要写zabbix服务器的地址
3.通过jconsole 验证JMX数据
在windows安装windows版本的JDK,安装过程略,安装完成之后点击安装目录的jconsole.exe,比如C:\ProgramFiles\Java\jdk1.8.0_221\bin\jconsole.exe
4.配置zabbixserver
在主服务器上配置启动1javagateway
[root@localhost data]#vim /apps/zabbix_server/sbin/zabbix_java/settings.sh
#不需要修改
35 START_POLLERS=5 #启动5个线程去采集java数据
43 TIMEOUT=30 #一个数据的超时时间30s
[root@localhost data]#/apps/zabbix_server/sbin/zabbix_java/startup.sh
# 启动服务
[root@localhost data]#ss -antp |grep 10052
配置zabbix-server对接java-gateway
[root@localhost data]#vim /apps/zabbix_server/etc/zabbix_server.conf
281 JavaGateway=192.168.240.13 #指明gateway地址
298 StartJavaPollers=5 #开启多少个进程去收集java服务器的信息
289 JavaGatewayPort=10052 # 默认不用改
systemctl restart zabbix-server
#快照起不来 重启机器
#重启后不要忘记开启 javagateway
/apps/zabbix_server/sbin/zabbix_server
ss -natp |grep 10051
5.web页面配置
二.Zabbix监控TCP
TCP,全称Transfer Control Protocol,中文名为传输控制协议,它工作在OSI的传输层,提供面向连接的可靠传输服务,TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输。TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据。
在建立连接的时候,所谓的客户端与服务端是相对应的,即要看是谁主动连接的谁,如果A主动连接B那么A就是客户端而B是服务端,如果返过来B主动连接A,那么B就是客户端而A就成了服务端。
1.TCP端口连接的11种状态
CLOSED:端口默认是关闭状态。
LISTEN: 服务器程序开始监听一个端口,就是LISTEN状态。
SYN_RCVD:三次握手的第二次握手后的端口状态,是收到了客户端发送的SYN_SENT数据包之后的状态,这个状态很短暂,正常在服务器上是很少看到的,除非服务器故意不发送最后一次握手数据包,服务器返回给客户端SYN确认之后就会将在自己的端口置为SYN_RCVD。
SYN_SENT:SYN_SENT状态表示客户端已发送SYN=1的请求连接报文,发送之后客户端就会将自己的端口状态置为SYN_SENT。
ESTABLISHED:表示已经连接成功,客户端收到服务器的确认报文会回复服务器,然后就将端口置为ESTABLISHED,服务器第三次收到客户端的Ack确认就会将端口置为ESTABLISHED并开始传输数据。
FIN_WAIT_1:出现在主动关闭方,FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,当任意一方想主动关闭连接,向对方发送了FIN=1的断开连接请求报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:出现在主动关闭方,当被动方回应FIN_WAIT_1的ACK报文后,则进入到FIN_WAIT_2状态
TIME_WAIT:出现在主动关闭方,表示收到了对方的FIN请求关闭报文,并发送出了ACK报文,就等2*MSL(MaxSegment Lifetime)后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 表示在等待关闭端口,这种状态存在于被动关闭的一方。
LAST_ACK: 是被动关闭方在主动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当再次收到ACK报文后,也即可以进入到CLOSED可用状态了。
2.自定义监控项
[root@localhost zabbix]# vim /apps/zabbix/etc/zabbix_agentd.conf
283 ### Option: UserParameter
284 # User-defined parameter to monitor. There can be several user-defined parameters.
285 # Format: UserParameter=<key>,<shell command>
286 # See 'zabbix_agentd' directory for examples.
287 #
288 # Mandatory: no
289 # Default:
290 # UserParameter=
UserParameter=test,/usr/bin/echo hello
#修改290 行或者新加一行 命令最好绝对路径
systemctl restart zabbix-agent.service
在主服务器验证
[root@localhost data]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test"
hello
3.添加脚本
vim /apps/zabbix/etc/zabbix_agentd.conf
# Mandatory: no
# Default:
# UserParameter=
UserParameter=test,/usr/bin/bash /data/tcp.sh
systemctl restart zabbix-agent.service
vim tcp.sh
#!/bin/bash
echo 100
4.主服务器上测试
[root@localhost data]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test"
100
5.脚本传参数
[root@localhost data]# vim tcp.sh
#!/bin/bash
echo $1
[root@localhost zabbix]# vim /apps/zabbix/etc/zabbix_agentd.conf
UserParameter=test[*],/usr/bin/bash /data/tcp.sh $1
6.服务端测试
[root@localhost data]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test[20]"
20
[root@localhost data]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test[30]"
30
7.调用多个
vim tcp.sh
#!/bin/bash
echo $1 $2
vim /apps/zabbix/etc/zabbix_agentd.conf
UserParameter=test[*],/usr/bin/bash /data/tcp.sh $1 $2
systemctl restart zabbix-agent.service
服务端测试
/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test[30,300]"
8.脚本判断
vim tcp.sh
#!/bin/bash
num=$1
if [ $num == "cpu" ];then
echo 88
fi
vim /apps/zabbix/etc/zabbix_agentd.conf
UserParameter=test[*],/usr/bin/bash /data/tcp.sh $1
systemctl restart zabbix-agent.service
服务端测试
/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "test[cpu]"
9.监控tcp连接
准备脚本
#!/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
bash tcp_status.sh tcp_status ESTAB
bash tcp_status.sh tcp_status TIME-WAIT
chmod +x tcp_status.sh
测试脚本
修改客户端配置文件
[root@localhost etc]# vim zabbix_agentd.conf
UserParameter=linux_tcp[*],/usr/bin/bash /data/tcp.sh $1 $2
systemctl restart zabbix-agent.service
systemctl status zabbix-agent.service
在主服务器上验证
[root@localhost ~]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "linux_tcp_status["tcp_status","TIME-WAIT"]"
[root@localhost ~]#/apps/zabbix_server/bin/zabbix_get -s 192.168.240.11 -p 10050 -k "linux_tcp_status["tcp_status","ESTAB"]"
在web上设置添加模板
在模板上添加监控项
三.zabbix监控nginx
客户机:192.168.240.11
服务器:192.168.240.13
1.客户机安装nginx
[root@localhost data]# yum install epel-release.noarch -y
[root@localhost data]# yum install nginx -y
2.修改nginx配置文件
[root@localhost data]# vim /etc/nginx/nginx.conf 、
location /status {
stub_status;
}
[root@localhost data]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost data]# systemctl restart nginx
浏览器访问
3.准备脚本
#!/bin/bash
nginx_status_fun(){ #函数内容
NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){ #获取nginx_reading状态的数量
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac
}
main(){ #主函数内容
case $1 in #分支结构,用于判断用户的输入而进行响应的操作
nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
nginx_status_fun $2 $3;
;;
*) #其他的输入打印帮助信息
echo $"Usage: $0 {nginx_status key}"
esac #分支结束符
}
main $1 $2 $3
4.在客户机测试脚本
bash nginx_status.sh nginx_status 80 active
nginx七个状态
Active connections: 活跃连接数,指当前正在处理的客户端连接数。这包括正在读取、写入、等待或者已经接受但还未处理完毕的连接数。
Reading: 正在读取的连接数。这表示服务器正在从客户端读取数据。
Writing: 正在写入的连接数。这表示服务器正在向客户端发送数据。
Waiting: 等待连接的数量。这表示有多少连接在等待服务器处理请求,可能是由于服务器资源有限或者处理能力不足造成的。
Accepts: 已接受的连接数。这是服务器已经接受的总连接数。
Handled: 已处理的连接数。这是服务器已经成功处理过的连接总数,包括成功处理和失败处理的连接。
Requests: 请求总数。这是服务器收到的所有请求的总数,每一个连接可以包含多个请求。
5.修改zabbix-agent 配置文件
[root@localhost ~]# vim /apps/zabbix/etc/zabbix_agentd.conf
UserParameter=nginx_status[*],/usr/bin/bash /data/nginx_status.sh $1 $2 $3
systemctl restart zabbix-agent.service
6.在服务器上测试
[root@localhost ~]#zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","active"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","reading"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","writing"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","waiting"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","accepts"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","handled"]"
[root@localhost ~]# zabbix_get -s 192.168.240.11 -p 10050 -k "nginx_status["nginx_status","80","requests"]"
7.在web上操作
添加nginx模板
添加监控项
创建触发器
创建图行
四.snmp监控
SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是“简单网络管理协议,SNMP是一种简单网络管理协议,它属于TCP/IP五层协议中的应用层协议,用于网络管理的协议,SNMP主要用于网络设备的管理。
SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。
SNMP协议是TCP/IP协议簇的一个应用层协议,在1988年被制定,并被Internet体系结构委员会(IAB,InternetArchitecture Board)采纳作为一个短期的网络管理解决方案,由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能,SNMP的协议版本目前有SNMP v1、SNMP v2c和SNMP v3三种版本,其具体差别如下:
SNMP v1采用团体名(Community Name)认证,团体名用来定义SNMP NMS和SNMP Agent的关系,如果SNMP报文携带的团体名没有得到设备的认可,该报文将被丢弃,团体名起到了类似于密码的作用,用来限制SNMP NMS对SNMPAgent的访问。
SNMP v2c也采用团体名认证,它在兼容SNMP v1的同时又扩充了SNMP v1的功能,它提供了更多的操作类型(批量获取GetBulk和通知请求InformRequest)、支持更多的数据类型(Counter64等)、提供了更丰富的错误代码且能够更细致地区分错误。
SNMP v3提供了基于用户的安全模型(USM,User-Based Security Model)的认证机制,用户可以设置认证和加密功能,认证用于验证报文发送方的合法性,避免非法用户的访问,加密则是对NMS和Agent之间的传输报文进行加密,以免被窃听。通过有无认证和有无加密等功能组合,可以为SNMP NMS和SNMP Agent之间的通信提供更高的安全性。
SNMP数据交互
SNMP管理进程与代理进程之前为了交互信息,定义了5种报文:
get-request操作:从代理进程处提取一个或多个参数值。
get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的。
trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
set-request操作:设置代理进程的一个或多个参数值。
实现snmp监控
vim /etc/snmp/snmpd.conf
# sec.name source community
com2sec notConfigUser default 123456 #第一步:设置团体认密码,默认为public
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1 #创建一个view,并对其授权可访问的OID范围
view systemview included .1. #自定义授权,否则zabbix server无法获取数据
access notConfigGroup “” any noauth exact systemview none none #将组notConfigGroup关联至systemview 从而完成对组的授权
systemctl restart snmpd
如何测试OID:
snmpwalk是SNMP的一个工具,它使用SNMP的GET请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。
要使用snmpwalk需要先按照net-snmp软件包中
yum -y install net-snmp-utils net-snmp
snmpwalk -h
USAGE: snmpwalk [OPTIONS] AGENT [OID]
–h:显示帮助。
–v:指定snmp的版本, 1或者2c或者3。
–c:指定连接设备SNMP密码。
–V:显示当前snmpwalk命令行版本。
–r:指定重试次数,默认为0次。
–t:指定每次请求的等待超时时间,单为秒,默认为3秒。
–l:指定安全级别:noAuthNoPriv|authNoPriv|authPriv。
–a:验证协议:MD5|SHA。只有-l指定为authNoPriv或authPriv时才需要。
–A:验证字符串。只有-l指定为authNoPriv或authPriv时才需要。
–x:加密协议:DES。只有-l指定为authPriv时才需要。
–X:加密字符串。只有-l指定为authPriv时才需要
在主服务器上安装snmp
yum -y install net-snmp net-snmp-utils
在主服务器上查看客户机上内存
snmpwalk -v 2c -c public 192.168.240.11 .1.3.6.1.4.1.2021.4.4.0
CPU 负载:
1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3
内存使用:
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
系统信息:
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
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
在web上操作
更改自动发现时间,不宜太长