avatar

17.zabbix监控

zabbix监控

第1章 监控知识基本概述

1.1 为什么要使用监控

  1. 对系统不间断实时监控
  2. 实时反馈系统当前状态
  3. 保证服务可靠性安全性
  4. 保证业务持续稳定运行

1.2 如何进行监控,比如我们需要监控磁盘的使用率

  1. 如何查看磁盘使用率 df -h

  2. 监控磁盘的那些指标 block、 inode

  3. 如何获取具体的信息 df -h

  4. 获取的数值到达多少报警 80%

1.3 流行的监控工具

  1. Zabbix

  2. Lepus(天兔)数据库监控系统

  3. Open-Falcon 小米

  4. Prometheus(普罗米修斯, Docker、 K8s)

1.4 如果去到一家新公司,如何入手监控

  1. 硬件监控 路由器、交换机、防火墙

  2. 系统监控 CPU、内存、磁盘、网络、进程、 TCP

  3. 服务监控 nginx、 php、 tomcat、 redis、 memcache、 mysql

  4. Web 监控 请求时间、响应时间、加载时间、

  5. 日志监控 ELk(收集、存储、分析、展示) 日志易

  6. 安全监控 Firewalld、 WAF(Nginx+lua)、安全宝、牛盾云、安全狗

  7. 网络监控 smokeping 多机房

  8. 业务监控 活动引入多少流量、产生多少注册量、带来多大价值

第2章 单机时代如何监控

CPU 监控命令: w、 top、 htop、 glances

%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st us 用户态: 跟用户的操作有关 35% sy 系统态: 跟内核的处理有关 60% id CPU 空闲:

内存监控命令: free

1
[root@ssh-61 ~]*# free -h*              total        used        free      shared  buff/cache   available Mem:           976M        396M        125M        7.4M        454M        392M Swap:            0B          0B          0B

磁盘监控命令: dfiotop

1
2
3
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.80 25.32 33.36 221034 291193
设备名 每秒传输次数 每秒读大小 每秒写大小 读的总大小 写的总大小

网络监控命令: ifconfigrouteglancesiftopnethogsnetstat

1
2
3
4
5
6
7
8
9
单位换算
Mbps 100Mbps/8
MB 12MB
iftop 中间的<= =>这两个左右箭头,表示的是流量的方向。
TX:发送流量、 RX:接收流量、 TOTAL:总流量
#查看 TCP11 中状态
netstat -an|grep ESTABLISHED
netstat -rn # 查看路由信息
netstat -lntup

2.随着时间的推移,用户不断的增多,服务随时可能扛不住会被 oom(out of memory),当系统内存不足的时候,会 触发 oom

  1. 当系统内存不足的时候就会大量使用 swap

  2. 当系统大量使用 swap 的时候,系统会特别卡

注意: 有时可能内存还有剩余 300Mb-500Mb,但会发现 swap 依然被使用

1
2
3
4
[root@ZabbixServer ~]# dd if=/dev/zero of=/dev/null bs=800M
[root@ZabbixServer ~]# tail -f /var/log/messages
Out of memory: Kill process 2227 (dd) score 778 or sacrifice child
Killed process 2227 (dd) total-vm:906724kB, anon-rss:798820kB, file-rss:0kB

3.那单机时代,如何使用 shell 脚本来实现服务器的监控

需求: 每隔 1 分钟监控一次内存,当你的可用内存低于 100m,发邮件报警,要求显示剩余内存

  1. 怎么获取内存可用的值 free -m|awk ‘/^Mem/{print $NF}’

  2. 获取到内存可用的值如何和设定的阈值进行比较

  3. 比较如果大于 100m 则不处理,如果小于 100 则报警

  4. 如何每隔 1 分钟执行一次

