Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署

实践说明:基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等),但适用场景不限于此,客户端一键部署安装包基于RHEL8和RHEL9。
文档形成时期:2023年
因系统或软件版本不同,构建部署可能略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。
限于篇幅,Zabbix配置基于Agent2一键安装包和模版,其它配置细节未做阐述,将来再单独整理一系列文档,但基于本文纯实践方案,已经有比较全面的配置,能应对大部分场景,或基于此容易做进一步的配置部署。
因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。

文章目录

    • 服务端基础硬件资源环境
    • 服务端基础环境
    • 服务端基于AlmaLinux9部署PHP7.4.33
    • 从源码安装Zabbix服务端
      • 创建系统用户等准备
      • 创建数据库
      • 配置源代码和安装
      • 服务端配置
      • 创建systemctl启动管理
      • 错误处理
      • 模版
    • 从源码安装zabbix客户端agent
      • 关于agent2
      • 安装环境
      • 安装依赖
        • go环境安装
        • 安装agent2
        • 创建systemctl启动管理
    • 服务端Web界面安装
      • 语言和乱码问题
        • 字体

服务端基础硬件资源环境

普通场景下推荐配置:2核8G,支持1000个监控指标。

服务端基础环境

RHEL9系列(本文档方案基于AlmaLinux9)
MySQL 8.0.X 之一 需要 InnoDB 引擎。 可参考该文档部署:https://blog.csdn.net/ynz1220/article/details/135535296
PHP 7.2.5 或更高版本,不支持 PHP 8.0
所需模块参见官文:https://www.zabbix.com/documentation/6.0/zh/manual/installation/requirements

服务端基于AlmaLinux9部署PHP7.4.33

采用"Docker的方式部署PHP7.4.33,编译或DNF方式安装Nginx+MySQL",遇到了Zabbix图表乱码问题,虽然让Docker环境支持了中文,但Zabbix图表乱码问题仍未能解决。
最终弃用Docker的方式部署PHP7.4.33,采用DNF方式安装PHP7.4.33

dnf module list php -y #可以看到,默认源有php8.1,但目前zabbix7才支持php8.1,而zabbix7还是开发版本,不宜用于生产环境。

#dnf update -y # 可选

#删除旧版本
#dnf remove php php-fpm -y; dnf remove php* -y #可选

#安装Epel和Remi仓库
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

#再次查看
dnf module list php -y
有php7.4至8.3了

#安装PHP 7.4
dnf module install php:remi-7.4 -y

#安装扩展模块
dnf install php-cli php-fpm php-curl php-mysqlnd php-gd php-opcache php-zip php-intl php-common php-bcmath php-imap php-imagick php-xmlrpc php-json php-readline php-memcached php-redis php-mbstring php-apcu php-xml php-dom php-redis php-memcached php-memcache

php -v
php -m # 可以看到,zabbix6所需要的openssl等所有模块均已安装好。

#配置PHP-FPM
vi /etc/php-fpm.d/www.conf
;至少有下列配置
listen.backlog = 2048
listen.owner = www
listen.group = www
listen.mode = 0660
listen.acl_users =
listen.acl_groups =
; 特别注意两个acl配置要为空,不然listen.owner和listen.group配置无效,创建的unixsock文件就不会是指定的普通用户,让前端nginx无法访问,报502。

systemctl restart php-fpm

nginx相关配置:

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

从源码安装Zabbix服务端

创建系统用户等准备

groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
mkdir -m u=rwx,g=rwx,o= -p /usr/lib/zabbix
chown zabbix:zabbix /usr/lib/zabbix

如果Zabbix server和agent运行在同一台机器上,建议使用与agent不同的用户来运行。否则,如果两者使用相同的用户,agent可以访问server的配置文件,Zabbix里任何Admin级别的用户可以轻易地获取诸如数据可密码等信息。

下载最新稳定版Zabbix程序包
https://www.zabbix.com/download_sources#60LTS
wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.22.tar.gz

创建数据库

对Zabbixserver和proxy守护进程,还有Zabbix前端,必须要有一个数据库。但运行Zabbixagent不需要。

此处SQL脚本用于创建数据库模式和插入数据集。Zabbix proxy数据库只需要数据库模式,而Zabbix server数据库在数据库模式之上还需要数据集。

