CentOS 安装 Zabbix 5.0

博客作者:联系请点击,搬运不易,希望请作者喝咖啡,可以点击联系博客作者

前言

说明:本文介绍CentOS 8.3 搭建 Zabbix5.0 监控平台安装及相关要求

一、安装要求

内存和磁盘

Zabbix同时需要物理内存和磁盘空间。刚开始使用Zabbix,建议128MB物理内存和256MB可用磁盘空间。然而, 具体需要的内存大小和磁盘空间要根据主机数量和监控参数而定。如果你计划对监控的参数进行长期保存,你应该考虑至少在数据库中预留几个GB的空间,以用来保留历史数据。 每个Zabbix的守护进程需要与数据库服务器建立多个连接。分配给连接的内存数量,取决于数据库引擎的配置。

CPU

根据监控参数及选择的数据库引擎,Zabbix,特别是Zabbix数据库,可能需要大量的CPU资源,

其他硬件

如果需要启用短信(SMS)通知功能,需要串行通讯口(serial communication port)和串行GSM调制解调器(serial GSM modem)。USB转串行转接器也同样可以工作。

关闭NFtables和SElinux

systemctl disable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

安装系统常用软件包

dnf install -y sysstat traceroute  net-tools telnet  tree  \
net-snmp-utils  vim lrzsz tcpdump wget git zip tar

二、安装 Zabbix 服务端

Zabbix 官方源

rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm

替换为阿里云Zabbix源

sed -i '3c baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/8/$basearch/' /etc/yum.repos.d/zabbix.repo

安装 Zabbix 服务端

dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent vim

安装Apache和MariaDB并启动

dnf install -y @httpd @mariadb
systemctl enable --now httpd mariadb

数据库根用户添加密码及安全设置

mysql_secure_installation

步骤如下:

  • 要求你配置VALIDATE PASSWORD component(验证密码组件): 输入y ,回车进入该配置

  • 选择密码验证策略等级, 我这里选择0 (low),回车

  • 输入新密码两次

  • 确认是否继续使用提供的密码?输入y ,回车

  • 移除匿名用户? 输入y ,回车

  • 不允许root远程登陆? 不需要输入y,需要远程登陆输入n ,回车

  • 移除test数据库? 输入y ,回车

  • 重新载入权限表? 输入y ,回车

查询下root是否可以远程登陆,没有就配置一下

mysql -uroot -p

use mysql;
select host,user from user;

配置远程登陆

mysql -uroot -p

use mysql;
update user set host='%' where user='root';
flush privileges;
exit

关闭MySQL主机查询dns

MySQL会反向解析远程连接地址的dns记录,如果MySQL主机无法连接外网,则dns可能无法解析成功,导致第一次连接MySQL速度很慢,所以在配置中可以关闭该功能。

/etc/my.cnf文件,添加配置

echo "[mysqld] 
skip-name-resolve" >> /etc/my.cnf

重启服务

systemctl restart mysqld

创建zabbix数据库,在数据库主机上运行以下内容。

mysql -uroot -p
create database zabbix character set utf8 collate utf8_bin;
show databases;
create user zabbix@localhost identified by 'password';
flush privileges;
grant all privileges on zabbix.* to zabbix@localhost;
quit;

在 Zabbix 服务端主机上导入初始架构和数据。

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

三、启动Zabbix Server进程

