Zabbix企业级监控从零搭建到自动化告警
在IT运维中,监控系统是保障业务稳定运行的核心基础设施。Zabbix作为一款功能强大的开源监控解决方案,支持服务器、网络设备、应用程序等全方位监控。本文将带你从零搭建企业级Zabbix监控平台。# 监控Nginx连接数# 监控Docker容器数# 监控磁盘IO# 重启Agent生效模块内容部署Docker Compose快速搭建AgentLinux/Windows部署配置监控项系统监控、自定义监控
·
前言
在IT运维中,监控系统是保障业务稳定运行的核心基础设施。Zabbix作为一款功能强大的开源监控解决方案,支持服务器、网络设备、应用程序等全方位监控。本文将带你从零搭建企业级Zabbix监控平台。
一、为什么选择Zabbix
1.1 Zabbix vs 其他监控方案
| 特性 | Zabbix | Prometheus | Nagios |
|---|---|---|---|
| 数据存储 | 关系型数据库 | 时序数据库 | 文件 |
| 配置方式 | Web界面 | 配置文件 | 配置文件 |
| 自动发现 | ✅ 强大 | ⭕ 需配合 | ❌ |
| 分布式 | ✅ Proxy | ⭕ Federation | ❌ |
| 告警通知 | ✅ 丰富 | ⭕ Alertmanager | ✅ |
| 学习曲线 | 中等 | 较高 | 较低 |
| 适用场景 | 传统运维 | 云原生 | 小规模 |
1.2 Zabbix架构
┌─────────────────┐
│ Zabbix Server │
│ (核心) │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐
│ Zabbix Agent│ │ Zabbix Proxy│ │ SNMP │
│ (主动/被动)│ │ (分布式) │ │ 设备 │
└─────────────┘ └─────────────┘ └─────────────┘
二、Docker Compose快速部署
2.1 完整部署配置
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: zabbix-mysql
command:
- mysqld
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_bin
- --default-authentication-plugin=mysql_native_password
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
MYSQL_ROOT_PASSWORD: root_password
volumes:
- zabbix_mysql_data:/var/lib/mysql
networks:
- zabbix-net
restart: unless-stopped
zabbix-server:
image: zabbix/zabbix-server-mysql:ubuntu-7.0-latest
container_name: zabbix-server
environment:
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
MYSQL_ROOT_PASSWORD: root_password
ZBX_CACHESIZE: 128M
ZBX_STARTPOLLERS: 10
ZBX_STARTPINGERS: 5
ports:
- "10051:10051"
volumes:
- zabbix_server_alertscripts:/usr/lib/zabbix/alertscripts
- zabbix_server_externalscripts:/usr/lib/zabbix/externalscripts
networks:
- zabbix-net
depends_on:
- mysql
restart: unless-stopped
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:ubuntu-7.0-latest
container_name: zabbix-web
environment:
ZBX_SERVER_HOST: zabbix-server
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
PHP_TZ: Asia/Shanghai
ports:
- "8080:8080"
networks:
- zabbix-net
depends_on:
- mysql
- zabbix-server
restart: unless-stopped
zabbix-agent:
image: zabbix/zabbix-agent:ubuntu-7.0-latest
container_name: zabbix-agent
environment:
ZBX_HOSTNAME: "Zabbix server"
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
ports:
- "10050:10050"
networks:
- zabbix-net
depends_on:
- zabbix-server
restart: unless-stopped
volumes:
zabbix_mysql_data:
zabbix_server_alertscripts:
zabbix_server_externalscripts:
networks:
zabbix-net:
driver: bridge
2.2 启动与访问
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f zabbix-server
# 访问Web界面
# http://localhost:8080
# 默认账号: Admin / zabbix
三、Agent部署与配置
3.1 Linux Agent安装
# Ubuntu/Debian
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu$(lsb_release -rs)_all.deb
dpkg -i zabbix-release_7.0-1+ubuntu$(lsb_release -rs)_all.deb
apt update
apt install zabbix-agent2
# CentOS/RHEL
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/8/x86_64/zabbix-release-7.0-1.el8.noarch.rpm
dnf install zabbix-agent2
3.2 Agent配置
# /etc/zabbix/zabbix_agent2.conf
# Zabbix Server地址
Server=192.168.1.100
# 主动模式Server地址
ServerActive=192.168.1.100
# Agent主机名(需与Zabbix Web中配置一致)
Hostname=web-server-01
# 日志级别
DebugLevel=3
# 允许远程命令(谨慎开启)
# EnableRemoteCommands=1
# 自定义监控项
UserParameter=custom.cpu.count,nproc
UserParameter=custom.memory.available,free -m | awk '/Mem:/{print $7}'
3.3 启动Agent
systemctl enable zabbix-agent2
systemctl start zabbix-agent2
systemctl status zabbix-agent2
3.4 Windows Agent
# 下载Windows Agent MSI包安装
# https://www.zabbix.com/download_agents
# 配置文件位置
# C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf
# 服务管理
net start "Zabbix Agent 2"
四、监控配置实战
4.1 添加主机
Configuration → Hosts → Create host
Host name: web-server-01
Visible name: Web服务器01
Groups: Linux servers
Interfaces:
- Agent: 192.168.1.10:10050
Templates:
- Linux by Zabbix agent
- Nginx by Zabbix agent
4.2 自定义监控项
# 监控Nginx连接数
UserParameter=nginx.connections.active,curl -s http://localhost/nginx_status | awk '/Active/{print $3}'
# 监控Docker容器数
UserParameter=docker.containers.running,docker ps -q | wc -l
# 监控磁盘IO
UserParameter=disk.io.read[*],iostat -d $1 1 2 | tail -1 | awk '{print $3}'
UserParameter=disk.io.write[*],iostat -d $1 1 2 | tail -1 | awk '{print $4}'
# 重启Agent生效
systemctl restart zabbix-agent2
4.3 自动发现规则
# 自动发现磁盘分区
Key: vfs.fs.discovery
Filter: {#FSTYPE} matches (ext4|xfs|btrfs)
# 自动发现Docker容器
Key: docker.containers.discovery
# 需要自定义脚本
自动发现脚本示例:
#!/usr/bin/env python3
# /usr/lib/zabbix/externalscripts/docker_discovery.py
import subprocess
import json
def discover_containers():
result = subprocess.run(
['docker', 'ps', '--format', '{{.Names}}'],
capture_output=True, text=True
)
containers = result.stdout.strip().split('\n')
data = []
for container in containers:
if container:
data.append({'{#CONTAINER}': container})
return json.dumps({'data': data})
if __name__ == '__main__':
print(discover_containers())
五、告警配置
5.1 触发器表达式
# CPU使用率超过80%持续5分钟
avg(/web-server-01/system.cpu.util,5m)>80
# 内存使用率超过90%
last(/web-server-01/vm.memory.util)>90
# 磁盘空间不足10%
last(/web-server-01/vfs.fs.pused[/])>90
# 服务不可达
nodata(/web-server-01/agent.ping,5m)=1
# Nginx进程不存在
last(/web-server-01/proc.num[nginx])=0
5.2 邮件告警配置
# 安装邮件工具
apt install mailutils
# 创建告警脚本
cat > /usr/lib/zabbix/alertscripts/send_email.sh << 'EOF'
#!/bin/bash
TO="$1"
SUBJECT="$2"
BODY="$3"
echo "$BODY" | mail -s "$SUBJECT" "$TO"
EOF
chmod +x /usr/lib/zabbix/alertscripts/send_email.sh
Web配置:
Administration → Media types → Create media type
Name: Email
Type: Script
Script name: send_email.sh
Script parameters:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
5.3 企业微信告警
#!/usr/bin/env python3
# /usr/lib/zabbix/alertscripts/wechat.py
import sys
import requests
import json
# 企业微信配置
CORPID = 'your_corpid'
SECRET = 'your_secret'
AGENTID = 1000002
def get_token():
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={SECRET}'
resp = requests.get(url)
return resp.json()['access_token']
def send_message(user, subject, message):
token = get_token()
url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}'
data = {
"touser": user,
"msgtype": "text",
"agentid": AGENTID,
"text": {
"content": f"【{subject}】\n{message}"
}
}
resp = requests.post(url, json=data)
return resp.json()
if __name__ == '__main__':
user = sys.argv[1]
subject = sys.argv[2]
message = sys.argv[3]
result = send_message(user, subject, message)
print(result)
5.4 告警升级
Actions → Create action
Conditions:
- Trigger severity >= High
Operations:
Step 1 (0-30min): 发送给一线值班
Step 2 (30-60min): 发送给二线负责人
Step 3 (60min+): 发送给技术总监 + 电话告警
六、分布式监控(Proxy)
6.1 Proxy部署
# docker-compose-proxy.yml
version: '3.8'
services:
zabbix-proxy:
image: zabbix/zabbix-proxy-sqlite3:ubuntu-7.0-latest
container_name: zabbix-proxy
environment:
ZBX_PROXYMODE: 0 # 0=主动模式
ZBX_HOSTNAME: proxy-beijing
ZBX_SERVER_HOST: 192.168.1.100 # Zabbix Server地址
ZBX_CONFIGFREQUENCY: 300
ports:
- "10051:10051"
volumes:
- zabbix_proxy_data:/var/lib/zabbix
restart: unless-stopped
volumes:
zabbix_proxy_data:
6.2 多站点监控架构
┌─────────────────────────────────────┐
│ 总部 Zabbix Server │
│ 192.168.1.100 │
└──────────────┬──────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ 北京Proxy │ │ 上海Proxy │ │ 广州Proxy │
│10.1.0.100 │ │10.2.0.100 │ │10.3.0.100 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
[北京Agent] [上海Agent] [广州Agent]
6.3 跨网络Proxy通信
当分公司与总部网络不通时,传统方案需要:
- 开放公网端口(安全风险)
- VPN隧道(配置复杂)
更简单的方案是使用组网软件(如星空组网)将各站点组成虚拟局域网,Proxy就能直接与Server通信:
# Proxy配置
ZBX_SERVER_HOST=10.26.0.1 # Server的虚拟内网IP
# 所有站点在同一个虚拟网络中
# 无需公网IP,无需端口映射
七、性能优化
7.1 Server配置优化
# /etc/zabbix/zabbix_server.conf
# 缓存配置
CacheSize=256M
HistoryCacheSize=64M
HistoryIndexCacheSize=16M
TrendCacheSize=16M
ValueCacheSize=64M
# 进程配置
StartPollers=20
StartPollersUnreachable=5
StartPingers=10
StartDiscoverers=5
StartHTTPPollers=5
# 数据库优化
DBHost=localhost
DBSocket=/var/run/mysqld/mysqld.sock
# 使用Unix Socket比TCP快
7.2 数据库优化
-- 分区表(按天分区历史数据)
ALTER TABLE history
PARTITION BY RANGE (clock) (
PARTITION p202512 VALUES LESS THAN (UNIX_TIMESTAMP('2025-01-01'))
);
-- 定期清理旧数据
DELETE FROM history WHERE clock < UNIX_TIMESTAMP(NOW() - INTERVAL 90 DAY);
-- 优化查询
OPTIMIZE TABLE history;
ANALYZE TABLE history;
7.3 监控项优化
# 合理设置采集间隔
- 关键指标: 30s-1m
- 普通指标: 5m
- 趋势数据: 30m
# 避免过度监控
- 每台主机监控项控制在100-200个
- 使用主动模式减轻Server压力
- 合理使用低级别发现规则
八、常用监控模板
8.1 MySQL监控
# Agent配置
UserParameter=mysql.status[*],mysqladmin -umonitor -ppassword extended-status 2>/dev/null | awk '/$1/{print $$4}'
UserParameter=mysql.ping,mysqladmin -umonitor -ppassword ping 2>/dev/null | grep -c alive
UserParameter=mysql.version,mysql -V 2>/dev/null | awk '{print $5}'
8.2 Redis监控
# Agent配置
UserParameter=redis.info[*],redis-cli -h localhost -p 6379 INFO $1 2>/dev/null | grep -w $2 | cut -d: -f2
UserParameter=redis.ping,redis-cli -h localhost ping 2>/dev/null | grep -c PONG
8.3 Nginx监控
# nginx.conf - 添加状态页
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
# Agent配置
UserParameter=nginx.active,curl -s http://127.0.0.1/nginx_status | awk '/Active/{print $3}'
UserParameter=nginx.accepts,curl -s http://127.0.0.1/nginx_status | awk 'NR==3{print $1}'
UserParameter=nginx.handled,curl -s http://127.0.0.1/nginx_status | awk 'NR==3{print $2}'
UserParameter=nginx.requests,curl -s http://127.0.0.1/nginx_status | awk 'NR==3{print $3}'
九、Dashboard定制
9.1 创建仪表盘
Dashboards → Create dashboard
添加Widget:
- 系统概览(Problems by severity)
- Top主机(Top hosts by CPU/Memory)
- 趋势图(Graph)
- 地理分布(Geomap)
- 服务状态(Service status)
9.2 SLA报表
Services → Create service
Service name: 生产环境Web服务
SLA: 99.9%
Status calculation: Most critical of child services
Children:
- Web Server 01
- Web Server 02
- Database Master
十、总结
Zabbix是一个功能完善的企业级监控平台,本文覆盖了:
| 模块 | 内容 |
|---|---|
| 部署 | Docker Compose快速搭建 |
| Agent | Linux/Windows部署配置 |
| 监控项 | 系统监控、自定义监控、自动发现 |
| 告警 | 邮件、企业微信、告警升级 |
| 分布式 | Proxy部署、多站点监控 |
| 优化 | Server调优、数据库优化 |
运维建议:
- 从小规模开始,逐步扩展监控范围
- 合理设置告警阈值,避免告警疲劳
- 定期review监控项,移除无用项
- 做好历史数据归档和清理
参考资料
- Zabbix官方文档:https://www.zabbix.com/documentation/7.0/zh
- Zabbix最佳实践:https://www.zabbix.com/documentation/7.0/zh/manual/installation/requirements/best_practices
- Zabbix模板市场:https://www.zabbix.com/integrations
本文首发于CSDN,转载请注明出处。
更多推荐



所有评论(0)