1
2
3
4
5
6
7
8
9
10
11
[root@ZabbixServer ~]# cat free.sh
#!/usr/bin/bash
HostName=$(hostname)_$(hostname -i)
Date=$(date +%F)
while true;do
Free=$(free -m|awk '/^Mem/{print $NF}')
if [ $Free -le 100 ];then
echo "$Date: $HostName Mem Is < ${Free}MB"
fi
sleep 5
done

第3章 zabbix 监控快速安装

1.配置zabbix仓库

官方RHEL 7:

1
rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

阿里源:

1
https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

2.安装 Zabbix 程序包,以及MySQLZabbix-agent

1
2
[root@m01 ~]# yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent mariadb-server
[root@m01 ~]# systemctl start mariadb.service && systemctl enable mariadb.service

3.创建 Zabbix 数据库以及用户

1
2
3
4
5
[root@m01 ~]# mysqladmin password 123456
[root@m01 ~]# mysql -uroot -p123456
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
MariaDB [(none)]> flush privileges;

4.导入 Zabbix 数据至数据库中

1
[root@m01 ~]# cat /usr/share/doc/zabbix-server-mysql-4.0.11/create.sql.gz | mysql -uzabbix -pzabbix zabbix

5 编辑/etc/zabbix/zabbix_server.conf 文件,修改数据库配置

1
2
3
4
5
[root@m01-61 ~]# grep "^DB" /etc/zabbix/zabbix_server.conf 
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

6.启动 Zabbix 服务进程,并加入开机自启

1
2
systemctl start zabbix-server.service
systemctl enable zabbix-server.service

7.配置 Apache 的配置文件/etc/httpd/conf.d/zabbix.conf,修改时区

1
2
[root@m01-61 ~]# grep "Shanghai" /etc/httpd/conf.d/zabbix.conf 
php_value date.timezone Asia/Shanghai

8.重启 Apache Web 服务器

1
systemctl start httpd

第4章 WEB界面安装步骤

1.浏览器打开地址:http://10.0.1.61/zabbix/setup.php

2.检查依赖项是否存在异常

3.配置zabbix连接数据库

4.配置 ZabbixServer 服务器的信息

5.最终确认检查

6.安装成功

7.登陆zabbix

默认登陆 ZabbixWeb 的用户名 Admin,密码 zabbix

8.调整字符集为中文

9.修复中文乱码

打开图形之后会发现语言为乱码,原因是缺少字体

解决方法:安装字体并替换现有字体

1
2
yum install wqy-microhei-fonts -y
cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/zabbix/assets/fonts/graphfont.ttf

再次刷新发现已经变成中文了

第5章 Zabbix 监控基础架构

zabbix-agent(数据采集)—>zabbix-server(数据分析|报警)—> 数据库(数据存储)<—zabbix web(数据展示)

第6章 zabbix 快速监控主机

6.1 安装zabbix-agent

1
rpm -ivh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.11-1.el7.x86_64.rpm

6.2 配置zabbix-agent

1
2
3
4
5
6
7
8
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.conf    
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.01.61
ServerActive=127.0.0.1
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

6.3 启动zabbix-agent并检查

1
2
3
4
5
[root@web01 ~]# systemctl start zabbix-agent.service 
[root@web01 ~]# systemctl enable zabbix-agent.service
[root@web01 ~]# netstat -lntup|grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 10351/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 10351/zabbix_agentd

6.4 zabbix-web界面,添加主机

第7章 自定义监控主机小试身手

1.监控需求

监控TCP11种状态集

2.命令行实现

1
2
3
4
[root@web01-7 ~]# netstat -ant|grep -c TIME_WAIT
31
[root@web01-7 ~]# netstat -ant|grep -c LISTEN
19

3.编写zabbix监控文件(传参形式)

