数据采集
Server
数据库
Web 界面
Proxy
Agent
数据流
zabbix监控采用lamp架构平台,由于监控只有运维几个人看,并不需要高并发,apache更加稳定且配置简单,因此采用lamp平台,架构不一样要高性能要合适才行。
zabbix架构流程首先在zabbix-web前端页面上添加主机并添加监控项,存放到数据库后,zabbix-server会定期每隔60s同步数据库,获取最新监控项、监控指标,获取后与安装了zabbix-agent的客户端进行监控,zabbix-agent将监控的指标推送给zabbix-server,zabbix-server进行分析指标数据,与运维设置的指标进行对比,如果达到了一定指标则将数据入库,最后在zabbix-web前端页面进行展示。
使用工具/系统说明
工具/系统说明 | 版本型号 | 其他说明 |
---|---|---|
测试机 | Windows10本地主机 | |
服务器 | CentOS7 | IP:192.168.111.211网络连接方式:NAT |
客户端 | CentOS7 | IP:192.168.111.212网络连接方式:NAT |
VMware | 16.1.2 build-17966106 | 虚拟网络设置网段:192.168.111.0网关:192.168.111.2 |
测试浏览器Chrome | 102.0.5005.63(正式版本) | 安装在本地测试机上 |
在查询官方文档的时候发现Zabbix可以使用容器的方式进行安装,又因为docker比较新,想使用docker容器的方式完成,所以我们需要在虚拟环境CentOS7上安装docker,具体步骤如下。
使用命令sudo yum update
将安装的软件都更新一遍,避免遇到一些不兼容的问题。
在执行这条命令的时候,遇到了一个问题,报错内容如下图所示
产生的原因就是我再修改网卡的配置文件的时候,没有配置DNS,这里只需要在网卡配置文件里加上就好了。
更新完成后,我们使用命令yum install docker
来安装docker环境,在跳出来的提示内容输入y
就可以了。
在安装完成后,我们输入命令 systemctl enable docker
,将docker容器设置为开机自启,然后使用命令docker run hello-world
,进行测试验证docker是否安装成功(这里建议先进入超管角色在进行执行,避免报错,进入方法,输入su
,然后输入密码就可以进入超管角色了),验证结果如下图则表示安装成功了:
官方文档是运行 MySQL 数据库支持、基于 Nginx Web 服务器的 Zabbix Web 界面和 Zabbix Java gateway进行部署,那么我们首先启动mysql实例,密码我设置成1230,具体命令如下:
docker run --name mysql-server -it \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="zabbix" \-e MYSQL_PASSWORD="1230" \-e MYSQL_ROOT_PASSWORD="1230" \-d mysql:8.0 \--character-set-server=utf8 --collation-server=utf8_bin
安装完成后我们进行测试,输入命令docker exec -it mysql-server /bin/bash
进入到刚才的mysql-server,输入命令进行登录,命令如下:
mysql -uzabbix -p1230
输入show databases
查看数据库,可以看到zabbix这张,即如图所示则配置成功。
按下Ctrl+D
退出docker环境。
接下来启动 Zabbix Java gateway 实例,命令如下所示:
docker run --name zabbix-java-gateway -itd \-d zabbix/zabbix-java-gateway:latest
然后,启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例,这里的数据库,用户名以及密码都要和上面的mysql-server容器相符合,端口使用10051/TCP,命令如下所示:
docker run --name zabbix-server-mysql -it \-e DB_SERVER_HOST="mysql-server" \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="zabbix" \-e MYSQL_PASSWORD="1230" \-e MYSQL_ROOT_PASSWORD="1230" \-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \--link mysql-server:mysql \--link zabbix-java-gateway:zabbix-java-gateway \-p 10051:10051 \-d zabbix/zabbix-server-mysql:latest
最后,启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例,同样用户名密码和容器名称一定要一致,端口使用80/TCP,这里要注意,在容器中nginx的端口为8080,所以下面写的时候要注意,这被官方文档害惨了,官网文档默认nginx在容器中的监听端口为80,具体在后面的内容中体现。命令如下图所示:
docker run --name zabbix-web-nginx-mysql -it \-e DB_SERVER_HOST="mysql-server" \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="zabbix" \-e MYSQL_PASSWORD="1230" \-e MYSQL_ROOT_PASSWORD="1230" \--link mysql-server:mysql \--link zabbix-server-mysql:zabbix-server \-p 80:8080 \-d zabbix/zabbix-web-nginx-mysql:latest
命令执行完后我们得到如下图所示情况,则为安装成功成功:
这里可以看到有一个报错,不用管,这是我在安装的时候遇到的报错,是之前安装mysql容器时版本选了5.7,然后不兼容的问题,我上面的代码已经改过了,所以不用太在意,具体问题内容我写在最下面。
我们在测试机中输入地址192.168.111.211:80,应该会进入zabbix的首页,表示安装成功,如下图所示:
输入用户名 Admin 以及密码 zabbix 以作为 zabbix超级用户登陆。能够进入主界面并出现如下图所示界面表示正确登录:
这里我们可以看到有条Problems提示,提示为Zabbix anent is not available
。其实就是没有安装zabbix_agent,起初我以为是java防火墙的问题,找了半天,后面在晚上睡觉的时候想到这个事情,在官方的文档里,到上面安装完zabbix_web_server_mysql的步骤就结束了,但是这个zabbix_agent就没有安装过,我一直以为是server容器内部自带的代理。换了个思路,去网上找了一下zabbix_agent的安装。至于为什么没想到这个,是因为前一天从博客找资料也好,官网找资料也好,都是到安装完zabbix_web_server_mysql容器就结束了,其他的都没多说,真是无语。
首先,在服务器中下载zabbix_agent,执行命令如下:
拉取安装文件
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm #拉取二进制文件
安装文件拉取完成后进行安装
yum install zabbix-agent -y
安装完成后,我们使用命令,查看我们的zabbix-server-mysql容器的ip地址和网关,将其记下来,在下面的配置中需要填写,命令如下:
docker inspect zabbix-server-mysql | grep IPAddress
docker inspect zabbix-server-mysql | grep Gateway
上图可以看到我们的服务地址为`172.17.0.4`,网关为`172.17.0.1`,这里理论上是连通的,如果不放心可以ping以下这个服务的地址,我就不演示了。
进行下一步配置。zabbix-agent端配置
vim /etc/zabbix/zabbix_agentd.conf
这里我们键入?
然后输入我们要查找的字符进行修改就行,地址就是上面查询出来的172.17.0.4,也就是zabbix服务的地址。要修改的内容如下:
Server=172.17.0.4 #zabbix server的地址
ServerActive=172.17.0.4 #同样是zabbix_server的地址
Hostname=Zabbix server #本机主机名,在zabbix-web端配置主机时需要填写,默认的就是Zabbix server,你们视情况更改。
ListenPort=10050 #监听端口
保存退出就行,启动zabbix_agent,设置开机自启,命令如下:
systemctl start zabbix-agent.service #开启zabbix-agent服务
systemctl enable zabbix-agent.service #设置zabbix-agent开机自启
然后我们打开网址,输入我们服务地址,打开zabbix页面,左侧导航栏【configuration】->【Hosts】->点击服务名称【Zabbix server】,我是修改正确了才写的博客,所以下面我的是绿标正确的,不用太在意。如下图所示:
在弹出的配置窗口中,输入我们刚才查询到的网关,然后按下回车就行。如下所示:
配置完后,我们的标志就会变绿,就表示配置正确。
我们在【Monitoring】->【Hosts】->找到我们的主机记录->点击【Graphs】就可以看到我们监控的主机内容,图表呈现。
如上图所示,我们可以筛选监控的时间段,我为了展示的更加直观,选择了最近15分钟的内容进行展示。接下来的几张图片进行展示内存,硬盘,网络的监控。
zabbix监控硬盘
按照顺序,【configuration】->【Hosts】->找到要监控的记录点击【Items】->点击右上角的【Create item】,在弹出的界面中进行填写,Key:log[/var/log/messages,192.168.111.1]
。意思是监控系统日志中是否出现192.168.111.1,有则报警。Log time format:MMpddphh:mm:ss
就对应日志中的时间格式,具体如下图所示:
为了获取到信息,需要让被读取的文件,也就是/var/log/messages
文件要让zabbix有可读权限,我这里在命令行使用chmod 777 /var/log/messages
命令给了最高权限(需要配置的可以百度找一下命令)。
左侧导航栏选中【Monitoring】->【Latest data】->在记录中找到我们刚才创建的监控记录
可以看见,我们已经能够成功监控到日志记录了。点击记录名称【System Logs Item】->选中【Values】点击,然后我们可以在弹出窗口中看到更多的信息。如下图所示:
至此,日志监控配置完成。
首先选中【Configuration】->【Discovery】->选中右上角的【Create discovery rules】进行添加,如下图所示:
这里要带星号的都要输入,【IP range】就是你要检查的IP范围,和服务器同一网段的范围是【192.168.111.1-254】,所以我填的是这个,你们注意更改。然后检查规则Checks中点击Add,然后我们【Check Type】选择【Zabbix_agent】,【Port range】输入【10050】(因为zabbix_agnet默认监听端口为10050,可以视情况而定),【Key】输入【system.uname】,【Update time】最好是设置成1m,方便直观的款到自动发现主机并添加,我这里默认1h忘改了,dont‘t care。具体如下图所示:
其余可以默认,然后点击添加。因为这里系统创建时默认有一个,我就直接拿来用了,添加完应该时下图所示这样的。
选中【Configuration】->【Action】->点击【Discovery action】,然后点击右上角的【Create action】,在弹出的窗口中进行自动发现动作添加,如下所示内容的填写:
设置完成后,点击添加,这里就是自动根据规则发现主机,将他添加到zabbix-web中然后根据你的Operation规则,对新加进来的主机进行操作。这里也同样有一个默认的规则,我就进行修改之后开启,结果如下:
开启之后,新启动一个虚拟机,安装好zabbix-agent服务,配置好配置文件的IP后重启一下zabbix-agent.service,IP要设置成zabbix-server-mysql安装的这台主机的地址,我另一台主机的IP为192.168.111.212,然后关闭防火墙和selinux,我们等待刷新,就可以看到在主机列表中,新添加了一条主机记录
首先我们打开监控项,找到zabbix-agent的配置文件进行如下修改:
UnsafeUserParameters=1
UserParameter=check_process[*],/bin/bash /scripts/check_process.sh $1
然后重启zabbix-agnet服务
systemctl restart zabbix-agent.service
创建目录编写脚本
cd /etc/zabbix
mikdir scripts
cd scripts
vim check_process.sh
填写如下内容:
#!/bin/bash
process_status=$(ps -ef|grep -Ev "grep|$0"|grep -c $1)
if[$process_status -eq 0 ];then
echo '1'
else
echo '0'
fi
赋予权限
chmod +x check_process.sh
然后我们在监控端页面上配置【configuration】->【Hosts】->选中主机的Item点击,然后右上角创建,创建内容如图所示:
然后点击上方的Triggers,创建报警,报警规则为高创建内容如图所示:
这里不知道为什么,报警弹不出来,显示的时Unknown,花了太多时间做这个了,这部分就不加以验证了。
问题1
都安装完成后发现zabbix-server-mysql服务开启失败,docker ps -a
命令可以看到服务没开启。
使用命令docker logs zabbix-server-mysql
查看日志发现如下报错:
Unable to start Zabbix server due to unsupported MySQL database server version (5.07.38)
Must be at least (8.00.0)
这里说我使用的mysql版本太低了,确实,官方给出的教程安装的就是5.07,所以就没考虑版本,这里只要把原来的mysql容器删掉,然后使用如下命令就可以:
docker rm -f mysql-server
#把mysql-server删除了
拉取的时候标明版本号8.0
docker run --name mysql-server -t \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="zabbix" \-e MYSQL_PASSWORD="1230" \-e MYSQL_ROOT_PASSWORD="1230" \-d mysql:8.0 \--character-set-server=utf8 --collation-server=utf8_bin
将刚才上面两个zabbix-server-mysql和zabbix-web-nginx-mysql两个容器删除重新创建就可以了。
问题2
所有容器都配置完成后,没法打开,无法映射到端口上。但是明明在创建的时候都配置了,找了半天找不到,想想会不会是nginx代理的问题,然后进入到zabbix-web-nginx-mysql这个容器里面,使用命令
docker exec -it zabbix-web-nginx-mysql /bin/bash
然后使用命令cat /etc/zabbix/nginx.conf
命令查看nginx代理监听的端口,发现在容器中nginx监控的端口为8080,如下所示,真无语,官方的文档还会有这种错误。
然后就好办了,删除创建的zabbix-web-nginx-mysql容器,创建一个新的容器,端口以-p 80:8080 (指定端口映射,格式为:主机(宿主)端口:容器端口) 下就行,如下所示:
docker run --name zabbix-web-nginx-mysql -it \-e DB_SERVER_HOST="mysql-server" \-e MYSQL_DATABASE="zabbix" \-e MYSQL_USER="zabbix" \-e MYSQL_PASSWORD="1230" \-e MYSQL_ROOT_PASSWORD="1230" \--link mysql-server:mysql \--link zabbix-server-mysql:zabbix-server \-p 80:8080 \-d zabbix/zabbix-web-nginx-mysql:latest
问题3
安装好了使用Admin账号进去后,发现主机的数据是监控不到的,服务没用,提示Zabbix anent is not available
,看了以下问题,出现如下提示:
这里就是提示代理监控不到,这里在官网的步骤里,就只到了安装完容器结束,但是关于zabbix_agent的安装没怎么说,要监控到主机就要安装zabbx_agent代理服务,然后才能进行监控,步骤如下:
拉取安装文件
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm
安装文件拉取完成后进行安装
yum install zabbix-agent -y
安装完成后,我们使用命令,查看我们的zabbix-server-mysql容器的ip地址和网关,将其记下来,在下面的配置中需要填写,命令如下:
[root@localhost yby]# docker inspect zabbix-server-mysql | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
[root@localhost yby]# docker inspect zabbix-server-mysql | grep Gateway
"Gateway": "172.17.0.1",
"IPv6Gateway": "",
"Gateway": "172.17.0.1",
"IPv6Gateway": "",
这里我们得到的服务的地址和防火墙为172.17.0.4,172.17.0.1,我们可以主机尝试ping以下172.17.0.4这个地址,查看能否ping通,按理是能得。
然后记住,进行下一步配置。
zabbix-agent端配置
vi /etc/zabbix/zabbix_agentd.conf
这里我们键入?然后输入我们要查找的字符进行修改就行,地址就是上面查询出来的172.17.0.4,也就是zabbix服务的地址。
Server=172.17.0.4 #zabbix server的地址
ServerActive=172.17.0.4 #同样是zabbix_server的地址
Hostname=Zabbix server #本机主机名,在zabbix-web端配置主机时需要填写,默认的就是Zabbix server,你们视情况更改。
ListenPort=10050 #监听端口
保存退出就行,启动zabbix_agent,设置开机自启
systemctl start zabbix-agent.service
systemctl enable zabbix-agent.service
然后我们打开网址,输入我们服务地址,打开zabbix页面,左侧导航栏【configuration】->【Hosts】->点击服务名称【Zabbix server】
在弹出的配置窗口中,输入我们刚才查询到的网关,然后按下回车就行。如下所示:
然后我们就能监控到服务器的硬件信息了。
问题4
电脑突然没电自动关机了,然后重启电脑的时候,连接不上容器了,检查过防火墙都是关着的,然后就决定将容器全部删除之后重新创建一遍,但是遇到了如下提示:
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint zabbix-server-mysql (9fde47cfaee4766cfbbfe477a371edfc56aeebbd4759f1a5e83ffb7e1e9f08e4): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 10051 -j DNAT --to-destination 172.17.0.4:10051 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
解决办法:
将docker容器重启后再创建一遍
systemctl restart docker
docker restart zabbix-server-mysql
问题5
日志监控时配置完成后提示
zabbix Accessible only as active check
这里需要设置为主动模式,要选择Zabbix_agent(Active)。
如果设置完还是提示报错,要把监控的日志文件权限给出来,我这里直接设置了chmod 777 文件路径,因为图方便,就先这样设置权限,之后就能够看到日志信息了。
做的时候遇到不少问题,耐着性子解决吧,如果博客内容有什么问题可以私信,希望有用。