用 Zabbix 和 Docker 搭建监控平台

4,077 阅读9分钟
原文链接: blog.smoker.cc

Zabbix 是由 Alexei Vladishev 开发的一种网络监视、管理系统,基于 Server-Client 架构。可用于监视各种网络服务、服务器和网络机器等状态。(from Zabbix

1. 架构

Zabbix 作为企业级分布式监控系统,具有很多优点,如:分布式监控,支持 node 和 proxy 分布式模式;自动化注册,根据规则,自动注册主机到监控平台,自动添加监控模板;支持 agentd、snmp、ipmi 和 jmx 等很多通信方式。

同时,Zabbix 官方还发布了 Zabbix Docker 镜像。此次我们以 Zabbix 的官方 Docker 镜像为基础,搭建一个监控平台。 总体架构图如下所示:

其中,使用 Zabbix 官方的提供的镜像 Zabbix-3.0:3.0.0 作为 Zabbix Web GUI 和 Zabbix Server;Zabbix Server 用来接收来自 Zabbix agent 的数据,并将数据存储到 Zabbix Database,根据配置的监控项和获取到的数据,判断是否达到报警条件,来对主机进行监控;Zabbix Web GUI 提供了 Zabbix Server 的配置和数据展示的可视化界面;

使用 MySQL 作为 Zabbix Database,官方有相应的 MariaDB 的镜像,但是与非容器化的 MySQL 并没有什么区别,因此便于数据的集中管理,我们并不再单独启动一个 MySQL 容器,而是使用已经存在的 MySQL;

使用由 million12 提供的 zabbix-agent:2.4.7 镜像作为 Zabbix agent 部署在各个需要监控的主机上,用来采集 CPU 、内存和进程等监控项的的数据,并发送到 Zabbix Server;

2. 数据库配置

对于数据库无需过多配置,仅需为 Zabbix Server 配置一个用户名密码让其能够访问数据库 zabbix 即可。此处配置用户名:zabbix, 密码:zabbix,配置命令如下:

mysql> grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3. 启动 Zabbix Server

采用 docker-compose 的方式启动 Zabbix Server,docker-compose.yml 文件内容如下:

version: '2'
services:
  zabbix-server:
    image: zabbix/zabbix-3.0:3.0.0
    container_name: zabbix-server
    network_mode: "bridge"
    restart: always
    ports:
      - "8888:80"
      - "10051:10051"
    volumes:
      - /etc/localtime:/etc/localtime:ro
    environment:
      - ZS_DBHost=192.168.1.100
      - ZS_DBUser=zabbix
      - ZS_DBPassword=zabbix

其中环境变量 ZS_DBHost 是 Zabbix Server 的 IP,我的主机是 192.168.1.100; ZS_DBUserZS_DBPassword 是数据库的用户名和密码,即我们上一步设置的 zabbix;

暴露端口 8888 用于访问页面,10051 用于和 Zabbix-agent 通信;

docker-compose up -d 即可启动 Zabbix Server, 启动过程大约需要 1~3 min。用 docker logs -f zabbix-server 命令查看容器的日志,日志大致内容如下:

[smoker@192.168.1.100 zabbix-server]$ docker logs -f zabbix-server
Creating zabbix-server
Attaching to zabbix-server
zabbix-server | Nginx status page: allowed address set to 127.0.0.1.
zabbix-server | PHP-FPM status page: allowed address set to 127.0.0.1.
zabbix-server | [LOG 13:39:08] Preparing server configuration
zabbix-server | [LOG 13:39:16] Config updated.
zabbix-server | [LOG 13:39:16] Enabling logging and pid management
zabbix-server | [LOG 13:39:17] Done
zabbix-server | [LOG 13:39:17] Waiting for database server
zabbix-server | [LOG 13:39:17] Database server is available
zabbix-server | [LOG 13:39:17] Checking if database exists or SQL import is required
zabbix-server | [WARNING 13:39:17] Zabbix database doesn't exist. Installing and importing default settings
zabbix-server | ERROR 1044 (42000) at line 1: Access denied for user 'zabbix'@'%' to database 'zabbix'
zabbix-server | ERROR 1227 (42000) at line 1: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation
zabbix-server |
zabbix-server | [LOG 13:39:17] Database and user created, importing default SQL
zabbix-server |
zabbix-server | [LOG 13:42:37] Import finished, starting
zabbix-server | [LOG 13:42:37] Starting Zabbix version 3.0.0
zabbix-server | 2016
zabbix-server | 2016-04-07 13:42:37,691 CRIT Supervisor running as root (no user in config file)
zabbix-server | 2016-04-07 13:42:37,691 WARN Included extra file "/etc/supervisor.d/nginx.conf" during parsing
zabbix-server | 2016-04-07 13:42:37,691 WARN Included extra file "/etc/supervisor.d/php-fpm.conf" during parsing

通过日志可以看出,Zabbix Server 启动过程中使用了我们配置的用户名和密码初始化了名为 zabbix 的数据库,并导入相应的数据结构及相应的基础数据,所以该容器启动耗时长达 3 min 左右。容器启动后,我们访问 http://192.168.1.100:8888, 出现如下界面,证明 Zabbix Server 启动成功。

默认账号的用户名、密码是:Adminzabbix, 输入用户名密码登录,即可看到主界面。

进入到 Configuration 》Hosts 下,点击 disable 按钮,启用 Zabbix Server。

启用成功后,AVAILABILITY 项中 ZBX 变为绿色,如下图:

4. 启动 Zabbix agent

同样,Zabbix agent 的启动仍然以 docker-compose 的方式,不同的是 Zabbix agent 添加了一个配置文件,zabbix-agent 目录结构如下:

zabbix-agent
|-- conf
|   -- zabbix-agentd.conf
 -- docker-compose.yml

conf/zabbix-agentd.conf 的内容如下:

LogFile=/tmp/zabbix_agentd.log
EnableRemoteCommands=1
Server=192.168.1.100
ListenPort=10050
ServerActive=192.168.1.100

其中 ListenPort 为容器 zabbix-agent 暴露的端口,用于接收 Zabbix Server 的指令与其交互;ServerServerActive 都指向 Zabbix Server 的 IP;

docker-compose.yml 内容如下:

version: '2'
services:
  zabbix-agent:
    image: million12/zabbix-agent:2.4.7
    container_name: zabbix-agent
    restart: always
    network_mode: "bridge"
    ports:
      - "10050:10050"
    volumes:
      - ./conf/zabbix-agentd.conf:/etc/zabbix_agentd.conf
      - /proc:/data/proc
      - /sys:/data/sys
      - /dev:/data/dev
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - ZABBIX_SERVER=192.168.1.100

其中,ports 暴露了配置文件中需要暴露的接口;挂载 ./conf/zabbix-agentd.conf 自定义配置文件到容器中 /etc/zabbix_agentd.conf 取代默认的配置文件;挂载 /proc/sys/dev 到容器中 /data 相应文件夹下,用于 zabbix-agent 收集系统进程等监控信息;环境变量中 ZABBIX_SERVER 指向 Zabbix Server 的 IP;

运行 docker-compose up -d 即可启动;

5. 结束

数据库已经配置成功,Zabbix Server 正常启动,Zabbix agent 也正常启动,至于如何在 Zabbix Server 中添加需要监控的主机,有很多方式,如主动添加和跟 IP 范围自动发现,但是不在本文讨论范围之内。至此,用Zabbix 和 Docker 搭建监控平台已经完全实现。

(1)报警媒介 Email 配置注意项

SMTP helo 配置项中,一般是 SMTP server 根域名。如对于腾讯企业邮箱,SMTP server 是 smtp.exmail.qq.com,则此处的 SMTP helo 应填写 qq.com

(2)修改 Zabbix Server 系统语言为简体中文

对于 3.0 版本的 Zabbix Server 系统语言选择下拉框中默认是没有简体中文的,需要改动其源码,改动方式如下:

  1. docker exec -it zabbix-server /bin/bash 进入容器;
  2. vi /usr/local/src/zabbix/frontends/php/include/locales.inc.php,修改文件中的 'zh_CN' => ['name' => _('Chinese (zh_CN)'), 'display' => false]falsetrue 即可。

不过中文翻译得并不贴切,而且还会有乱码(需要修改字体解决)的可能,不建议修改此项。

打赏作者




1. 方法

方法 版本 说明
GET 1.0、1.1 获取资源
POST 1.0、1.1 传输实体主体
PUT 1.0、1.1 传输文件
DELETE 1.0、1.1 删除文件
HEAD 1.1、1.1 获取报文首部
OPTIONS 1.1 用来查询服务器支持的方法
TRACE 1.1 追踪路径
CONNECT 1.1 要求用隧道协议链接代理
LINK 1.0 建立和资源直接的联系
UNLINE 1.0 断开连接关系

其中 HEADGET 方法类似,但是响应不包含实体部分,用于确定 URL 的有效性和过期时间;

TRACE 让 Web 服务器端将之前的请求环回路径返回给客户端的方法。发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器端就减 1,当数值正好减到 0 时,停止传输,由最后接收到请求的服务器返回 200 OK 的响应。

CONNECT 要求在与代理服务器通信时建立隧道,实现用隧道协议实现 TCP 通信。主要使用 SSL 和 TLS 把通信内容加密后经网络隧道传输。

2. TCP 连接

TCP 建立连接需要三次握手,断开连接时需要四次挥手。

3. 传输

数据的传输过程中,从应用层到传输层,网络层,再到链路层,发送端每经过一层,就会增加相应的首部;接收端则每往上传播一层,则会剔除相应的首部,直到应用层,获取到的是原始的 HTTP 数据。

4. 状态码

  类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success (成功状态码) 请求正常,处理完毕
3XX Redirection (重定向状态码) 要求进行附加操作以完成请求
4XX Client Error (客户端错误状态码) 服务器无法处理请求
5XX Server Error (服务器错误状态码) 服务器处理请求出错

2XX:正确响应

  • 200:正确处理;
  • 204:No content,服务器已正确处理,但是响应实体中没有主体;
  • 206:Partial content,对于请求头中包含 content-range 字段的,响应一部分数据;

3XX:重定向

  • 301:Moved permanently,永久重定向,响应头中包含的 location 字段为重定向后的结果;
  • 302:Found,临时重定向,请求的资源已被分配到新的URI,希望用户本次使用新URI(临时的意思是指以后有可能再变回来)。
  • 303:See other, 请求的资源存在另一个URI,请以 GET 方式去获取。
  • 304:Not modified,客户端发送附带条件(if-modified-since, if-range 等条件)的请求时,服务端资源已经找到,但是不符合条件。(304 响应中没有响应实体,和重定向没有关系)

4XX:客户端错误

  • 400:Bad request,请求报文中有语法错误。
  • 401:Unauthorized,请求需要 HTTP 认证(BASIC / DIGEST 认证,请求头中应包含 www-authenticate 字段)。
  • 403:Forbidden,请求的资源被服务器拒绝了;
  • 404:Not found,服务器上没有找到请求的资源。

5XX:服务器错误

  • 500:Internal server error,服务器在执行请求时发生了错误。
  • 503:Service unavailable,服务器处于超负载状态或者正在进行停机维护,现在无法处理请求。

注:状态码和情况不一致,如服务器发生错误,但是仍然返回 200 的状态码,这种情况也很常见。

5. 安全

HTTPS

HTTPS 相对于 HTTP 就是在应用层和传输层之间添加了 SSL / TLS 。

数字签名

  1. 生成 Keypair,即密钥对,包括公钥和私钥;
  2. 对需要进行数字签名的内容进行 HASH 后得到该内容的摘要 Digest;
  3. 用私钥对 Digest 加密,得到 Signature,即数字签名;

证书

  1. 生成密钥对,服务器把自己的公钥登录至 CA 机构;
  2. CA 机构用自己的私钥向服务器的公钥签署数字签名,并颁发公钥证书;
  3. 客户端拿到服务器的公钥证书后,使用 CA 机构的公钥,向 CA 机构验证公钥证书的数字签名,以确认服务器公钥的真实性(CA 机构的公钥已事先植入到浏览器中);
  4. 客户端验证证书通过后,使用服务器的公钥对数据加密后,发送给服务器;
  5. 服务器接收到客户端加密的内容后,用私钥解密,获取真实的数据内容;

打赏作者