zabbix_server.conf 配置说明

  • ListenPort 监听端口,默认10051

  • SourceIP 源ip,默认为空,可以写机器ip地址

    SourceIP=机器ip

  • LogType 日志类型,system\file\console,默认file

  • LogFile 日志路径,默认/var/log/zabbix/zabbix_server.log

    LogFile=/var/log/zabbix/zabbix_server.log

  • LogFileSize 日志大小,0-1024MB,0禁用自动日志轮换

    LogFileSize=0

  • DebugLevel 调试级别,0~5,默认为3显示waring信息

  • PidFile pid文件,默认/var/run/zabbix/zabbix_server.pid

    PidFile=/var/run/zabbix/zabbix_server.pid

  • SockerDir socker文件夹,默认/var/run/zabbix

    SocketDir=/var/run/zabbix

  • DBHOst 数据库地址,默认127.0.0.1

  • DBName 数据库名称,默认 zabbix

    DBName=zabbix

  • DBSchema 数据库dschema,默认 空

  • DBUser 数据库用户,默认zabbix

    DBUser=zabbix

  • DBPassword 数据库密码

    DBPassword=zabbixmysql

  • DBSocket DBScoket地址

  • DBPort 数据库端口,默认为空,

  • HistoryStorageURL 历史存储的HTTP地址

  • HistoryStorageTypes 用逗号分隔的类型列表,uint\dbl\str\log\text

  • HistoryStorageDateIndex 是否历史记录预处理 0 disable,1 enable

  • ExportDir 导出路径

  • ExportFileSize 导出文件大小1M~1G,默认1G

  • StartPollers 预分叉的轮询器实例数,默认5

  • StartIPMIPollers IPMI轮询器数量

  • StartPreprocessors 启动预处理器数量,默认3

  • StartPollersUnreachable 无法访问是轮询次数

  • StartTrappers

  • StartPingers ICMP预习处理数

  • StartDiscoverers 发现者预处理数

  • StartHTTPPollers HTTP查询器预处理数

  • StartTimers 计时器数

  • JavaGateway zabbix网关ip地址或主机名,仅在启动java轮询器时需要

    JavaGateway=机器当前ip

  • JavaGatewayPort zabbix网关的监听端口,默认10052

  • StartJavaPollers java轮询器预处理数

    StartJavaPollers=5

  • StartVMwareCollectors 虚拟收集器的数量

  • SNMPTrapperFile SNMPtrapper文件,从snmp守护进程传递到服务器的临时文件

    SNMPTrapperFile=/var/log/snmptrap/snmptrap.log

  • StartSNMPTrapper 为1,启动SNMPTrapper

  • ListenIP trapper监听的端口列表,用逗号分隔

  • CacheSize 缓存

  • Timeout SNMP服务和外部检查超时时间

    Timeout=4

  • AlertScriptsPath 预警脚本位置

    AlertScriptsPath=/usr/lib/zabbix/alertscripts

  • ExternalScripts 外部脚本路径

    ExternalScripts=/usr/lib/zabbix/externalscripts

  • LogSlowQueries 定义数据库慢查询时长,单位毫秒

    LogSlowQueries=3000

  • StatsAllowedIP 允许访问的ip列表,用逗号分隔0.0.0.0/0代表所有ipv4地址

    StatsAllowedIP=0.0.0.0/0

在zabbix_server.conf中编辑配置

vim /etc/zabbix/zabbix_server.conf
ListenPort=10051
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password

编辑Zabbix前端的PHP配置

PHP 优化,如有需要可根据相关参数进行优化

vim /etc/php.ini 
  • expose_php = Off # 禁止显示php版本的信息

  • short_open_tag = On # 取消前面的;,修改为On。表示支持php短标签

  • cgi.fix_pathinfo=1 # 将注释去掉,开启PHP的pathinfo伪静态功能。

  • post_max_size = 100M # 单提交的最大数据,此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的,默认8M

  • upload_max_filesize = 50M #上载文件的最大许可大小 ,默认2M

  • max_execution_time = 600 # 脚本运行的最长时间,默认30秒

  • max_input_time = 600 # 脚本可以消耗的时间,默认60秒

  • memory_limit = 256M # 脚本运行最大消耗的内存,根据你的需求更改数值,默认128M

  • date.timezone = asia/shanghai #设置时区

sed -i '$a php_value[date.timezone] = Asia/Shanghai' /etc/php-fpm.d/zabbix.conf

启动 Zabbix 服务器和代理进程,并设置开机自启动

systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable --now zabbix-server zabbix-agent httpd php-fpm

Zabbix前端可以在浏览器中通过 http://localhost/zabbix 进行访问。

配置 Zabbix 前端

  1. 输入数据库连接端口,zabbix数据库密码,输入名称

  2. 默认的用户是Admin,密码为zabbix,该用户是超级用户,输入登录信息后,点击Sign In按钮,进行登录 左下角设置可以切换语言

数据库配置,输入数据库连接端口,zabbix数据库密码

Zabbix Server 配置,输入名称

确认配置信息

默认的用户是Admin,密码为zabbix

更换web页面显示语言,切换为zh_CN

解决Zabbix 图形中文乱码

字体文件目录:

zabbix 4.0:/usr/share/zabbix/fonts/
zabbix 4.2:/usr/share/zabbix/assets/fonts/
zabbix5.0:/usr/share/zabbix/assets/fonts

php 脚本文件位置:

/usr/share/zabbix/include/defines.inc.php

