前言

在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监控项,移除无用项
  • 做好历史数据归档和清理

参考资料

  1. Zabbix官方文档:https://www.zabbix.com/documentation/7.0/zh
  2. Zabbix最佳实践:https://www.zabbix.com/documentation/7.0/zh/manual/installation/requirements/best_practices
  3. Zabbix模板市场:https://www.zabbix.com/integrations

本文首发于CSDN,转载请注明出处。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