1
2
3
4
5
[root@web01-7 ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat TCP.conf
UserParameter=TIME_WAIT, netstat -ant|grep -c TIME_WAIT
UserParameter=LISTEN, netstat -ant|grep -c LISTEN
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# systemctl restart zabbix-agent.service

4.server端进行测试

1
2
3
4
5
6
[root@m01-61 ~]# rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-get-4.0.1-1.el7.x86_64.rpm
[root@m01-61 ~]# yum -y install zabbix-get.x86_64
[root@m01-61 ~]# zabbix_get -s 10.0.1.7 -k TIME_WAIT
34
[root@m01-61 ~]# zabbix_get -s 10.0.1.7 -k LISTEN
19

5.web端添加

6.克隆监控项

7.创建图形

8.查看图形

9.设置触发器

第8章 邮件报警

1.定义发件人

2.定义收件人

img

3.自定义报警内容过

定制报警内容:

https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location

参考博客:https://www.cnblogs.com/bixiaoyu/p/7302541.html

发送警告

1
2
3
4
5
6
7
8
9
10
11
报警邮件标题可以使用默认信息,亦可使用如下中文报警内容
名称:Action-Email
默认标题:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

恢复警告

1
2
3
4
5
6
7
8
9
10
恢复标题:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

第9章 微信报警

1.查看配置文件里的脚本目录路径

1
2
[root@m01-61 ~]# grep "^AlertScriptsPath" /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts

2.将weixin.py放在zabbix特定目录

1
2
3
[root@m01-61 /usr/lib/zabbix/alertscripts]# ll
total 4
-rwxr-xr-x 1 root root 1227 Aug 8 07:40 weixin.py

3.配置发信人

4.配置收信人

5.登陆企业微信公众号添加账户

https://work.weixin.qq.com/wework_admin/loginpage_wx

1.登陆后在企业号上新建应用

2.上传logo,填写应用名称 ,应用介绍等

3.查看启动应用

同时会生成应用的AgentId以及Secret,这个在后面步骤会有用

4.接口调用测试

http://work.weixin.qq.com/api/devtools/devtool.php

这里的corpid为公司ID

Corpsecret就是刚才创建应用生成的Secrt,确认没问题填写进去然后下一步

如果没问题会显示200状态码

6.添加成员

7.关注公众号

8.查看自己的账号

9.修改脚本里的信息

1
2
3
4
5
6
[root@m01 /usr/lib/zabbix/alertscripts]# cat weixin.py 
..............
corpid='微信企业号corpid'
appsecret='应用的Secret'
agentid=应用的id
..............

10.发信测试

1
[root@m01 /usr/lib/zabbix/alertscripts]# python  weixin.py  你的账号  '发信测试'  ‘微信测试消息’

11.微信号上查看

第10章 自定义模版

1.监控TCP11种状态

编写zabbix配置文件

1
2
3
4
5
6
7
8
9
10
11
12
[root@web01 /etc/zabbix/zabbix_agentd.d]# cat tcp_status.conf
UserParameter=ESTABLISHED,netstat -ant|grep -c 'ESTABLISHED'
UserParameter=SYN_SENT,netstat -ant|grep -c 'SYN_SENT'
UserParameter=SYN_RECV,netstat -ant|grep -c 'SYN_RECV'
UserParameter=FIN_WAIT1,netstat -ant|grep -c 'FIN_WAIT1'
UserParameter=FIN_WAIT2,netstat -ant|grep -c 'FIN_WAIT2'
UserParameter=TIME_WAIT,netstat -ant|grep -c 'TIME_WAIT'
UserParameter=CLOSE,netstat -ant|grep -c 'CLOSE'
UserParameter=CLOSE_WAIT,netstat -ant|grep -c 'CLOSE_WAIT'
UserParameter=LAST_ACK,netstat -ant|grep -c 'LAST_ACK'
UserParameter=LISTEN,netstat -ant|grep -c 'LISTEN'
UserParameter=CLOSING,netstat -ant|grep -c 'CLOSING'

或者另一种写法

1
2
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat tcp_status.conf 
UserParameter=tcp_status[*],netstat -ant|grep -c $1

2.重启zabbix-agent

1
systemctl restart zabbix-agent.service

3.测试监控项

1
2
[root@m01-61 ~]# zabbix_get -s 10.0.1.7 -k tcp_status[TIME_WAIT]
147

4.导入模版文件

5.主机关联模版文件

6.查看最新数据

7.查看图形

第11章 自定义模版监控nginx状态

1.开启监控页面并访问测试

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@web01-7 /etc/nginx/conf.d]# cat status.conf 
server {
listen 80;
server_name status.oldboy.com;
stub_status on;
access_log off;
}