我这里安装的是zabbix5.0,进入到/usr/share/zabbix/assets/fonts目录,可以看到一个graphfont.ttf软连接,默认指向/etc/alternatives/zabbix-web-font这个字体文件,由于php配置文件已经配置好了graphfont.ttf,所以这个软连接指向哪个字体文件就使用哪个文件

下载一个微软雅黑字体

cd /usr/share/zabbix/assets/fonts
wget https://raw.githubusercontent.com/chenqing/ng-mini/master/font/msyh.ttf
mv -f msyh.ttf /usr/share/fonts/dejavu/DejaVuSans.ttf
systemctl restart zabbix-server 

四、安装 Zabbix 客户端

关闭NFtables和SElinux

systemctl disable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

安装系统常用软件包

dnf install -y sysstat traceroute  net-tools telnet  tree  \
net-snmp-utils  vim lrzsz tcpdump wget git zip tar

注意:这里需要下载和Zabbix Server版本一致的Zabbix Agent 软件包和Yum源

Zabbix 官方源

rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm

替换为阿里云Zabbix源

sed -i '3c baseurl=https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/8/$basearch/' /etc/yum.repos.d/zabbix.repo

安装 Zabbix 客户端

dnf -y install  zabbix-agent zabbix-sender

配置zabbix_agent.conf客户端

zabbix_agent.conf配置说明

  • PidFile Pid文件

    PidFile=/var/run/zabbix/zabbix_agentd.pid

  • LogType 日志类型,system\file\console,默认file

  • LogFile 日志文件

    LogFile=/var/log/zabbix/zabbix_agentd.log

  • LogFileSize 日志大小,0-1024MB,0禁用自动日志轮换

    LogFileSize=0

  • DebugLevel 调试级别,0~5,默认为3显示waring信息

  • SourceIP 源IP,默认为空,可以写机器IP地址

    SourceIP=机器IP

  • AllowKey 允许执行的项目键

  • DenyKey

  • Server zabbix-server的IP或名称,列出主机接受传入的连接

    Server=服务端机器IP

  • ListenPort 监听端口,默认10050

  • ListenIP 监听IP,zabbix-agent的IP

    ListenIP=机器IP

  • StartAgents 监听的服务,zabbix-server的IP地址

    ServerActive=服务端机器IP:10051

  • Hostname 主机名zabbix-agent的IP,在zabbix-web上添加hosts时用这个名称

    Hostname=机器的名称

  • UnsafeUserParameters=1 默认为0,不允许使用以下字符 ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @,此外,不允许换行符,修改为1,表示自定义脚本中可以包含特殊字符。

  • HostMetadataItem 主机元数据,默认是system.uname,当Agent程序向服务端发送自动注册请求时,会发送其主机名,在某些情况下,Zabbix服务器的主机名不足以区分发现的主机,主机元数据可将其他信息从Agent发送到服务端。

vim /etc/zabbix/zabbix_agentd.conf
Server=192.168.186.139           # 服务器IP
ServerActive=192.168.186.139     # 服务器IP
Hostname=hezhiqiang-agent01      # 客户端主机名
UnsafeUserParameters=1           # 默认为0,修改为1,表示自定义脚本中可以包含特殊字符。
HostMetadataItem=system.uname    # 主机元数据

启动 Zabbix 代理进程,并设置开机自启动

systemctl enable --now zabbix-agent.service

五、Zabbix5.0 监控 Nginx

安装 Nginx

vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
 dnf makecache timer
 dnf info nginx
 dnf install -y nginx
 rm -rf /etc/nginx/conf.d/default.conf

查看当前Nginx是否已安装内置运行状态模块

nginx -V

从命令返回值中出现“--with-http_stub_status_module”这一个模块即代表内置运行状态模块已开启

开启运行状态模块,编辑Nginx配置文件

注意:stub_status模块只能应用在server或者location下

vim /etc/nginx/nginx.conf
 
参考以下内容进行修改:
server {
        location /status {              #定义运行状态页面名称,页面为status
        stub_status on;                 #开启模块
        access_log off;                 #不开启访问日志记录
        allow 127.0.0.1;                #运行127.0.0.1地址访问此网页
        allow 192.168.186.0/24;         #只运行192.168.186.0网段的主机访问此网页
        deny all;                       #其余网段主机不允许访问
 }
}

检查配置文件语法是否正确,然后重启nginx服务

