Zabbix 企业级监控系统从零搭建:LNMP 架构 + 邮件告警全流程
服务器多了怎么监控?CPU 跑满了磁盘满了谁先知道?这篇文章带你从零搭建一套完整的 Zabbix 监控系统,包含 LNMP 环境部署、Agent 安装、自定义监控和邮件告警配置。
一、Zabbix 是什么?
Zabbix 是一款企业级开源分布式监控解决方案,能监控网络、服务器、虚拟机、应用、数据库、云平台等各种指标。
简单说就是:你想监控什么,它都能帮你盯着,出问题立刻发邮件通知你。
核心组件
| 组件 | 作用 |
|---|---|
| Zabbix Server | 大脑,负责接收数据、判断告警、调度任务 |
| Zabbix Agent | 装在被监控机器上,采集本地数据上报 |
| 数据库 | 存配置和历史数据,常用 MySQL/MariaDB |
| Web 前端 | PHP 写的可视化界面,用来配置和看图表 |
几个核心概念先搞懂
- 监控项(Item):采集的具体指标,比如 CPU 使用率、内存占用
- 触发器(Trigger):阈值规则,比如 CPU > 90% 持续 5 分钟就告警
- 动作(Action):触发后干什么,发邮件、执行脚本都可以
- 模板(Template):预定义好的监控项集合,批量套用到主机上
二、实验环境
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| zabbix-server | 192.168.108.50 | 监控服务端 + LNMP |
| mysql001 | 192.168.108.51 | 被监控端(装 Agent2) |
Zabbix 基于 LNMP 架构部署,所以我们先搭 Nginx + MariaDB + PHP。
三、第一步:搭建 LNMP 环境
1. 安装 Nginx
先配 yum 源:
bash
vim /etc/yum.repos.d/nginx.repo
ini
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
enabled=1
gpgcheck=0
安装启动:
bash
yum install nginx -y
systemctl start nginx
systemctl enable nginx
firewall-cmd --add-service=http --zone=public
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --reload
2. 安装 MariaDB
Zabbix 6.0 需要 MariaDB 10.x,先配源:
bash
vim /etc/yum.repos.d/mariadb.repo
ini
[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.6/rhel7-amd64/
enabled = 1
gpgcheck = 0
安装并启动:
bash
yum -y install mariadb-server mariadb
systemctl enable mariadb --now
初始化 root 密码:
bash
mysql
sql
DELETE FROM mysql.user WHERE User='';
ALTER USER root@localhost IDENTIFIED BY 'root123';
3. 安装 PHP
先装 epel 和 webtatic 源:
bash
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安装 PHP 7.2 和扩展:
bash
yum -y install php72w php72w-cli php72w-common php72w-devel \
php72w-embedded php72w-gd php72w-mbstring php72w-pdo \
php72w-xml php72w-fpm php72w-mysqlnd php72w-opcache \
php72w-ldap php72w-bcmath
4. 配置 Nginx 支持 PHP
修改 php-fpm 配置,把 apache 改成 nginx:
bash
vim /etc/php-fpm.d/www.conf
ini
user = nginx
group = nginx
修改 Nginx 配置,支持 index.php:
bash
vim /etc/nginx/conf.d/default.conf
在 index 那行加上 index.php,然后把 PHP 解析块的注释去掉:
nginx
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
5. 优化 PHP 配置
bash
vim /etc/php.ini
Zabbix 要求的几个关键参数:
ini
short_open_tag = On
expose_php = Off
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
date.timezone = Asia/Shanghai
启动服务:
bash
systemctl enable php-fpm --now
systemctl restart nginx
写个 info.php 测试一下 LNMP 是否正常。
四、第二步:部署 Zabbix Server
1. 创建数据库
sql
CREATE DATABASE zabbix character set utf8 collate utf8_bin;
GRANT all privileges ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'zabbix123';
GRANT all privileges ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbix123';
flush privileges;
💡
collate utf8_bin一定要加,Zabbix 对字符排序比较有要求,不然会出各种奇奇怪怪的问题。
2. 导入数据库
解压源码包后按顺序导入:
bash
tar zxvf zabbix-6.0.6.tar.gz
cd /root/zabbix-6.0.6/database/mysql/
mysql -uroot -proot123 zabbix < schema.sql
mysql -uroot -proot123 zabbix < images.sql
mysql -uroot -proot123 zabbix < data.sql
mysql -uroot -proot123 zabbix < double.sql
mysql -uroot -proot123 zabbix < history_pk_prepare.sql
导入完可以 use zabbix; show tables; 看看,应该有 178 张表。
3. 编译安装 Zabbix Server
先装依赖包:
bash
yum install -y mysql-devel pcre-devel openssl-devel zlib-devel \
libxml2-devel net-snmp-devel net-snmp libssh2-devel OpenIPMI-devel \
libevent-devel openldap-devel libcurl-devel fping gcc gcc-c++ make
创建用户:
bash
useradd -s /sbin/nologin -M zabbix
编译配置:
bash
export CFLAGS="-std=gnu99"
cd zabbix-6.0.6/
./configure --sysconfdir=/etc/zabbix/ \
--enable-server \
--with-mysql \
--with-net-snmp \
--with-libxml2 \
--with-ssh2 \
--with-openipmi \
--with-zlib \
--with-libevent \
--with-openssl \
--with-ldap \
--with-libcurl \
--with-libpcre
编译安装:
bash
make install
4. 修改配置文件
bash
vim /etc/zabbix/zabbix_server.conf
ini
LogFile=/var/log/zabbix_server.log
DBPassword=zabbix123
创建日志文件并授权:
bash
touch /var/log/zabbix_server.log
chown zabbix.zabbix /var/log/zabbix_server.log
5. 添加 systemd 服务
bash
vim /usr/lib/systemd/system/zabbix-server.service
ini
[Unit]
Description=Zabbix Server with MySQL DB
After=syslog.target network.target mysqld.service
[Service]
Type=simple
ExecStart=/usr/local/sbin/zabbix_server -f
User=zabbix
[Install]
WantedBy=multi-user.target
启动并验证:
bash
systemctl start zabbix-server
netstat -ntap | grep 10051
看到 10051 端口在监听就对了。
6. 部署前端页面
bash
cp -r /root/zabbix-6.0.6/ui/* /usr/share/nginx/html/
chown -R nginx:nginx /usr/share/nginx/html/
systemctl restart nginx
浏览器访问 http://192.168.108.50,默认账号 Admin,密码 zabbix。
五、第三步:被监控端安装 Agent2
在 mysql001(192.168.108.51)上操作。
bash
# 关闭防火墙和 SELinux
systemctl stop firewalld.service
setenforce 0
# 装 Zabbix 官方源
rpm -ivh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm
# 安装 Agent2
yum install zabbix-agent2 -y
systemctl enable zabbix-agent2.service --now
修改配置:
bash
vim /etc/zabbix/zabbix_agent2.conf
ini
Server=192.168.108.50
ServerActive=192.168.108.50
Hostname=mysql001
重启生效:
bash
systemctl restart zabbix-agent2
六、第四步:Web 端添加监控主机
- 登录 Zabbix Web 界面
- 配置 → 主机 → 创建主机
- 填写主机名称,选择群组
- 关联模板(比如 Template MySQL)
- 添加 Agent 接口,IP 填被监控端地址,端口 10050
等一两分钟,可用性那一栏变成绿色 Z 就说明连通了。
测试一下:去被监控端停掉 MySQL 服务:
bash
systemctl stop mysqld
等一会儿,Zabbix 就会弹出告警了。再启动 MySQL,告警自动恢复。
七、第五步:配置邮件告警
光在 Web 上看还不够,出问题得发邮件通知才行。
1. 服务端装 mailx
bash
yum install mailx -y
2. 配置 QQ 邮箱
bash
vim /etc/mail.rc
末尾添加:
ini
set from=你的邮箱@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=你的邮箱@qq.com
set smtp-auth-password=你的QQ邮箱授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
⚠️ 这里填的是授权码,不是 QQ 密码!去 QQ邮箱设置里开启 SMTP 拿授权码。
手动发测试邮件:
bash
echo "测试内容" | mailx -s "测试主题" 你的邮箱@qq.com
收到就说明没问题。
3. 编写告警脚本
在 zabbix_server.conf 里指定脚本路径:
bash
vim /etc/zabbix/zabbix_server.conf
ini
AlertScriptsPath=/usr/lib/zabbix/alertscripts
创建脚本:
bash
vim /usr/lib/zabbix/alertscripts/mailx.sh
bash
#!/bin/bash
messages=`echo $3 | tr '\r\n' '\n'`
subject=`echo $2 | tr '\r\n' '\n'`
echo "${messages}" | mail -s "${subject}" $1 >> /tmp/mailx.log 2>&1
加权限:
bash
touch /tmp/mailx.log
chown -R zabbix.zabbix /tmp/mailx.log
chmod +x /usr/lib/zabbix/alertscripts/mailx.sh
chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts
重启 Zabbix Server。
4. Web 端配置告警媒介
- 管理 → 报警媒介类型 → 创建媒体类型
- 类型选「脚本」,脚本名填
mailx.sh - 添加三个脚本参数:
{ALERT.SENDTO}{ALERT.SUBJECT}{ALERT.MESSAGE}
然后到 管理 → 用户 → Admin → 报警媒介,把刚创建的媒介加上,收件人填自己的邮箱。
5. 配置动作
配置 → 动作 → 创建动作:
-
操作的主题:
{TRIGGER.STATUS}:{TRIGGER.NAME} -
消息内容:
告警主机:{HOST.NAME}
告警 IP:{HOST.IP}
告警时间:{EVENT.DATE}-{EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}:{ITEM.VALUE}
事件 ID:{EVENT.ID}
恢复操作也配一份,把「告警」改成「恢复」就行。
八、总结
整套 Zabbix 监控系统搭下来,核心就五步:
- 搭 LNMP 环境 ------ Nginx + MariaDB + PHP
- 装 Zabbix Server ------ 编译安装 + 导入数据库
- 装 Agent2 ------ 被监控端装客户端
- Web 加主机 ------ 关联模板开始监控
- 配邮件告警 ------ 出问题自动发邮件
📌 新手常见坑:
- PHP 配置参数不达标,Web 安装页面全是红叉
- 数据库字符集不对,页面乱码或者触发器不正常
- Agent 配置里 Server 地址写错,主机一直灰色
- 邮件发不出去,90% 是授权码填错或者证书没配好
Zabbix 刚入门的时候觉得配置项特别多,其实用多了就那几样:主机、模板、触发器、动作。把这四个概念搞懂,后面加什么监控都是套模板的事。
我是正在学运维的技术人,持续更新 Zabbix、ELK、K8s 这些运维必备工具的实操笔记,欢迎一起交流~