ZABBIX-实战项目
为什么要监控
监控是整个运维乃至整个产品生命周期中重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问题。
对系统不间断实时监控
实时反馈系统当前状态
保证服务可靠性安全性
保证业务持续稳定运⾏
企业常见监控工具
cacti:擅长出图,添加监控项很繁琐
nagios:可以添加监控项,但不可图形化
ganglia:分布式集群监控系统,适合于对上千台大型规模集群进行监控,性能成本比较低,批量管理更加方便,但不支持告警。
zabbix:基于web,提供分布式方式监控网络和系统参数,出图美观,支持告警
promethus:适合于监控k8s
ELK:日志监控
zabbix工作原理
Agentd安装在被监控的主机上,Agent负责定期收集客户端本地各项数据,并发送至Zabbix Server端,Zabbix Server收到数据,将数据存储到数据库中,用户基于Zabbix WEB可以看到数据在前端展现图像。
当Zabbix监控某个具体的项目,该项目会设置一个触发器阈值,当被监控的指标超过该触发器设定的阈值,会进行一些必要的动作,动作包括:发送信息(邮件、微信、短信)、发送命令(SHELL 命令、Reboot、Restart、Install等)
1.硬件监控 路由器、交换机、防⽕墙、服务器
2.系统监控 Windows/Linux CPU、内存、磁盘、⽹络、进程、TCP
3.服务监控 nginx、php、tomcat、redis、memcache、mysql
4.WEB监控 请求时间、响应时间、加载时间、
5.⽇志监控 ELk(收集、存储、分析、展示) ⽇志易、阿里云日志系统
6.安全监控 Firewalld(限制来源的ip)、WAF(Nginx+lua)、安全宝、⽜盾云、安全狗
7.⽹络监控 smokeping 多机房、监控宝、全国各地实时延迟
8.业务监控 活动引⼊多少流量、产⽣多少注册量、带来多⼤价值
安装部署环境
安装部署服务端
1.关闭防火墙和禁用selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i "s/SELINUX=.*/SELINUX=Disabled/" /etc/selinux/config
setenforce 0
或者放行相关端口:
firewall-cmd --permanent --zone=public --add-port=10050/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=10051/tcp
firewall-cmd --reload
2.安装zabbix5.0的rpm源
官方源地址:
repo.zabbix.com
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sed -i 's#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo
yum clean all
3.安装软件包
安装 zabbix server 和 agent
yum install zabbix-server-mysql zabbix-agent -y
安装 Software Collections,便于后续安装高版本的 php,默认 yum 安装的 php 版本为 5.4 过低
yum install centos-release-scl -y
启用 zabbix 前端源,修改vi /etc/yum.repos.d/zabbix.repo,将[zabbix-frontend]下的 enabled 改为 1
[zabbix-frontend]
...
enabled=1
...
安装 zabbix 前端和相关环境
yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl -y
数据库安装
1.安装mariadb数据库
yum install mariadb-server -y
systemctl enable --now mariadb
mariadb设置root密码
mysqladmin -uroot password admin
使用 root 用户进入 mysql,并建立 zabbix 数据库,注意数据库编码
create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by 'zabbix';
grant all privileges on zabbix.* to zabbix@localhost;
##create user zabbix@localhost identified by 'zabbix'; 如果连不上数据库可以加上这两行
##grant all privileges on zabbix.* to zabbix@'%';
quit;
导入初始架构和数据,zabbix 数据库用户为 zabbix,密码为 zabbix
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
导入成功,如下图:
配置zabbix server数据库连接:
修改 zabbix server 配置文件vi /etc/zabbix/zabbix_server.conf 里的数据库密码
vi /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
配置zabbix前端php-fpm:
编辑配置文件 vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf, add nginx to listen.acl_users directive.
listen.acl_users = apache,nginx
php_value[date.timezone] = Asia/Shanghai
Nginx端配置
nginx配置1:
编辑配置文件 vi /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf, uncomment and set 'listen' and 'server_name' directives.
# listen 80;
# server_name localhost;
nginx配置2:
注释listen,server_name,root等默认配置
vim /etc/opt/rh/rh-nginx116/nginx/nginx.conf
server {
# listen 80 default_server;
# listen [::]:80 default_server;
# server_name _;
# root /opt/rh/rh-nginx116/root/usr/share/nginx/html;
# Load configuration files for the default server block.
# include /etc/opt/rh/rh-nginx116/nginx/default.d/*.conf;
启动相关服务,并配置开机自动启动
systemctl start zabbix-server rh-php72-php-fpm rh-nginx116-nginx
systemctl enable zabbix-server rh-php72-php-fpm rh-nginx116-nginx
使用浏览器访问http://ip/zabbix 即可访问 zabbix 的 web 页面
默认登陆账号密码:Admin---zabbix
安装部署zabbix-agent2
zabbix-agent2作为一款新的agent,未来可能会替代原有的agent
特性:
降低了TCP连接数量,也就是降低了资源消耗
用go语言开发,集成了zabbix-agent原有功能,并且易于通过插件扩展第三方功能
1)配置yum源
rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
2)安装zabbix-agent2:
yum install -y zabbix-agent2
rpm -ql zabbix-agent2 //查看相关文件
egrep -v '^#|^$' /etc/zabbix/zabbix_agent2.conf //查看配置文件
3)配置 Zabbix-Agent 指向 Zabbix-Server
[root@m02 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.198.128
4)启动 Zabbix-Agent , 默认监听在 10050 端⼝
[root@m02 ~]# systemctl start zabbix-agent2
[root@m02 ~]# systemctl enable zabbix-agent2
[root@m02 ~]# netstat -lntp
zabbix添加监控主机
web界面介绍:
主机-->监控项-->模板-->触发器-->执行动作-->告警媒介
1)配置ZabbixWeb⻚⾯,点击配置->选择主机->创建主机
zabbix添加监控项
有时候server端中自带的模板没有提供我们所需要的监控项,就需要我们手动进行添加监控项
客户端自定义监控取值-->服务端web获取监控项键值
1)简单的自定义监控配置(单一服务状态)
原理:
编辑客户端配置文件,新增UserParameter=
举例:监控nginx服务是否启动(ps -ef |grep -c [n]ginx)
方式一,直接修改/etc/zabbix/zabbix_agent.conf配置文件参数:
vim /etc/zabbix/zabbix_agent2.conf
UserParameter=web_state,ps -ef |grep -c [n]ginx
方式二:在/etc/zabbix/zabbix_agent2.d/目录下编写自定义监控文件
vim web_server.conf
## UserParameter=键(变量名),值(变量信息)
UserParameter=web_state,ps -ef|grep -c [n]ginx
重启服务:
systemctl restart zabbix-agent2
在服务端中测试:
yum install -y zabbix-get
zabbix_get -s 192.168.81.162 -k 'web_state'
WEB配置:
创建监控项
配置---主机---选择设置监控项的主机---进入【监控项】---【创建监控项】
监控项页面配置:
名称:设置监控项名称web_server_status→ 键值:设置定义好的监控项web_state→ 信息类型:指定监控输出信息字符类型
→ 单位:指定输出内容单位信息→ 更新间隔时间:默认30s→ 创建新的应用集:server-status(将新的监控项添加到新的应用集中)
检查是否收集到监控信息:
监测→ 最新数据→ 应用集:筛选server_status
2)复杂的自定义监控配置(多个服务状态)
监控一台主机上的多个服务的状态,比如nginx,ssh,mysql等等多个服务的状态信息,我们可以在在/etc/zabbix/zabbix_agent2.d/目录下定义多个服务配置文件,当然,这样比较麻烦,我们可以通过以下方法简化配置:在/etc/zabbix/zabbix_agent2.d/下,定义一个传参的配置文件,然后在WEB中,分别配置不同服务的监控项,这样就节约了agent端配置多个配置文件的时间。
举例:
将上面实验1中的web_server.conf 改名为server_state.conf
# cd /etc/zabbix/zabbix_agentd.d/
# mv web_server.conf server_state.conf
# vim server_state.conf
UserParameter=server_state[*],ps -ef|grep -c $1
在zabbix-server命令测试
zabbix_get -s 172.16.1.7 -k 'server_state[ssh]'
在WEB中新建不同的监控项
以监控ssh服务状态为例:
查看监测结果:
同理可以定义其它服务如:nginx,mysqld等等监控项
zabbix添加告警
1)页面报警
创建触发器(配置---主机---选择相应监控主机触发器---创建触发器)
设置表达式:
#{监控主机名称:键值名称.调用的表达式函数}<=2
{m02:server_state[nginx].last()}<=2
参数说明:
last() 收集到最新信息(数值) *****
max() 在一定周期内,收集到的最大值
min() 在一定周期内,收集到的最小值
diff() 在一定时间内,判断收集的信息是否不同
change() 在一定时间内,判断收集的信息是否不同
avg() 取一段时间的平均值
至此: 已经看到提示报警
2)邮件告警
实验nginx挂了将告警信息发送到邮箱
添加报警媒介,类型为Email,这里查了很多博客,全是以mailx为主的,需要配置脚本,其实我觉得直接用zabbix自己的email就可以,以163邮箱为例,先在web界面上创建一个email报警媒介,
发送测试邮件
假设nginx服务停止了,我们要通过配置里面的动作选项,经过动作里面的设置,让指定用户通过报警媒介发送邮件给指定负责人,刚刚配置好了报警媒介,现在配置动作:
可以将通过不同的分组将不同级别的报警进行分组发送,通过操作步骤将报警升级:比如,1h内责任人未进行报警处理,那么就自动进行第二步操作将告警发送给上级领导
配置 操作:
故障{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}
现在配置好了动作,最后需要配置指定用户发送邮件给负责人,指定用户在动作选项已经选择超级管理员Admin,现在选择user setting配置
3)钉钉告警
实验nginx挂了将告警信息发送到钉钉
先添加钉钉机器人, 将Webhook复制,填写到下面脚本中
还需设置安全设置,我这只把zabbix-server地址填进去,这样就禁止其他IP使用webhook
配置钉钉机器人脚本,钉钉Webhook代码:
vim /usr/lib/zabbix/alertscripts/dingding.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests,json,sys,os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "webhook地址"
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
"at": {
"atMobiles": [
"186..." #需要@群里谁
],
"isAtAll": True #是否全部@,True为是,False为否
}
}
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
text = sys.argv[1]
msg(text)``
在zabbix-server的配置文件找到 ,进入对应的文件目录/usr/lib/zabbix/alertscripts,这里是存放zabbix脚本的地方,web端可以通过执行此目录修下的脚本,将脚本内容copy到dingding.py,给他执行权限 chmod +x dingding.py
记住脚本放置位置:
AlertScriptsPath=/usr/lib/zabbix/alertscripts
测试钉钉脚本:
钉钉信息:
配置报警媒介
在web端配置钉钉脚本媒介
脚本参数:https://www.dell.com/zh-cn
{ALERT.MESSAGE}
配置动作
接下来就是配置动作,和邮件一样,只需要更改报警媒介为创建好的“钉钉报警”,最后添加User setting中的报警媒介,和之前一样,在添加一个钉钉报警的
配置用户
配置用户Admin发送邮件:
测试\
4)企业微信告警
https://www.jianshu.com/p/ad72ca92120d
分布式监控:
分布式监控的作用
分担server的集中式压力 Agent > proxy >server
解决多机房之间的网络延时问题 上海 > proxy > server