Zabbix 唯一支持的编码是 UTF-8 。使用此编码没有已知的任何安全漏洞。应注意如果使用其他的编码,则存在已知的安全问题。

MySQL
支持字符集 utf8(又名 utf8mb3)和 utf8mb4(分别使用 utf8_bin 和 utf8mb4_bin 排序规则)
建议使用 utf8mb4 进行新安装。
对于 Zabbix 6.0.11 及更新版本,需要在导入模式期间创建确定性触发器。 在 MySQL 和 MariaDB 上,如果启用了二进制日志记录并且没有超级用户权限同时未在MySQL配置文件中配置 log_bin_trust_function_creators = 1 ,则需要设置 GLOBAL log_bin_trust_function_creators = 1。

mysql> create database zabbixdb character set utf8mb4 collate utf8mb4_bin;
CREATE USER "zabbixuser"@"%" IDENTIFIED WITH mysql_native_password BY "pass";
GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create View, Delete, Drop, Event, Execute, Index, Insert, Lock Tables, References, Select, Show View, Trigger, Update ON `zabbixdb`.* TO `zabbixuser`@`%`;
SET GLOBAL log_bin_trust_function_creators = 1;
quit;

tar zxf zabbix-6.0.22.tar.gz
cd zabbix-6.0.22

将数据导入数据库。 对于 Zabbix 代理数据库,只应导入 schema.sql(不导入 images.sql 或 data.sql)。
mysql -uzabbixuser -p zabbixdb < database/mysql/schema.sql
mysql -uzabbixuser -p zabbixdb < database/mysql/images.sql
mysql -uzabbixuser -p zabbixdb < database/mysql/data.sql

成功导入schema后,可以禁用 log_bin_trust_function_creators:
mysql -uroot -p"password"
mysql> SET GLOBAL log_bin_trust_function_creators = 0;
mysql> quit;

配置源代码和安装

安装依赖
dnf -y install libxml2 libxml2-devel net-snmp-devel OpenIPMI OpenIPMI-devel libevent-devel pcre-devel

#下载和安装go

#https://go.dev/dl/
wget https://go.dev/dl/go1.21.2.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz
#(You may need to run the command as root or through sudo).
#Add /usr/local/go/bin to the PATH environment variable.
sed -i '/export PATH/i\PATH=/usr/local/go/bin:"$PATH"' ~/.bashrc
source  ~/.bashrc
go version

当为Zabbix server或proxy配置源码时,必须指定要使用的数据库类型。同一时间,只用一种数据库类型可以与server或proxy编译。

要查看所有支持的配置选项,在提取的Zabbix源代码目录运行:
./configure --help

要为Zabbix server和agent配置源代码,你可以执行类似如下命令:
./configure --prefix=/opt/zabbix --enable-server --enable-agent2 --with-mysql=/opt/mysql8/bin/mysql_config --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openipmi

说明:

  • 构建服务器时不建议使用 --enable-static 选项。为了静态构建服务器,你必须每个需要的外部库的静态版本。
  • 将可选路径添加到 MySQL 配置文件 --with-mysql=//mysql_config, 以便在需要使用不在默认位置的 MySQL 客户端库时选择所需的 MySQL 客户端。当在同一系统上安装了多个版本的 MySQL 或 MariaDB 与 MySQL 一起安装时,这个配置很有用。

make && make install

服务端配置

/opt/zabbix/etc/zabbix_server.conf
如果你是小型安装(最多十台受监控的主机),其他参数的默认值将适合你。 如果你想最大化 Zabbix server(或proxy)的性能,你应该修改默认参数。

查看默认配置:
./sbin/zabbix_server --help|grep alertscripts
AlertScriptsPath “/opt/zabbix/share/zabbix/alertscripts”

创建systemctl启动管理

cat <<\EOF>/usr/lib/systemd/system/zabbix_server.service
[Unit]
Description=Zabbix Server
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/opt/zabbix/etc/zabbix_server.conf"
EnvironmentFile=-/opt/zabbix
Type=forking
PIDFile=/tmp/zabbix_server.pid
ExecStart=/opt/zabbix/sbin/zabbix_server -c /opt/zabbix/etc/zabbix_server.conf
ExecStop=/usr/bin/kill $MAINPID
Restart=always
RestartSec=5
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target
EOF
systemctl enable zabbix_server
systemctl start zabbix_server

错误处理

