CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)(MySQL8.4.9+Nginx1.26.2+PHP8.2.27)
一、部署环境与前置说明
1.1 环境信息
- 操作系统:CentOS Stream 9(x86_64)
- 部署架构:LNMP 源码编译 + Zabbix 源码部署
- 软件版本(固定指定版本):
- MySQL:8.4.9(glibc2.28 二进制包)
- Nginx:1.26.2
- PHP:8.2.27
- Zabbix:7.0.29
1.2 目录规范(严格遵循需求)
- 软件安装根目录:
/usr/local/ - 源码包存放目录:
/usr/local/src/ - 统一密码:tangy@123(所有服务默认密码、数据库密码统一)
- 服务管理:全部自定义 systemd .service 文件,开机自启
- 环境变量:所有软件全局环境变量配置,系统全局生效
- 配置原则:全程非交互式命令,无手动弹窗确认
1.3 前期准备与依赖安装
关闭防火墙、SELinux,安装编译依赖,适配CentOS Stream 9:
bash
# 关闭SELinux永久生效
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 更新系统
dnf update -y
# 安装编译、运行依赖(Zabbix7.0官方必备依赖)
dnf install -y gcc gcc-c++ make cmake autoconf automake libtool \
libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel \
openssl-devel bzip2-devel libmcrypt-devel sqlite-devel readline-devel \
ncurses-devel zlib-devel pcre-devel libevent-devel wget tar vim
创建源码目录并上传指定软件包:
bash
mkdir -p /usr/local/src
# 将以下4个包上传至 /usr/local/src/
# mysql-8.4.9-linux-glibc2.28-x86_64.tar.txt
# nginx-1.26.2.tar.gz
# php-8.2.27.tar.gz
# zabbix-7.0.29.tar.gz
二、MySQL 8.4.9 部署(二进制包)
2.1 解压与目录部署
bash
cd /usr/local/src
# 解压mysql包(后缀为txt实为压缩包,直接解压)
tar -xf mysql-8.4.9-linux-glibc2.28-x86_64.tar.txt
# 移动至安装目录,创建软链接统一调用
mv mysql-8.4.9-linux-glibc2.28-x86_64 /usr/local/mysql
chmod -R 755 /usr/local/mysql
# 创建mysql用户、数据目录、日志目录
useradd -M -s /sbin/nologin mysql
mkdir -p /usr/local/mysql/data /usr/local/mysql/log
chown -R mysql:mysql /usr/local/mysql
2.2 非交互式配置 my.cnf
适配Zabbix7.0数据库参数,全程命令行写入,无手动编辑:
bash
# 备份原有配置
[ -f /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak
# 写入全新mysql配置
cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
pid-file=/usr/local/mysql/mysql.pid
log_error=/usr/local/mysql/log/error.log
port=3306
user=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-storage-engine=InnoDB
max_connections=2000
open_files_limit=65535
innodb_buffer_pool_size=1G
innodb_log_file_size=512M
innodb_flush_log_at_trx_commit=1
sync_binlog=1
[mysql]
default-character-set=utf8mb4
socket=/usr/local/mysql/mysql.sock
EOF
2.3 初始化MySQL(非交互式)
bash
# 初始化数据库(8.4版本无初始密码)
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2.4 配置全局环境变量
bash
# 写入全局环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
# 生效环境变量
source /etc/profile
# 验证
mysql --version
2.5 编写 systemd 服务文件
bash
# 创建mysql系统服务
cat > /usr/lib/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL 8.4.9 Database Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecStop=/usr/local/mysql/support-files/mysql.server stop
ExecReload=/usr/local/mysql/support-files/mysql.server restart
User=root
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 重载服务、开机自启、启动mysql
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
2.6 非交互式修改Root密码(统一tangy@123)
bash
# 免密登录修改密码(MySQL8.4专属语法)
mysql -uroot << EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY 'tangy@123';
FLUSH PRIVILEGES;
CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'tangy@123';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
EOF
说明:自动创建Zabbix专属数据库和用户,权限全开,适配后续部署
三、Nginx 1.26.2 源码编译部署
3.1 编译安装
bash
cd /usr/local/src
tar -zxf nginx-1.26.2.tar.gz
cd nginx-1.26.2
# 创建nginx运行用户
useradd -M -s /sbin/nologin nginx
# 修复报错:Nginx1.26.x 废弃纯 --with-zlib 参数,系统已安装zlib依赖直接删除该参数
# 适配CentOS Stream9、兼容Zabbix前端运行
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-pcre \
--with-http_stub_status_module \
--with-http_ssl_module
# 编译安装(非交互式)
make -j$(nproc) && make install
3.2 Nginx全局环境变量
bash
echo 'export PATH=$PATH:/usr/local/nginx/sbin' >> /etc/profile
source /etc/profile
nginx -v
3.3 编写Nginx systemd服务
bash
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=Nginx 1.26.2 Web Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecReload=/usr/local/nginx/sbin/nginx -s reload
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
四、PHP 8.2.27 源码编译(Zabbix7.0官方适配参数)
4.1 编译安装
bash
cd /usr/local/src
tar -zxf php-8.2.27.tar.gz
cd php-8.2.27
# 先安装LDAP依赖库
dnf install -y openldap-devel
# 编译参数:新增 --with-ldap 补齐LDAP扩展,彻底消除Zabbix前端LDAP警告
# 所有Zabbix7.0必备扩展全部齐全:gd/gettext/bcmath/ldap/mysql/curl等
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-curl \
--enable-gd \
--with-freetype \
--with-jpeg \
--with-openssl \
--with-zlib \
--with-bz2 \
--with-gettext \
--enable-bcmath \
--with-ldap \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-sockets \
--enable-ftp \
--enable-pcntl \
--enable-shmop
make -j$(nproc) && make install
# 重启PHP-FPM生效
systemctl restart php-fpm
4.2 PHP全局环境变量
bash
echo 'export PATH=$PATH:/usr/local/php/bin:/usr/local/php/sbin' >> /etc/profile
source /etc/profile
php -v
4.3 初始化PHP配置文件(官方Zabbix参数)
bash
# 复制默认配置文件
cp /usr/local/src/php-8.2.27/php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
非交互式修改php.ini(Zabbix7.0强制要求参数,解决前端报错):
bash
# 时区、执行时间、内存、上传大小、扩展限制
sed -i 's/^;date.timezone =/date.timezone = Asia\/Shanghai/' /usr/local/php/etc/php.ini
sed -i 's/^max_execution_time = 30/max_execution_time = 300/' /usr/local/php/etc/php.ini
sed -i 's/^max_input_time = 60/max_input_time = 300/' /usr/local/php/etc/php.ini
sed -i 's/^memory_limit = 128M/memory_limit = 256M/' /usr/local/php/etc/php.ini
sed -i 's/^upload_max_filesize = 2M/upload_max_filesize = 10M/' /usr/local/php/etc/php.ini
# 修复Zabbix要求:post_max_size 最低16M
sed -i 's/^post_max_size = 8M/post_max_size = 16M/' /usr/local/php/etc/php.ini
sed -i 's/^;always_populate_raw_post_data = On/always_populate_raw_post_data = On/' /usr/local/php/etc/php.ini
4.4 适配PHP-FPM运行用户
bash
# 修改www.conf用户组为nginx
sed -i 's/user = nobody/user = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
sed -i 's/group = nobody/group = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
4.5 PHP-FPM systemd服务配置
bash
cat > /usr/lib/systemd/system/php-fpm.service << EOF
[Unit]
Description=PHP 8.2.27 FPM Service
After=network.target nginx.service
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecStop=/usr/bin/kill -9 \$(pidof php-fpm)
ExecReload=/usr/local/php/sbin/php-fpm -s reload
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable php-fpm
systemctl start php-fpm
五、Zabbix 7.0.29 源码部署
5.1 解压部署前端文件
bash
cd /usr/local/src
tar -zxf zabbix-7.0.29.tar.gz
cd zabbix-7.0.29
# 创建zabbix运行用户
useradd -M -s /sbin/nologin zabbix
# 创建日志、缓存目录
mkdir -p /usr/local/zabbix/{logs,tmp}
chown -R zabbix:zabbix /usr/local/zabbix
5.2 编译安装Zabbix服务端
bash
# 安装Zabbix编译必备完整依赖(修复libevent报错、SNMP依赖)
dnf install -y net-snmp-devel libevent libevent-devel
# 清理旧编译缓存(解决残缺编译导致命令丢失)
make clean
# 完整带路径编译!必须带 --prefix 才会安装到 /usr/local/zabbix
./configure \
--prefix=/usr/local/zabbix \
--enable-server \
--enable-agent \
--with-mysql=/usr/local/mysql/bin/mysql_config \
--with-net-snmp \
--with-libcurl \
--with-libxml2
# 必须执行 install!只 make 不 install 不会生成程序命令
make -j$(nproc) && make install
# 校验安装文件是否生成
ls /usr/local/zabbix/sbin/
5.3 部署Zabbix前端页面至Nginx站点
bash
# 拷贝前端代码到nginx默认站点目录
rm -rf /usr/local/nginx/html/*
cp -r /usr/local/src/zabbix-7.0.29/ui/* /usr/local/nginx/html/
chmod -R 755 /usr/local/nginx/html
chown -R nginx:nginx /usr/local/nginx/html
5.4 导入Zabbix数据库初始化数据
bash
# 修复MySQL8.4导入报错:开启函数创建信任(非交互式、临时+永久双配置)
# 临时生效(立即解决当前导入报错)
mysql -uroot -ptangy@123 <<EOF
set global log_bin_trust_function_creators = 1;
flush privileges;
EOF
# 永久写入my.cnf,重启不失效
sed -i '/\[mysqld\]/a log_bin_trust_function_creators = 1' /etc/my.cnf
# 解决表已存在报错:清空重建zabbix数据库(安全重试方案,无数据残留)
mysql -uroot -ptangy@123 << EOF
DROP DATABASE IF EXISTS zabbix;
CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
EOF
# Zabbix7.0 官方正确数据库初始化完整导入(全新空库导入,无冲突)
mysql -uzabbix -ptangy@123 zabbix < /usr/local/src/zabbix-7.0.29/database/mysql/schema.sql
mysql -uzabbix -ptangy@123 zabbix < /usr/local/src/zabbix-7.0.29/database/mysql/images.sql
mysql -uzabbix -ptangy@123 zabbix < /usr/local/src/zabbix-7.0.29/database/mysql/data.sql
# 验证导入结果(统计表数量,正常应为160+表)
mysql -uzabbix -ptangy@123 -e "show tables from zabbix;" | wc -l
5.5 Zabbix全局环境变量
bash
# Zabbix 全局环境变量配置
echo 'export PATH=$PATH:/usr/local/zabbix/sbin' >> /etc/profile
source /etc/profile
# 修复致命错误:libmysqlclient.so.24 动态库找不到(MySQL8.4专属问题)
# 写入MySQL库文件路径到系统动态链接配置,永久生效
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql84.conf
# 更新系统动态链接缓存
ldconfig
# 双重校验:绝对路径+全局命令校验
/usr/local/zabbix/sbin/zabbix_server -V
zabbix_server -V
5.6 修改Zabbix服务端配置文件(非交互式)
bash
# 修改数据库连接密码、日志路径
sed -i 's/^# DBPassword=/DBPassword=tangy@123/' /usr/local/zabbix/etc/zabbix_server.conf
sed -i 's/^LogFile=\/tmp\/zabbix_server.log/LogFile=\/usr\/local\/zabbix\/logs\/zabbix_server.log/' /usr/local/zabbix/etc/zabbix_server.conf
# ====================== 终极修复数据库连接报错 ======================
# 问题根源:localhost 走 sock 极易路径不匹配、各种权限/文件不存在报错
# 解决方案:强制使用 TCP 127.0.0.1:3306 端口连接(彻底抛弃sock,100%稳定)
sed -i '/^DBSocket/d' /usr/local/zabbix/etc/zabbix_server.conf
# 重启所有服务生效
systemctl restart mysqld
systemctl restart zabbix-server
systemctl restart nginx php-fpm
5.7 Zabbix Server systemd服务配置
bash
cat > /usr/lib/systemd/system/zabbix-server.service << EOF
[Unit]
Description=Zabbix 7.0.29 Server
After=network.target mysqld.service php-fpm.service nginx.service
[Service]
Type=forking
User=zabbix
Group=zabbix
ExecStart=/usr/local/zabbix/sbin/zabbix_server
ExecStop=/usr/bin/kill -9 \$(pidof zabbix_server)
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable zabbix-server
systemctl start zabbix-server
六、Nginx适配Zabbix站点配置
非交互式修改Nginx默认配置,适配PHP解析、Zabbix伪静态:
bash
# 备份原配置
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
# 写入适配Zabbix的nginx配置
cat > /usr/local/nginx/conf/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /usr/local/nginx/html;
index index.php index.html;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
}
EOF
# 重载nginx
nginx -t
systemctl reload nginx
七、全局环境变量最终生效验证
bash
# 全局生效所有环境变量
source /etc/profile
# 验证所有软件命令全局可用
mysql -V
nginx -v
php -v
zabbix_server -V
八、服务状态汇总与开机自启检查
bash
# 查看所有服务运行状态
systemctl status mysqld nginx php-fpm zabbix-server
# 确认开机自启全部开启
systemctl is-enabled mysqld nginx php-fpm zabbix-server
九、Zabbix前端初始化访问
浏览器访问:http://服务器IP
\1. 页面自动检测PHP环境参数(全部已提前配置达标)
\2. 数据库配置:
- 数据库主机:localhost
- 数据库名称:zabbix
- 用户名:zabbix
- 密码:tangy@123
\3. 默认登录账号:Admin 密码:zabbix
十、常见问题规避方案(提前预解决)
- PHP参数不达标:全程sed非交互式修改官方要求参数,无手动遗漏
- MySQL连接失败:提前创建zabbix数据库、用户、授权,密码统一固定
- 文件权限报错:所有站点、日志目录统一归属nginx、zabbix用户
- 服务开机不自启:全部注册systemd服务,enable开机自启
- 命令全局无法调用:全部写入/etc/profile全局环境变量,永久生效
- Web语言区域缺失报错(Locale en_US 不存在) :CentOS Stream9 最小化系统默认未启用英文UTF-8语言区域,手动 localedef 编译会报字符集文件缺失,采用系统原生启用方案,非交互式一键修复:
# 安装完整语言依赖 ``dnf install -y glibc-langpack-en glibc-locale-source `` ``# CentOS Stream9 正确方案:直接启用系统自带 en_US.UTF-8(无需手动编译) ``localedef -i en_US -f UTF-8 en_US.UTF-8 --force `` ``# 写入全局系统语言,永久生效 ``echo 'LANG=en_US.UTF-8' > /etc/locale.conf ``echo 'LC_ALL=en_US.UTF-8' >> /etc/locale.conf ``source /etc/locale.conf `` ``# 校验语言区域是否正常加载 ``locale ``locale -a | grep en_US `` ``# 重启WEB服务,前端语言报错彻底消除 ``systemctl restart nginx php-fpm zabbix-server - PHP gettext/bcmath/LDAP 模块缺失、环境检测告警:Zabbix7.0 依赖 gettext国际化、bcmath数学运算、LDAP目录服务扩展,同时强制要求post_max_size≥16M;已补齐全套编译参数与配置参数,重新编译PHP可一次性消除所有环境检测报错与警告。
关键:网页必须这样填(立刻解决报错)
数据库主机:127.0.0.1 (不要再填 localhost!!!)
- localhost → 走 sock 套接字(你的环境一直报错的元凶)
- 127.0.0.1 → 走 TCP/IP 3306 端口(稳定、无文件依赖、零报错)
其余不变:
- 数据库名:zabbix
- 用户:zabbix
- 密码:tangy@123
原理总结(彻底看懂问题)
- 你之前所有 sock 软链接、路径配置,CentOS9+MySQL8.4 天生不兼容
- Zabbix7 网页对 sock 路径极其敏感,极易
No such file or directory - 改用 TCP 连接是当前版本组合唯一稳定方案
刷新页面直接 成功连接数据库、进入下一步,彻底解决该顽固报错。
十一、Zabbix Agent 客户端完整部署(消除 Agent 离线告警)
本节为 Zabbix7.0 本机 Agent 完整部署配置,适配 CentOS Stream9 环境,一键配置、开机自启、端口放行,彻底解决 Zabbix agent is not available 离线告警。
11.1 确认 Agent 程序文件
前文 Zabbix 编译命令已携带 --enable-agent,程序已自动生成,校验文件:
bash
ls /usr/local/zabbix/sbin/zabbix_agentd
11.2 初始化 Agent 配置文件(非交互式标准化配置)
bash
# 备份默认配置
cp /usr/local/zabbix/etc/zabbix_agentd.conf /usr/local/zabbix/etc/zabbix_agentd.conf.bak
# 清空默认配置,写入标准化最优配置
cat > /usr/local/zabbix/etc/zabbix_agentd.conf << EOF
# 服务端IP(允许Zabbix服务端主动连接)
Server=127.0.0.1
# 主动上报服务端地址
ServerActive=127.0.0.1
# 本机监控主机名(必须与前端主机名称完全一致)
Hostname=Zabbix-Server
# 日志路径
LogFile=/usr/local/zabbix/logs/zabbix_agentd.log
# 日志轮转大小
LogFileSize=10
# 客户端监听端口
ListenPort=10050
# 允许远程命令执行(适配常用自动运维监控)
EnableRemoteCommands=1
# 超时时间适配
Timeout=30
EOF
# 权限归属 zabbix 用户
chown zabbix:zabbix /usr/local/zabbix/etc/zabbix_agentd.conf
chown zabbix:zabbix /usr/local/zabbix/logs/
11.3 配置 Agent systemd 开机自启服务
bash
# 编写 zabbix-agent 系统服务文件
cat > /usr/lib/systemd/system/zabbix-agent.service << EOF
[Unit]
Description=Zabbix 7.0.29 Agent
After=network.target
[Service]
Type=forking
User=zabbix
Group=zabbix
ExecStart=/usr/local/zabbix/sbin/zabbix_agentd
ExecStop=/usr/bin/kill -9 \$(pidof zabbix_agentd)
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
11.4 放行10050监控端口、关闭拦截
bash
# 临时关闭SELinux拦截
setenforce 0
# 放行agent默认10050端口(永久生效)
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --reload
11.5 启动服务并设置开机自启
bash
# 重载服务、开机自启、启动agent
systemctl daemon-reload
systemctl enable zabbix-agent
systemctl start zabbix-agent
# 查看运行状态
systemctl status zabbix-agent
11.6 连通性校验(彻底杜绝离线告警)
bash
# 查看10050端口监听
ss -ltnp | grep 10050
# 本地自测连通性
telnet 127.0.0.1 10050
11.7 Zabbix前端主机配置关键(必做)
登录 Zabbix 前端 - 配置 - 主机,修改本机监控主机参数:
- 主机名称 :填写
Zabbix-Server(与Agent配置 Hostname 完全一致) - 接口IP :
127.0.0.1,端口10050 - 保存后等待3分钟,Agent离线告警自动消失
11.8 常见 Agent 离线问题小结
- 主机名不匹配:前端主机名与
zabbix_agentd.conf中 Hostname 不一致,是离线最常见原因 - 端口拦截:防火墙未放行10050、SELinux拦截导致通信失败
- 服务未常驻:agent异常退出,设置systemd自动重启保障可用性