1.Zabbix简介
组件说明
基于web界面 采用B/S架构
提供分布式系统监控和网络监视功能
企业级开源解决方案
核心组件:
- Zabbix Server
- Zabbix Agent
进程构成
Zabbix安装完成后会产生五个程序:
zabbix_agentd、zabbix_get、zabbix_sender、zabbix_server、zabbix_proxy
zabbix_agentd #客户端守护进程,收集客户端数据;例如:CPU负载、内存、硬盘等使用情况
zabbix_get #zabbix工具,单独使用的命令,通常用于排错
zabbix_sender #在脚本完成后主动提交数据,发送数据给server或proxy
zabbix_server #zabbix服务端守护进程,所有的数据都是被提交或主动提交到zabbix_server端
zabbix_proxy #代理守护进程,功能类似为server,唯一不同的是他只是一个中转站
zabbix_java_gaetway #java网关,只用于java方面,需要另外安装
硬件需求
3.2构建zabbix监控服务器
1.初始化系统设置
# 关闭防火墙
# 关闭selinux
[root@201 ~]# systemctl stop firewalld
[root@201 ~]# systemctl disable firewalld
[root@201 ~]# getenforce
Disabled
2.安装LAMP环境,采用mariadb数据库
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
yum clean all
yum makecache
yum -y install mariadb mariadb-server httpd php php-mysql
systemctl enable httpd
systemctl restart httpd
systemctl enable mariadb
systemctl restart mariadb
# 初始化mariadb
mysql_secure_installation
3.安装zabbix程序
cat <<EOF > /etc/yum.repos.d/zabbix.repo
[zabbix]
name=Zabbix Official Repository - \$basearch
baseurl=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/\$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
[zabbix-non-supported]
name=Zabbix Official Repository non-supported - \$basearch
baseurl=https://mirrors.aliyun.com/zabbix/non-supported/rhel/7/\$basearch/
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
gpgcheck=1
EOF
# 添加gpgkey
curl https://mirrors.aliyun.com/zabbix/RPM-GPG-KEY-ZABBIX-A14FE591 \
-o /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
curl https://mirrors.aliyun.com/zabbix/RPM-GPG-KEY-ZABBIX \
-o /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX
yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
# 初始化数据库
mysql -u root -p
CREATE DATABASE zabbix DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
# 写入数据库
cd /usr/share/doc/zabbix-server-mysql-3.2.1
zcat create.sql.gz | mysql -uroot -p zabbix
# 启动zabbix服务
vim /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
systemctl start zabbix-server
systemctl enable zabbix-server
# 配置zabbix前端php
vim /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Shanghai # 取消注释,修改为亚洲
# 配置时间同步,生产环境中应有一台ntp服务器,集群内的时间同步到ntp服务器上
yum -y install ntpdate
ntpdate cn.pool.ntp.org
# 配置httpd,重启httpd,访问网页安装
vim /etc/httpd/conf/httpd/conf
DocumentRoot "/usr/share/zabbix/"
访问zabbix服务器的IP
新建简单的监控主机
[root@201 /usr/share/zabbix]# systemctl start zabbix-agent
[root@201 /usr/share/zabbix]# systemctl enable zabbix-agent
中文情况下,会出现字符乱码情况
解决办法:
# 在windows下 Win+R 快捷键 --> fonts --> 拷贝宋体到服务器
# 的/usr/share/zabbix/assets/fonts 目录下
cd /usr/share/zabbix/assets/fonts
mv simsun.ttc song.ttf
chmod a+x song.ttf
# 编辑zabbix php页面的配置文件,将graphfont改为song
vim /usr/share/zabbix/include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME','song');
验证:
3.3添加监控主机----自动发现
自动发现的应用场景:
企业批量添加主机时,传统的添加耗时耗力
自动发现规则有主机发起,zabbix server开启发现进程,定时扫描局域网中IP服务、设备,实现自动发现主机、将主机添加到主机组、加载模板、创建图像等。
创建自动发现步骤
配置 ---> 动作 ---> 创建动作 ---> 自动发现 ---> 创建发现规则
添加客户端验证自动发现规则是否生效
yum -y install zabbix-agent
vim /etc/zabbix/zabbix_agentd.conf
Server=10.0.0.201 #zabbix-server服务端IP
ServerActive=10.0.0.20 #zabbix-server服务端IP
Hostname=10.0.0.20 #本机名字随意
# 开启服务
service zabbix-agent start
# 开启httpd服务
service httpd start
3.4Nginx并发监控
# 安装nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
# 利用nginx自带的状态统计功能
`--with-http_stub_status_module`
# 编辑nginx主配置文件,增加状态统计页面
location /nginx_status{
stub_status on;
access_log ogg;
}
1.编写nginx监控脚本,在被监控端
#!/bin/bash
HOST="127.0.0.1"
PORT="80"
# 检测nginx进程
function ping {
/sbin/pidof nginx | wc -l
}
# 检测nginx性能
function active {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null|awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null|awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null|awk NR==3 | awk '{print $3}'
}
# 执行function
$1
2.将自定义的userparameter加入配置文件,然后重启agent
vim /etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.status[*],/server/scripts/nginx-status.sh $1
systemctl restart zabbix-agent
3.server端安装zabbix-get,获取数据
# zabbix_get -s 10.0.0.202 -k 'nginx.status[accepts]'
63
# zabbix_get -s 10.0.0.202 -k 'nginx.status[ping]'
1
4.导入监控模板,在主机中添加模板
3.5钉钉告警
1.钉钉群组内添加自定义机器人
复制生成的webhook
2.编写py脚本,修改webhook为自己生成的
#!/usr/bin/env python
#coding:utf-8
#日志文件:/var/log/dingding.log
import requests,json,sys,os,datetime
webhook="https://oapi.dingtalk.com/robot/send?access_token=cdf07f8b3cb0daa2ee7e9a1cd5dc8487a0233cebe41367c0ebf6821fa2f2c066"
user=sys.argv[1]
text=sys.argv[3]
data={
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
user
],
"isAtAll": False
}
}
headers = {'Content-Type': 'application/json'}
x=requests.post(url=webhook,data=json.dumps(data),headers=headers)
if os.path.exists("/var/log/dingding.log"):
f=open("/var/log/dingding.log","a+")
else:
f=open("/var/log/dingding.log","w+")
f.write("\n"+"--"*30)
if x.json()["errcode"] == 0:
f.write("\n"+str(datetime.datetime.now())+" "+str(user)+" "+"发送成功"+"\n"+str(text))
f.close()
else:
f.write("\n"+str(datetime.datetime.now()) + " " + str(user) + " " + "发送失败" + "\n" + str(text))
f.close()
3.添加执行权限,测试:
chmod +x token.py
./token.py test test "告警"
注意事项
该脚本需要python2.6.6以上版本,且具有requests模块
否则会报错:
[root@201 ~]# ./token.py 1 2 告警
Traceback (most recent call last):
File "./token.py", line 4, in <module>
import requests,json,sys,os,datetime
ImportError: No module named requests
解决办法:
yum -y install epel-release
yum -y install python-pip
pip install requests
4.将脚本放到指定目录下
# cat /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
[root@201 /usr/lib/zabbix/alertscripts]# mv /root/token.py .
5.zabbix web界面配置
创建报警媒介
参数为:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
用户添加报警媒介,点击admin用户
收件人为钉钉群内成员的手机号
添加动作:
错误报警信息参数
# 标题:
故障{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}
错误恢复报警信息参数:
# 标题:
恢复{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}
模拟nginx主机宕机,查看钉钉消息:
查看日志:
------------------------------------------------------------
2020-09-13 09:22:21.747544 18365707729 发送成功
告警主机:10.0.0.202
告警时间:2020.09.13 09:22:18
告警等级:High
告警信息: nginx was down!
告警项目:nginx.status[ping]
问题详情:nginx status PING:Down (0)
当前状态:PROBLEM:Down (0)
事件 ID:110
------------------------------------------------------------