实践说明:基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等),但适用场景不限于此,客户端一键部署安装包基于RHEL8和RHEL9。
文档形成时期:2023年
因系统或软件版本不同,构建部署可能略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。
限于篇幅,Zabbix配置基于Agent2一键安装包和模版,其它配置细节未做阐述,将来再单独整理一系列文档,但基于本文纯实践方案,已经有比较全面的配置,能应对大部分场景,或基于此容易做进一步的配置部署。
因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。
普通场景下推荐配置: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
采用"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;
}
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
说明:
make && make install
/opt/zabbix/etc/zabbix_server.conf
如果你是小型安装(最多十台受监控的主机),其他参数的默认值将适合你。 如果你想最大化 Zabbix server(或proxy)的性能,你应该修改默认参数。
查看默认配置:
./sbin/zabbix_server --help|grep alertscripts
AlertScriptsPath “/opt/zabbix/share/zabbix/alertscripts”
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部分监控项示例:
redis部分监控图表:
MySQL部分监控图表
Agent 和 agent 2 对比:https://www.zabbix.com/documentation/6.0/zh/manual/appendix/agent_comparison
总结,前者用C,后者主要是GO
前者支持广,后者仅Linux, Windows,本文档采用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
如果是在服务端,前面已经安装。
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
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
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}))秒。"
一键安装包说明:
server {
listen 127.0.0.1:89;
location = /NginxStatus {
stub_status on;
access_log off;
}
}
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://<server_ip_or_name>
按提示安装完成后,配置位于: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。