Jelajahi Sumber

Zabbix 7.4.16 单机部署:docker-compose + 审计 + README

clm0081 4 hari lalu
melakukan
76bedbfe04
3 mengubah file dengan 235 tambahan dan 0 penghapusan
  1. 54 0
      README.md
  2. 43 0
      compose-audit.md
  3. 138 0
      docker-compose.yaml

+ 54 - 0
README.md

@@ -0,0 +1,54 @@
+# Zabbix 单机 Docker 部署(zabbix-deploy)
+
+本仓库托管 Zabbix 服务器单机 Docker Compose 部署文件与配置审计说明。
+
+## 组件与版本
+- `zabbix/zabbix-server-mysql:ubuntu-7.4.16`
+- `zabbix/zabbix-web-nginx-mysql:ubuntu-7.4.16`
+- `mysql:8.0.43`
+
+> 镜像均为**精确版本锁定**,避免 `docker compose pull` 时被悄悄升级到新大版本。
+
+## 文件
+- `docker-compose.yaml` —— 生产用编排文件(当前 7.4.16)
+- `compose-audit.md` —— 原 compose 的问题审计与缓存容量重估说明
+
+## 部署位置
+- 服务器:`10.160.10.213`
+- 部署目录:`/opt/zabbix`
+- Web 访问:`http://192.168.87.20:8080/`
+
+## 首次/变更部署步骤
+```bash
+cd /opt/zabbix
+cp -f docker-compose.yaml docker-compose.yaml.bak_$(date +%s)   # 先备份
+docker compose -f docker-compose.yaml config -q                 # 语法校验
+docker compose -p zabbix up -d                                  # 重建生效
+docker compose -p zabbix ps                                     # 查看状态
+```
+
+## 升级步骤(同大版本补丁升级,如 7.4.x → 7.4.y)
+1. **备份数据库(务必)**:
+   ```bash
+   docker exec -i zabbix-mysql sh -c \
+     'MYSQL_PWD=****** mysqldump -uroot --single-transaction --quick \
+      --routines --triggers --events --set-gtid-purged=OFF zabbix' \
+     | gzip > /opt/zabbix/backup/zabbix_$(date +%Y%m%d_%H%M%S).sql.gz
+   gzip -t /opt/zabbix/backup/zabbix_*.sql.gz   # 校验完整性
+   ```
+2. 修改 `docker-compose.yaml` 中 server / web 镜像 tag 到目标版本。
+3. `docker compose -p zabbix up -d`,server 启动时会自动执行数据库结构升级(日志中可见 `starting automatic database upgrade ... fully completed`)。
+4. 校验:`docker exec zabbix-server zabbix_server -V`,以及 Web HTTP 200、采集速率恢复正常。
+
+> 注意:补丁升级可能推进数据库 optional 版本(例如 7.4.2→7.4.16 为 07040000→07040011),**回滚需还原备份**,因此第 1 步不可省略。
+
+## 关键环境变量(可在 `.env` 覆盖)
+- `MYSQL_ROOT_PASSWORD` / `MYSQL_PASSWORD`(默认已内置,建议外部 `.env` 管理)
+- `TZ`(默认 `UTC`,可按需设为 `Africa/Casablanca` 等)
+- 缓存:`ZBX_CACHESIZE`、`ZBX_VALUECACHESIZE`、`ZBX_TRENDCACHESIZE`、`ZBX_HISTORYCACHESIZE`、`ZBX_TRENDSINDEXCACHESIZE` 等
+- 采集进程:`ZBX_STARTSNMPPOLLERS`、`ZBX_STARTLLDWORKERS`、`ZBX_STARTPREPROCESSORS`
+
+## 端口
+- Zabbix Server:`10051`
+- Web(nginx):容器内 `8080` / `8443`
+- MySQL:容器内 `3306`(不对外暴露)

+ 43 - 0
compose-audit.md