日志提示:[Z3001] connection to database ‘zabbixdb’ failed: [1045] Access denied for user ‘zabbixuser’@‘localhost’ (using password: YES)
处理:由socket改用host连接后解决。原因未知(可能是socket没有放在/tmp下,zabbix读不到?),后来发现是listen.acl_users和listen.acl_groups须为空,否则php-fpm创建的unixsock文件就不会是指定的普通用户。

模版

下载地址:https://download.csdn.net/download/ynz1220/88734297 (资源如果不能打开是可能正在审核中,可过一会儿或次日访问)
导入即可使用,包含80+监控项,60+自动发现监控项,已配置常见图表和触发器,大量采用中文简体,方便非运维识别告警信息。

redis部分监控项示例:
Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署_第1张图片redis部分监控图表:
Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署_第2张图片
MySQL部分监控图表
Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署_第3张图片

从源码安装zabbix客户端agent

Agent 和 agent 2 对比:https://www.zabbix.com/documentation/6.0/zh/manual/appendix/agent_comparison
总结,前者用C,后者主要是GO
前者支持广,后者仅Linux, Windows,本文档采用agent2

关于agent2

UNIX: Zabbix agent支持的所有指标。
此外,agent 2 为以下对象提供 Zabbix-native 监控解决方案:Docker, Memcached, MySQL, PostgreSQL, Redis, systemd,和其他监控目标 - 请参阅agent 2 特定监控项的完整列表。
Windows: Zabbix agent代理支持的所有指标,以及HTTPS、LDAP 的net.tcp.service* 检查。
此外,agent 2 为 PostgreSQL、Redis 提供了 Zabbix-native 监控解决方案。
支持被动和主动检查。
更多:
https://www.zabbix.com/documentation/6.0/zh/manual/concepts/agent2

安装环境

本文档基于RHEL8、RHEL9系列,但不限于此。

安装依赖

dnf install pcre-devel

go环境安装

如果是在服务端,前面已经安装。

wget https://go.dev/dl/go1.21.2.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz
#(You may need to run the command as root or through sudo).
#Add /usr/local/go/bin to the PATH environment variable.
sed -i '/export PATH/i\PATH=/usr/local/go/bin:"$PATH"' ~/.bashrc
source  ~/.bashrc
go version

#创建用户

groupadd --system zabbix_agent2
useradd --system -g zabbix_agent2 -d /usr/lib/zabbix_agent2 -s /sbin/nologin -c "zabbix_agent2 Monitoring System" zabbix_agent2
mkdir -m u=rwx,g=rwx,o= -p /usr/lib/zabbix_agent2
chown zabbix_agent2:zabbix_agent2 /usr/lib/zabbix_agent2
安装agent2

wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.22.tar.gz
tar zxf zabbix-6.0.22.tar.gz
cd zabbix-6.0.22
./configure --prefix=/opt/zabbix --enable-agent2
构建Zabbix agent 2需要一个用当前支持的Go版本配置的Go环境。前面已经安装

make && make install

chown zabbix_agent2:zabbix_agent2 -R /opt/zabbix
chmod u=rwx,g=rwx,o= -R /opt/zabbix

创建systemctl启动管理
cat <<\EOF>/usr/lib/systemd/system/zabbix_agent2.service
[Unit]
Description=Zabbix Agent 2
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/opt/zabbix/etc/zabbix_agent2.conf"
EnvironmentFile=-/opt/zabbix
Type=forking
PIDFile=/tmp/zabbix_agent2.pid
ExecStart=/opt/zabbix/sbin/zabbix_agent2 -c /opt/zabbix/etc/zabbix_agent2.conf
ExecStop=/usr/bin/kill $MAINPID
Restart=always
RestartSec=5
User=zabbix_agent2
Group=zabbix_agent2

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable zabbix_agent2
systemctl start zabbix_agent2

因为zabbix_agent2会部署于成百上千台服务器,基于Linux的RHEL8和RHEL9系列分别做成两个一键安装包,通过Ansible可大批量快速部署,体现运维的自动化。

基中基于RHEL8的脚本如下:

#!/bin/bash
###################################
# function   Install zabbix_agent2
#
# Change History:
# date        author          note
# 2023        N  create

###################################

############# ENV #################
# 脚本名称,临时文件或邮件中可能用到,避免同类脚本的变量的冲突,下面直接取脚本名
export project_name=`echo ${0##*/} | cut -d'.' -f 1`