[root@web01-7 /etc/nginx/conf.d]# curl status.oldboy.com
Active connections: 1
server accepts handled requests
95 95 111
Reading: 0 Writing: 1 Waiting: 0

2.准备nginx监控状态脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat nginx_monitor.sh 
#!/bin/bash
NGINX_COMMAND=$1
CACHEFILE="/tmp/nginx_status.txt"
CMD="/usr/bin/curl curl status.oldboy.com"
if [ ! -f $CACHEFILE ];then
$CMD >$CACHEFILE 2>/dev/null
fi
# Check and run the script
TIMEFLM=`stat -c %Y $CACHEFILE`
TIMENOW=`date +%s`

if [ `expr $TIMENOW - $TIMEFLM` -gt 60 ]; then
rm -f $CACHEFILE
fi
if [ ! -f $CACHEFILE ];then
$CMD >$CACHEFILE 2>/dev/null
fi

nginx_active(){
grep 'Active' $CACHEFILE| awk '{print $NF}'
exit 0;
}
nginx_reading(){
grep 'Reading' $CACHEFILE| awk '{print $2}'
exit 0;
}
nginx_writing(){
grep 'Writing' $CACHEFILE | awk '{print $4}'
exit 0;
}
nginx_waiting(){
grep 'Waiting' $CACHEFILE| awk '{print $6}'
exit 0;
}
nginx_accepts(){
awk NR==3 $CACHEFILE| awk '{print $1}'
exit 0;
}
nginx_handled(){
awk NR==3 $CACHEFILE| awk '{print $2}'
exit 0;
}
nginx_requests(){
awk NR==3 $CACHEFILE| awk '{print $3}'
exit 0;
}

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;
;;
*)
echo 'Invalid credentials';

exit 2;
esac

3.编写zabbix监控配置文件

1
2
3
4
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat nginx_status.conf 
UserParameter=nginx_status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_monitor.sh $1

[root@web01-7 /etc/zabbix/zabbix_agentd.d]# systemctl restart zabbix-agent.service

4.使用zabbix_get取值

1
2
[root@m01 ~]# zabbix_get -s 10.0.1.7 -k nginx_status[accepts]
7

5.导入模版

6.链接模版

7.查看数据

第12章 自定义模版监控php状态

1.开启监控页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@web01 ~]# tail -1 /etc/php-fpm.d/www.conf    
pm.status_path = /php_status

[root@web01 ~]# cat /etc/nginx/conf.d/status.conf
server {
listen 80;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
}

location /php_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name;
include fastcgi_params;
}
}

[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx.service php-fpm.service

2.访问测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@web01 ~]# curl 127.0.0.1/php_status
pool: www
process manager: dynamic
start time: 08/Aug/2019:22:31:27 +0800
start since: 37
accepted conn: 1
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 4
active processes: 1
total processes: 5
max active processes: 1
max children reached: 0
slow requests: 0

3.准备访问脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat fpm.sh 
#!/bin/bash
##################################
# Zabbix monitoring script
#
# php-fpm:
# - anything available via FPM status page
#
##################################
# Contact:
# vincent.viallet@gmail.com
##################################
# ChangeLog:
# 20100922 VV initial creation
##################################

# Zabbix requested parameter
ZBX_REQ_DATA="$1"
ZBX_REQ_DATA_URL="$2"

# Nginx defaults
NGINX_STATUS_DEFAULT_URL="http://localhost/fpm/status"
WGET_BIN="/usr/bin/wget"