@@ -0,0 +1,43 @@
+# Zabbix Docker Compose 审计 & 缓存重估说明
+
+> 主机 10.160.10.213 · Zabbix 7.4.2 · MySQL 8.0.43 · 审计时间 2026-11-04
+
+## 一、现有 `/opt/zabbix/docker-compose.yaml` 的问题
+
+| # | 位置 | 问题 | 影响 | 建议 |
+|---|------|------|------|------|
+| 1 | 顶部 `version: '3'` | Compose v2 已废弃该字段,会打印 warning | 无功能影响,但提示噪音 | 删除 |
+| 2 | 所有 `image` 未锁版本(`zabbix/zabbix-server-mysql`、`mysql:8.0-oraclelinux9`) | 实际是 `latest`/浮动 tag | 一旦 `docker compose pull` 会被动升级(7.4.x→更高),可能不兼容 | 锁定 `ubuntu-7.4.2` / `mysql:8.0.43` |
+| 3 | `zabbix-server` 使用 `privileged: true` + `cap_add: ALL` | 容器获得近乎宿主机全部能力 | 严重过度授权;容器内进程若被利用可影响宿主机 | 改为 `cap_add: [NET_RAW, SYS_NICE]`(仅 ICMP/优先级需要) |
+| 4 | 使用 `links:`(web 服务) | 旧式链接,v2 已不推荐 | 无功能影响,但与自定义网络重复 | 删除,改用同一 `networks` + `depends_on` |
+| 5 | `depends_on` 仅列名字 | 不等待 MySQL 真正就绪 | MySQL 启动慢时 server/web 可能反复重连 | 用 `condition: service_healthy`(已配 healthcheck) |
+| 6 | 密码明文硬编码在 compose 且 root/普通用户同密码 | 弱口令 `CobcoIT132`,泄露面大 | 安全风险 | 用 `.env` + `${VAR:-默认}` 覆盖;建议改强密码 |
+| 7 | 未设置时区(`TZ`/`PHP_TZ`) | 容器默认 UTC | Web 显示/报表时间可能不符预期 | 显式 `TZ`(默认保留 UTC,可改 Asia/Shanghai) |
+| 8 | `--default-authentication-plugin=mysql_native_password` | MySQL 8.0.34+ 起该参数已弃用(8.4 移除) | 仅 warning,暂无影响 | 保持现状即可(换 8.4 前需处理) |
+| 9 | 无 `stop_grace_period` | 停容器时默认 10s 强杀 | MySQL/Zabbix 可能非正常关闭 | mysql 设 1m、server 设 30s |
+| 10 | healthcheck 无 `start_period` | MySQL 首次初始化较久 | 可能被误判 unhealthy | 增加 `start_period: 40s` |
+
+> 说明:`privileged`/`cap_add:ALL` 的收紧会改变运行参数;若线上有依赖特殊能力的功能(少见),重建后请观察。除此之外其余修改均为等价或增强,可直接替换。
+
+## 二、缓存重估(关键)
+
+实测(迁移后:187 主机 / 75700 项 / 写入 445 values/s)各缓存**真实占用**:
+
+| 缓存 | 环境变量 | 原配置 | 实测占用 | 结论 |
+|------|----------|--------|----------|------|
+| 配置缓存 | `ZBX_CACHESIZE` | 1024M | **12.06% ≈ 123M** | 512M(≈4x 余量) |
+| 值缓存 | `ZBX_VALUECACHESIZE` | 1024M | **1.15% ≈ 12M** | 128M |
+| 趋势缓存 | `ZBX_TRENDCACHESIZE` | **1G** | **0.39% ≈ 4M** | 64M(原值超配约 250 倍) |
+| 历史缓存 | `ZBX_HISTORYCACHESIZE` | 128M | ≈0.00008% | 64M |
+| 历史索引 | `ZBX_HISTORYINDEXCACHESIZE` | 32M | 0.24% ≈ 77K | 16M |
+| 趋势函数缓存 | `ZBX_TRENDFUNCTIONCACHESIZE` | 64M | ≈0 | 16M |
+
+- 三个被加到 1G 的缓存(配置/值/趋势)实际合计只用约 **139M**,预留 **3.3G**,属严重超配。
+- 按上表调整后缓存合计约 **800M**,比原来节省约 **2.5G** 内存,且都留有 4~10 倍余量。
+- 配置缓存务必不要压过低(会“Cannot allocate shared memory for configuration cache”);512M 对当前 7.5 万项、未来翻倍到 15 万项仍安全。
+
+> ⚠️ 注意:**不要在全量 LLD 迁移/大批发现进行中**把配置缓存调小——应在迁移稳定后再切换 compose。本次迁移已完成,可安全切换。
+
+## 三、其他观察
+- `ZBX_STARTSNMPPOLLERS: 30` 保留合理:186 台交换机改为“每台 1 次 walk”,实测 SNMP poller 繁忙度仅 **2.85%**、unreachable 0%,30 个充裕(若追求精简可降到 15)。
+- 磁盘 `/` 191G 用 73G(39%),MySQL 数据在 `/opt/zabbix/zabbix-server/mysql_data`,建议定期关注 history 增长(可配 housekeeping)。

+ 138 - 0
docker-compose.yaml

