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_DBUser
和 ZS_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 启动成功。
默认账号的用户名、密码是:Admin
和 zabbix
, 输入用户名密码登录,即可看到主界面。
进入到 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 的指令与其交互;Server
和 ServerActive
都指向 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 系统语言选择下拉框中默认是没有简体中文的,需要改动其源码,改动方式如下:
docker exec -it zabbix-server /bin/bash
进入容器;vi /usr/local/src/zabbix/frontends/php/include/locales.inc.php
,修改文件中的'zh_CN' => ['name' => _('Chinese (zh_CN)'), 'display' => false]
的false
为true
即可。
不过中文翻译得并不贴切,而且还会有乱码(需要修改字体解决)的可能,不建议修改此项。
打赏作者
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 | 断开连接关系 |
其中 HEAD
和 GET
方法类似,但是响应不包含实体部分,用于确定 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 。
数字签名
- 生成 Keypair,即密钥对,包括公钥和私钥;
- 对需要进行数字签名的内容进行 HASH 后得到该内容的摘要 Digest;
- 用私钥对 Digest 加密,得到 Signature,即数字签名;
证书
- 生成密钥对,服务器把自己的公钥登录至 CA 机构;
- CA 机构用自己的私钥向服务器的公钥签署数字签名,并颁发公钥证书;
- 客户端拿到服务器的公钥证书后,使用 CA 机构的公钥,向 CA 机构验证公钥证书的数字签名,以确认服务器公钥的真实性(CA 机构的公钥已事先植入到浏览器中);
- 客户端验证证书通过后,使用服务器的公钥对数据加密后,发送给服务器;
- 服务器接收到客户端加密的内容后,用私钥解密,获取真实的数据内容;
打赏作者