前言:检测服务器运行情况是线上环境最重要的环节,人为监控难免疏忽,而且浪费人力物力。于是研究起了自动化检测软件,Zabbix。
首先提供zabbix中文手册:https://www.zabbix.com/documentation/3.4/zh/manual
这里只会编写笔者在学习Zabbix过程的遇到的问题。
2020/3/11编撰:
一、设置中文
以下界面是我们安装之后访问页面,默认是英文的。oh真让人头疼。
Zabbix很友好的提供了中文语言。点击右上方小人-》Language-》选择Chinese-》点击update即可。并且中文的很全面,不会是那种零零碎碎的。
二、安装agent
手册中并没有给出安装agent这一步,我们可以点进dockerhup中就可以看到介绍。
docker run --name zabbix-agent \
--link zabbix-server-mysql:zabbix-server \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e ZBX_SERVER_PORT=10051 \
-e ZBX_HOSTNAME="zabbix_agent" \
-v /dev/sdc:/dev/sdc \
-p 10050:10050 \
-d zabbix/zabbix-agent
其次是如果是同一台服务器上配置server和agent将会使用到容器ip,查看容器ip,使用如下指令
docker inspect 容器ID |grep IPAddress
不建议使用docker安装agent,安装在容器中的agent监控的是容器的状态,而不是宿主机的状态!
三、配置监控项
笔者写在这篇文章时候版本已经为Zabbix 4.4.6
而手册默认是3.4,想查看4.2版却发现并未编写...跟着3.4版学习,在配置监控项时说使用如下指令
一直提示invalid first parameter,这个命令在4.x版本已经改变了,可以查看key文档https://www.zabbix.com/documentation/3.4/zh/manual/config/items/itemtypes/zabbix_agent
然后我又发现还是提示invalid first paramete,不用着急,勾选监控项,点击现在检查。
然后稍等几分钟就可以了。
笔者后来发现其实原本的system.cpu.load也是可以用的...这就很神奇了~
四:刷新时间
这里的图表刷新时间和设置控制项里的更新时间没有半毛钱关系,真正有关系的是这是中文时候的那个页面里的刷新时间。
控制相里的更新时间决定的是数据的更新时间,建议这两个设置为同一时间。
中间一点一点的是因为我把更新时间设置了10s,而刷新时间是1s,导致数据更新不及时。
五:时间问题
在查看最新数据时候,我发现时间并不对,原来是容器里的时间采用的是UTC标准时区,和我们北京时间差了8小时,这怎么行!
这里就很麻烦了,由于笔者不是用DockerFile构建的,只能重新运行容器挂载 -v /etc/localtime:/etc/localtime:ro
这里有人说直接docker cp 把localtime复制到容器内 我发现是不可以的。localtime本质只是个链文件。
问题又来了,我发现这个时间和我容器的时间还是不一致的。那么这个服务器时间又是哪里来呢?
通过不断研究,终于找到了问题所在。
在web容器内执行如下命令
grep -r "timezone" /etc/php7/
我这里是已经改过来了,你们的应该还是Europe/Riga,使用vi命令修改99-zabbix-ini文件,改成Asia/Shanghai
然后还需要找到php-fpm7这个进程,kill了它,它会立刻重启。
回到页面刷新~见证奇迹的时刻!服务器时间就和我们北京时间同步啦!至于和容器时间相不相关这里我就不再验证了,个人感觉应该是无关的,可以给我评论说一下你的情况。
2020/3/12第二次编撰:
六:触发器显示触发器状态
根据手册前往监控(Monitoring) → 触发器(Triggers)以查看,发现找不到触发器这个地方。我们来到问题,修改过滤器,点击应用就可以看到了。
可以适当的修改表达式的值,满足我们看到效果的小欲望。avg(时间,单位为s),然后去服务器根目录执行find指令,当find指令执行结束后,会自动变回已解决,并闪烁。
{host:system.cpu.load.avg(10)}>0.3
七:发送邮件login denied
一开始我是用qq邮箱,发现一直login denied,还没有报错状态码,无语弄了好久,最后换了163邮箱就可以了。
2020/3/13更新:
八:监控mysql
昨天捣鼓了一天,都没找到docker agent 监控 docker mysql的。后来意识到这貌似不太可能,因为docker agent里面压根用不了宿主机的环境变量。也就是说不建议使用docker安装agent,直接用宿主机安装agent问题就迎刃而解,(怪不得官方文档没有说如何用docker安装agent容器!)
举一反三监控其他应用也是这个说法。
很感谢大佬的一语道破,安装在容器中的agent监控的是容器的状态,而不是宿主机的状态!
2020/3/17更新:
九:发送短信
发送短信最大的坑就是换行符的问题,会出现CRLF ->LF 问题。因为window的换行符是 \r\n 而 linux换行符是 \n 。\r在Linux、unix 中表示返回到当行的最开始位置。于是就会出现覆盖错误。并且我本人使用的是云通信平台,本身也不允许使用换行符,于是在content中使用tr指令删除掉换行符即可。如果你的平台可以使用换行符,可以用tr的替换指令替换为\n。
下面 贴出我的脚本代码
#!/bin/bash
LOGFILE="/var/log/smslog/log.log"
:>"$LOGFILE"
exec 1>"$LOGFILE"
exec 2>&1
#----------------初始化参数---------------------------
#appId
appId="xxx"
#token
token="yyy"
#userId
userId="zzz"
#templateId
templateId="uuu"
#------------------------------------------------------
#-----------------传入参数-----------------------------
#手机号
mobile=$1
# 项目
project=$2
# 网址
url=$3
# 内容
content=`echo $4 |tr -d '\r\n'`
#------------------------------------------------------
#--------------