nginx -t
systemctl restart nginx

浏览器访问运行状态页面

http://IP/status

页面内容解析:

Active connections: 2 
server accepts handled requests
 2 2 1 
Reading: 0 Writing: 1 Waiting: 1 
  • Active connections:当前活动的客户端连接数有多少(包括在等待阶段的)

  • accepts:接受的客户端连接总数

  • handled:已处理的连接总数(通常与accepts数量一致,但存在某些资源限制的情况导致数量不一致)

  • requests:客户端请求总数(包括接受请求或拒绝请求的)

  • Reading:nginx正在读取请求标头的当前连接数。

  • Writing:nginx正在将响应写回到客户端的当前连接数。

  • Waiting:当前等待请求的空闲客户端连接数。

具体stub_status模块信息可查看官方文档

编写监控脚本

mkdir /etc/zabbix/script
vim /etc/zabbix/script/nginx_status.sh
 
#!/bin/bash

#function: monitor nginx1.16 for zabbix5.0
#blog: he.zhiqiang.cloud
#version: 1.0
#date: 2021/6/22

#定义Nginx status页面
ngx_status="http://127.0.0.1/status"

#判断status页面是否存活
ngx_status_code() {
        http_code=`curl -o /dev/null -s -w %{http_code} ${ngx_status}`
        if [ ${http_code} == "200" ];then
                return 1
        else
                echo "Nginx status is not running."
        fi
}

#获取当前活动的客户端连接数
active() {
        ngx_status_code || curl -s ${ngx_status} | grep "Active" | awk '{print $NF}'
}

#获取接收客户端连接的总数量
accepts() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $1}'
}

#获取已处理的连接总数量
handled() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $2}'
}

#获取客户端请求总数量
requests() {
        ngx_status_code || curl -s ${ngx_status} | awk NR==3 | awk '{print $3}'
}

#获取正在读取请求标头的当前连接数量
reading() {
        ngx_status_code || curl -s ${ngx_status} | grep "Reading" | awk '{print $2}'
}

#获取正在将响应写回到客户端的当前连接数量
writing() {
        ngx_status_code || curl -s ${ngx_status} | grep "Writing" | awk '{print $2}'
}

#获取当前正在等待响应的客户端连接数量
waiting() {
        ngx_status_code || curl -s ${ngx_status} | grep "Waiting" | awk '{print $2}'
}

#使用位置变量控制脚本输出
case $1 in
        active)
                active;;
        accepts)
                accepts;;
        handled)
                handled;;
        requests)
                requests;;
        reading)
                reading;;
        writing)
                writing;;
        waiting)
                waiting;;
        *)
                echo "Unknown options"
esac
chmod +x /etc/zabbix/script/nginx_status.sh

创建自定义监控项

说明:自定义监控项,格式为:UserParameter=<键值>,<命令>。

比如第一个自定义键值为:nginx.active,要执行的命令为执行nginx_status.sh这个脚本。

vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf

UserParameter=nginx.active,bash /etc/zabbix/script/nginx_status.sh active
UserParameter=nginx.accepts,bash /etc/zabbix/script/nginx_status.sh accepts
UserParameter=nginx.handled,bash /etc/zabbix/script/nginx_status.sh handled
UserParameter=nginx.requests,bash /etc/zabbix/script/nginx_status.sh requests
UserParameter=nginx.reading,bash /etc/zabbix/script/nginx_status.sh reading
UserParameter=nginx.writing,bash /etc/zabbix/script/nginx_status.sh writing
UserParameter=nginx.waiting,bash /etc/zabbix/script/nginx_status.sh waiting

说明:添加完成以后,重启zabbix_agentd才会生效。

六、Zabbix Server Web界面添加被监控主机

配置——主机群组——创建主机群组——输入组名

要在Zabbix页面创建主机组,请执行以下步骤:

  • 进入: 配置 → 主机组

  • 单击页面右上角的创建主机群组

  • 在表单中输入组的相关参数

配置——主机——创建主机

按照以下步骤在Zabbix前端创建一台主机:

  • 进入: 配置 → 主机

  • 单击页面右上角 创建主机 (或者在主机名上单击以编辑一台已有的主机)

  • 在表单中输入主机的相关参数

配置——模板——创建模板

要创建模板,请执行以下操作:

  • 转到配置→模板

  • 点击创建模板

  • 编辑模板属性

主机——监控项——创建监控项