# 工作目录,可能会产生临时文件
#export work_dir=/root/sh

# 临时文件目录
#export tmp_dir=${work_dir}/tmp

# 日志目录
#export log_dir=${work_dir}/log

# 数据目录
#export var_dir=${work_dir}/var

# mysql程序路径
#export mysql_base_dir="/opt/mysql8"
#export mysql_bin_path="${mysql_base_dir}/bin"

# db实例连接配置
#export mysql_client_conf_online_list="/root/.mysql/conn.conf"

############# 配置结束 ##################

# 时间和环境变量,一般无需修改
export datetime=$(date +%Y%m%d-%H%M%S)
export LANG=C
#export LC_ALL=C
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export parameter1=$1
export parameter2=$2
export parameter3=$3
export HOME=/root

############# PROC #################
# 记录开始时间
start_time=$(date +%s)
echo ""
echo "######"
echo "`date +"%Y-%m-%d %H:%M:%S"` 运行开始"

### 函数 ###
# 帮助信息
function help_msg() {
echo -e "\033[41m请查看帮助信息:\033[0m

HELP:
parameter eg: do

exec eg: 
bash $0 do

\033[41m请查看帮助信息:\033[0m"
}


#test -d $work_dir || mkdir -p $work_dir
#test -d $tmp_dir || mkdir -p $tmp_dir
#test -d $log_dir || mkdir -p $log_dir
#test -d $var_dir || mkdir -p $var_dir
#cd $work_dir


if [ "$parameter1" == "" ] || [ "$parameter1" == "help" ]; then
    help_msg
    echo "`date +"%Y-%m-%d %H:%M:%S"` error, exit."
    exit
elif [ "$parameter1" == "do" ]; then
    true
fi


# 判断系统和zabbix_agent2环境
sys_release=`cat /etc/redhat-release | awk '{ print $3; }' | awk -F. '{ print $1; }'`
if [ "$sys_release" != "8" ];then
    echo "该系统版本不是Almalinux8或者rhel8,请检查下,本次安装中止。"
    exit 1
fi




if [ -d /usr/local/go ];then
    echo "该系统可能已经自定义安装过go,请检查下,本次不再安装go环境,请确保go环境正常。"
else
    tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz
    echo "安装了go环境,请确保go环境正常。"
fi

i=`grep -c "PATH" ~/.bashrc`
j=`grep -c "/usr/local/go/bin" ~/.bashrc`
if [ "$i" == "0" ];then
    echo 'export PATH=/usr/local/go/bin:"$PATH"' >> ~/.bashrc
elif [ "$j" == "0" ];then
    sed -i '/export PATH/i\PATH=/usr/local/go/bin:"$PATH"' ~/.bashrc
fi        
source  ~/.bashrc
go version
echo -e "\033[42;37m若确定go环境正常,5秒后脚本继续运行,否则请按'Ctrl+C'中断安装\033[0m"
sleep 5




if [ -d /opt/zabbix ];then
    echo "该系统可能已经自定义安装过zabbix,请检查下,本次安装中止。"
    exit 1
fi


# 检查当前目录
if [ ! -f $PWD/install.sh ];then
    echo "请切换到install.sh同级目录下之后再执行安装,本次安装中止。"
    exit 1
fi



echo "开始安装"
groupadd --system zabbix_agent2
useradd --system -g zabbix_agent2 -d /usr/lib/zabbix_agent2 -s /sbin/nologin -c "zabbix_agent2 Monitoring System" zabbix_agent2
mkdir -m u=rwx,g=rwx,o= -p /usr/lib/zabbix_agent2
chown zabbix_agent2:zabbix_agent2 /usr/lib/zabbix_agent2

cp -ap zabbix /opt/

chown zabbix_agent2:zabbix_agent2 -R /opt/zabbix
chmod u=rwx,g=rwx,o= -R /opt/zabbix

cat <<\EOF>/usr/lib/systemd/system/zabbix_agent2.service
[Unit]
Description=Zabbix Agent 2
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/opt/zabbix/etc/zabbix_agent2.conf"
EnvironmentFile=-/opt/zabbix
Type=forking
PIDFile=/tmp/zabbix_agent2.pid
ExecStart=/opt/zabbix/sbin/zabbix_agent2 -c /opt/zabbix/etc/zabbix_agent2.conf
ExecStop=/usr/bin/kill $MAINPID
Restart=always
RestartSec=5
User=zabbix_agent2
Group=zabbix_agent2

[Install]
WantedBy=multi-user.target
EOF


systemctl daemon-reload
systemctl enable zabbix_agent2


if [ -d /usr/local/go ] || [ -d /opt/zabbix ];then
    echo "已成功安装,启动服务:systemctl start zabbix_agent2"
fi



echo ""
stop_time=$(date +%s)
echo "`date +"%Y-%m-%d %H:%M:%S"` 运行结束"
echo "本次脚本运行了$((${stop_time}-${start_time}))秒。"

一键安装包说明:

  • 下载地址:https://download.csdn.net/download/ynz1220/88734297 (资源如果不能打开是可能正在审核中,可过一会儿或次日访问) 根据系统版本选择相对应的"zabbix_agent2-6.0.22-ce-install.tar.gz"包即可。
  • 包含Nginx+Mysql+Redis的监控脚本;
  • 客户端主配置/opt/zabbix/etc/zabbix_agent2.conf修改必要的配置如主机名和服务端地址后才能使用;
  • Mysql监控脚本需要修改/opt/zabbix/etc/mysql.conf后才能使用;
  • Nginx不必修改,但NginxStatus状态服务须和监控脚本中配置的地址和端口一致,默认是127.0.0.1:89,如下;
    server {
        listen       127.0.0.1:89;
        location = /NginxStatus {
            stub_status on;
            access_log off;
        }
    }
  • Redis监控脚本配合模板使用,极为完善,且支持自动发现多实例,自动获取pass,即使是官方提供的监控脚本也远不及于此;
  • Tcpport监控脚本结合数据库表监控应用层大批量端口,创建模板使用,是业务运维监控的重要环节。

服务端Web界面安装

Zabbix 前端是由PHP语言编写,所以其网页服务的运行需要支持PHP语言的网站服务器。
php环境前面已经部署
nginx环境可参考:https://blog.csdn.net/ynz1220/article/details/135485305

语言和乱码问题

其他前端语言
https://www.zabbix.com/documentation/6.0/zh/manual/appendix/install/locales
为了在Zabbix Web界面中使用英语以外的任何其他语言,其区域设置应安装在Web服务器上。此外,翻译工作还需要 PHP gettext 扩展。

访问前端
http://
按提示安装完成后,配置位于:conf/zabbix.conf.php

Zabbix 前端已准备就绪! 默认用户名是Admin,密码zabbix。

登陆后提示:
Locale for language “en_US” is not found on the web server.
查看:locale -a
解决:
dnf install glibc-langpack-en glibc-langpack-zh
修改
vi /etc/locale.conf
LANG=en_US.UTF-8 # 如需显示中文,安装glibc-langpack-zh包即可,不必设置LANG变量为中文
然后在web界面设置中可选择中文

重启zabbix所有服务

如果php跑在基于debian系的docker中,那么需要修改docker的:
apt-get update
apt-get install locales
dpkg-reconfigure locales
取消/etc/locale.gen中关于en_US.UTF-8的注释
运行:
locale-gen

2023年基于docker的php7.4.33部署,装了locales,并设置语言环境为en_US.UTF-8,仍然无法解决zabbix语言问题,改用直接在系统上安装,

字体

web界面乱码,但图形有中文乱码,

解决zabbix图中出现中文乱码问题:
从windows下控制面板->字体->选择一种中文字库例如“宋体”
把它拷贝到zabbix的web端的fonts目录下例如:/opt/web/zabbix/assets/fonts,并且把TTF后缀改为ttf

上传后名称会变成小写,可改为大写,总之要和下面的配置一致:
修改zabbix的web端include/defines.inc.php
//define(‘ZBX_FONT_NAME’, ‘DejaVuSans’); // DejaVuSans是默认是开源字体
define(‘ZBX_FONT_NAME’, ‘simhei’);

//define(‘ZBX_GRAPH_FONT_NAME’, ‘DejaVuSans’); // font file name
define(‘ZBX_GRAPH_FONT_NAME’, ‘simhei’); // font file name

实践采用了simhei。

你可能感兴趣的:(Linux系统运维,运维自动化,linux,nginx,mysql,zabbix,redis,运维开发)