@@ -0,0 +1,138 @@
+# =============================================================================
+# Zabbix 7.4.16 单机 Docker Compose —— 优化/低坑版
+# 用法(先备份原文件):
+#   cd /opt/zabbix
+#   cp docker-compose.yaml docker-compose.yaml.bak_$(date +%s)
+#   docker compose -f docker-compose.new.yaml config -q        # 先校验语法
+#   docker compose -f docker-compose.new.yaml up -d            # 重建生效
+# 说明:
+#   - 镜像锁定精确版本,避免 `pull` 后被动升级。
+#   - 密码/时区均可用 .env 覆盖,默认值与原文件一致,可直接替换。
+#   - 缓存按 75k 项 / 186 台交换机的实测用量重估(见说明文档)。
+# =============================================================================
+services:
+  zabbix-mysql:
+    image: mysql:8.0.43
+    container_name: zabbix-mysql
+    command:
+      - --character-set-server=utf8mb4
+      - --collation-server=utf8mb4_bin
+      - --innodb-buffer-pool-size=1G
+      - --innodb-file-per-table=1
+      - --log-bin-trust-function-creators=1
+    environment:
+      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
+      MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
+      MYSQL_USER: ${MYSQL_USER:-zabbix}
+      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
+      TZ: ${TZ:-UTC}
+    volumes:
+      - /opt/zabbix/zabbix-server/mysql_data:/var/lib/mysql
+    networks:
+      zabbix:
+        ipv4_address: 192.168.87.22
+    restart: unless-stopped
+    stop_grace_period: 1m
+    logging:
+      driver: json-file
+      options:
+        max-size: "10m"
+        max-file: "3"
+    healthcheck:
+      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
+      interval: 10s
+      timeout: 5s
+      retries: 10
+      start_period: 40s
+
+  zabbix-server:
+    image: zabbix/zabbix-server-mysql:ubuntu-7.4.16
+    container_name: zabbix-server
+    networks:
+      zabbix:
+        ipv4_address: 192.168.87.21
+    ulimits:
+      nproc: 65535
+      nofile:
+        soft: 20000
+        hard: 40000
+    # 仅保留实际需要的权限:NET_RAW 供 fping(ICMP 监控),SYS_NICE 供进程优先级。
+    # 不再使用 privileged:true / cap_add:ALL(过度授权、有安全风险)。
+    # 若完全不做 ICMP ping 监控,可删除整个 cap_add 段。
+    cap_add:
+      - NET_RAW
+      - SYS_NICE
+    sysctls:
+      - net.ipv4.ip_local_port_range=1024 65000
+      - net.ipv4.conf.all.accept_redirects=0
+      - net.ipv4.conf.all.secure_redirects=0
+      - net.ipv4.conf.all.send_redirects=0
+    restart: unless-stopped
+    stop_grace_period: 30s
+    logging:
+      driver: json-file
+      options:
+        max-size: "10m"
+        max-file: "3"
+    environment:
+      DB_SERVER_HOST: zabbix-mysql
+      MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
+      MYSQL_USER: ${MYSQL_USER:-zabbix}
+      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
+      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
+      TZ: ${TZ:-UTC}
+      # ---- 缓存:按 75k 项、186 台交换机的实测用量重新定容 ----
+      ZBX_CACHESIZE: 512M                # 配置缓存 实测 12%(~123M),512M 留约 4 倍余量
+      ZBX_VALUECACHESIZE: 128M           # 值缓存   实测 1.1%(~12M)
+      ZBX_TRENDCACHESIZE: 64M            # 趋势缓存 实测 0.39%(~4M),原 1G 严重超配
+      ZBX_HISTORYCACHESIZE: 64M          # 历史缓存 实测≈0
+      ZBX_HISTORYINDEXCACHESIZE: 16M     # 历史索引 实测 0.24%(~77K)
+      ZBX_TRENDFUNCTIONCACHESIZE: 16M    # 趋势函数缓存,默认 4M 已足
+      # ---- 进程数:186 台交换机以 1 次 walk/台 轮询,30 个 SNMP poller 实测 busy≈3% ----
+      ZBX_STARTSNMPPOLLERS: 30
+      ZBX_STARTLLDWORKERS: 10            # 大批 LLD 发现更快
+      ZBX_STARTPREPROCESSORS: 5
+    ports:
+      - '10051:10051'
+    volumes:
+      - /opt/zabbix/zabbix-server/data:/data
+      - /opt/zabbix/zabbix-server/data/alertscripts:/usr/lib/zabbix/alertscripts
+    depends_on:
+      zabbix-mysql:
+        condition: service_healthy
+
+  zabbix-web-nginx-mysql:
+    image: zabbix/zabbix-web-nginx-mysql:ubuntu-7.4.16
+    container_name: zabbix-webservice
+    networks:
+      zabbix:
+        ipv4_address: 192.168.87.20
+    restart: unless-stopped
+    logging:
+      driver: json-file
+      options:
+        max-size: "10m"
+        max-file: "3"
+    environment:
+      DB_SERVER_HOST: zabbix-mysql
+      MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix}
+      MYSQL_USER: ${MYSQL_USER:-zabbix}
+      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CobcoIT132}
+      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CobcoIT132}
+      ZBX_SERVER_HOST: zabbix-server
+      TZ: ${TZ:-UTC}
+      PHP_TZ: ${TZ:-UTC}
+    volumes:
+      - /opt/zabbix/zabbix-server/web:/data
+      - /opt/zabbix/zabbix-server/fonts/simkai.ttf:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf
+    depends_on:
+      zabbix-mysql:
+        condition: service_healthy
+      zabbix-server:
+        condition: service_started
+
+networks:
+  zabbix:
+    ipam:
+      config:
+        - subnet: 192.168.87.0/24