要在Zabbix管理页面创建一个监控项,请执行以下操作:

  • 进入到: 配置 → 主机

  • 在主机所在的行单击 监控项

  • 点击屏幕右上角的创建监控项

  • 输入表单中监控项的参数

主机——触发器——创建触发器

配置一个触发器,进行下面步骤:

  • 进入:配置 → 主机

  • 点击主机一行的 触发器

  • 点击右上角的 创建触发器(或者点击触发器名称去修改一个已存在的触发器)

  • 在窗口中输入触发器的参数

主机——图形——创建图形

  • 前往 配置 → 主机 (或模板) 页;

  • 点击所要创建图的主机或模板旁的 图形链接;

  • 在跳转的图表页的上,点击创建图表按钮;

  • 编辑图表的属性。

七、在Zabbix Server 中添加告警媒介

添加企业微信机器人告警脚本

zabbix_server.conf 文件中定义脚本目录,这里就选择了默认的目录

AlertScriptsPath=/usr/lib/zabbix/alertscripts

进入该定义的脚本存放路径下,创建用来推送告警消息的脚本

vim /usr/lib/zabbix/alertscripts/wechat.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# zabbix企业微信报警
import requests, json, sys, os, datetime

#微信钩子机器人地址
webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxx"

#zabbix传过来的三个变量
user = sys.argv[1]
title = sys.argv[2]
text = sys.argv[3]

#每发送一次报警,就记一次日志
file = r"/var/log/zabbix/send2wechat.log"

#报警的信息
data = {
    "msgtype": "markdown",
    "markdown": {
        "content": title + "\n" + text
    }
}

#请求这个钩子机器人
headers = {'Content-Type': 'application/json'}
x = requests.post(url=webhook, data=json.dumps(data), headers=headers)
if os.path.exists(file):
    f = open(file, "a+")
else:
    f = open(file, "w+")
    f.write(" " + " - -" * 30)
    f.write("\n")

#记录日志
if x.json()["errcode"] == 0:
    f.write(" "+ str(datetime.datetime.now()) + " " + str(user) + " " + "发送成功" + " " + str(title) + "\n")
    f.close()
else:
    f.write(" "+ str(datetime.datetime.now()) + " " + str(user) + " " + "发送失败" + " " + str(title) + "\n")
    f.close()

赋予脚本执行权限

chmod +x /usr/lib/zabbix/alertscripts/wechat.py   

安装python3.9版本

dnf -y install python39  

Python3安装requests模块

pip3 install requests

测试脚本,告警推送

python3 /usr/lib/zabbix/alertscripts/wechat.py  您好,监控测试

管理——报警媒介类型——创建媒介类型

新建一个企业微信的报警,脚本名称就是我们脚本名 wechat.py

参数:

  • {ALERT.SENDTO}

  • {ALERT.SUBJECT}

  • {ALERT.MESSAGE}

管理——报警媒介类型——Message templates

自定义消息模板, 参考宏使用

故障模板:

主题:# 服务故障: <font color="warning">{EVENT.NAME}</font>
消息:
{
> 告警主机: **{HOST.NAME}**
> 主机地址: **{HOST.IP}**
> 监控项目: {ITEM.NAME}
> 当前取值: {ITEM.LASTVALUE}
> 告警等级: {TRIGGER.SEVERITY}
> 告警时间: {EVENT.DATE}-{EVENT.TIME}
> 事件ID: {EVENT.ID}
}

效果:

恢复故障模板

主题:# 故障恢复: <font color="info">{EVENT.NAME}</font>
消息:
{
> 主机名称: **{HOST.NAME}**
> 主机地址: **{HOST.IP}**
> 告警名称: {EVENT.NAME}
> 持续时长: {EVENT.DURATION}
> 恢复时间: {EVENT.RECOVERY.DATE}-{EVENT.RECOVERY.TIME} 
> 当前状态: {TRIGGER.STATUS}
> 当前取值: {ITEM.LASTVALUE}
> 事件ID: {EVENT.ID}
}

效果:

管理 --> 报警 --> 媒介类型 --> 企业微信报警 --> Message templates --> 编辑 --> 更新

用户设置——报警媒介——添加媒介类型

更新告警媒介

配置——动作——创建动作——添加触发器

配置动作

修改操作 --> 步骤 1-0(无穷大)

八、测试故障,查看报表是否已经推送成功

systemctl stop nginx

报表——动作日志

最后更新于