#
# Error handling:
# - need to be displayable in Zabbix (avoid NOT_SUPPORTED)
# - items need to be of type "float" (allow negative + float)
#
ERROR_NO_ACCESS_FILE="-0.91"
ERROR_NO_ACCESS="-0.92"
ERROR_WRONG_PARAM="-0.93"
ERROR_DATA="-0.94" # either can not connect / bad host / bad port

# Handle host and port if non-default
if [ ! -z "$ZBX_REQ_DATA_URL" ]; then
URL="$ZBX_REQ_DATA_URL"
else
URL="$NGINX_STATUS_DEFAULT_URL"
fi

# save the nginx stats in a variable for future parsing
NGINX_STATS=$($WGET_BIN -q $URL -O - 2>/dev/null)

# error during retrieve
if [ $? -ne 0 -o -z "$NGINX_STATS" ]; then
echo $ERROR_DATA
exit 1
fi

#
# Extract data from nginx stats
#
#RESULT=$(echo "$NGINX_STATS" | awk 'print $0;match($0, "^'"$ZBX_REQ_DATA"':[[:space:]]+(.*)", a) { print a[1] }')
#RESULT=$(echo "$NGINX_STATS" | grep "$ZBX_REQ_DATA" | awk -F : '{print $2}')
RESULT=$(echo "$NGINX_STATS" | awk -F : "{if(\$1==\"$ZBX_REQ_DATA\") print \$2}")
if [ $? -ne 0 -o -z "$RESULT" ]; then
echo $ERROR_WRONG_PARAM
exit 1
fi

echo $RESULT

4.准备zabbix配置文件

1
2
[root@web01-7 /etc/zabbix/zabbix_agentd.d]# cat fpm.conf 
UserParameter=php-fpm[*],/etc/zabbix/zabbix_agentd.d/fpm.sh "$1" "$2"

5.使用zabbix_get取值

1
2
[root@m01 ~]# zabbix_get -s 10.0.1.7 -k php-fpm["total processes",http://127.0.0.1/php_status]
5

6.导入模版

导入之后需要修改一下模版里的宏配置

第13章 WEB监控

需求,监控页面状态码

第14章 故障记录

故障1

故障现象:

提示zabbix-server is not running

报错日志:

1
2
34983:20190807:202215.171 database is down: reconnecting in 10 seconds
34983:20190807:202225.172 [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost' (using password: NO)

故障原因:

zabbix-server的配置文件里配有配置数据库密码

故障解决:

添加正确的数据库账号密码信息

1
2
3
4
5
[root@m01 ~]# grep "^DB" /etc/zabbix/zabbix_server.conf     
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

故障2

故障现象:微信报警失败

报错日志:

1
2
3
4
5
6
7
8
9
10
[root@m01 ~]# tail -f /var/log/zabbix/zabbix_server.log 
Problem name: TIME_WAIT过多
Host: web01
Severity: Average

Original problem ID: 51
'": Traceback (most recent call last):
File "/usr/lib/zabbix/alertscripts/weixin.py", line 7, in <module>
import requests
ImportError: No module named requests

问题原因:

缺少模块 requests

问题解决:

安装缺失的依赖包

1
2
3
yum install python-pip
pip install --upgrade pip
pip install requests

故障3

故障现象:

在server端使用zabbix_get命令测试键值命令时提示警告

1
2
3
4
[root@m01 ~]# zabbix_get -s 10.0.1.7 -k ESTABLISHED  
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
2

问题原因:

zabbix_agent是以普通用户zabbix运行的,而普通用户执行netstat -antp时会有警告,网上查找发现只要不是用p参数就可以以普通用户运行

解决方案:

监控脚本里的命令修改为netstat -ant

文章作者: Wu Fei
文章链接: http://linuxwf.com/2020/04/13/17-zabbix%E7%9B%91%E6%8E%A7/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WF's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论