Zabbix 是一个企业级的分布式开源监控解决方案,它能够监控各种服务器的健康性、网络的稳定性以及各种应用系统的可靠性。当监控出现异常时,Zabbix 通过灵活的告警策略,可以为任何事件配置基于邮件、短信、微信等告警机制。而这所有的一切,都可以通过 Zabbix 提供的 Web 界面进行配置和操作,基于 Web 的前端页面还提供了出色的报告和数据可视化功能。这些功能和特性使运维人员可以非常轻松的搭建一套功能强大的运维监控管理平台。

概念

应用组件

Server

Zabbix Server 是 Zabbix 的核心组件,是所有配置信息、统计信息和操作数据的核心存储器。它主要负责接收客户端发送的报告和信息,同时,所有配置、统计数据及配置操作数据均由其组织进行。

Database Storage

主要用于存储数据,所有配置信息和 Zabbix 收集到的数据都被存储在数据库中;常用的存储设备有 MySQL、Oracle、SQLite 等。

Web 界面

这是 Zabbix 提供的 GUI 接口,通常(但不一定)与 Zabbix Server 运行在同一台物理机器上。

Proxy 代理服务器

这是一个可选组件,常用于分布监控环境中,代理 Server 可以替 Zabbix Server 收集性能和可用性数据,汇总后统一发往 Zabbix Server 端。

Agent 监控代理

Zabbix Agent 部署在被监控主机上,能够主动监控本地资源和应用程序,并负责收集数据发往 Zabbix Server 端或 Zabbix Proxy 端。

服务进程

zabbix_agentd

zabbix_agentd 是 Zabbix Agent 监控代理端守护进程,此进程收集客户端数据,例如 cpu 负载、内存、硬盘、网络使用情况等。

zabbix_get

zabbix 提供的一个工具,通常在 Zabbix server 或者 Zabbix proxy 端执行用来获取远程客户端信息,这其实是 Zabbix server 去 Zabbix Agent 端拉取数据的过程,此工具主要用来进行用户排错。例如在 Zabbix server 端获取不到客户端的监控数据时,可以使用 zabbix_get 命令测试获取客户端数据来做故障排查。

zabbix_sender

zabbix 提供的一个工具,用于发送数据给 Zabbix server 或者 Zabbix proxy,这其实是 Zabbix Agent 端主动推送监控数据到 Zabbix Server 端的过程,通常用于耗时比较长的检查或者有大量主机(千台以上)需要监控的场景。此时通过主动推送数据到 Zabbix server,可以在很大程度上减轻 Zabbix server 的压力和负载。

zabbix_proxy

Zabbix Proxy 的代理守护进程。功能类似 Zabbix server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交或者被提交到 Zabbix server 上。

zabbix_java_gateway

Zabbix2.0 之后引入的一个功能。顾名思义:Java 网关,主要用来监控 JAVA 应用环境,类似 zabbix_agentd 进程。需要特别注意的是,它只能主动去推送数据,而不能等待 zabbix server 或者 zabbix proxy 来拉取数据。它的数据最终会给到 zabbix server 或者 zabbix proxy 上。

zabbix_server

Zabbix server 是整个 Zabbix 系统的核心进程。其它进程 zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway 的数据最终都是提交到 Zabbix server 来统一进行处理。

监控术语

主机(host)

表示要监控的一台服务器或者网络设备,可以通过 IP 或主机名指定。

主机组(host group)

主机的逻辑组;它包含主机和模板,但同一个主机组内的主机和模板没有任何直接的关联;主机组通常在给用户或用户组指派监控权限时使用

监控项(item)

表示一个监控的具体对象,例如监控服务器的 CPU 负载、磁盘空间等,item 是 zabbix 进行数据收集的核心,相对某个监控对象,每个 item 都由”key”来标识

触发器(trigger)

其实就是一个监控阈值表达式,用于评估某监控对象接收到的数据是否在合理范围内;如果接收的数据大于阈值时,触发器状态将从”OK”转变为”Problem”,当接收到的数据低于阈值时,又转变为”OK”状态。

应用集(Applications)

一组监控项组成的逻辑集合。

动作(action)

指对于监控中出现的问题事先定义的处理方法,例如发送通知,何时执行操作、执行的频率等等;

报警媒介类型(media)

表示发送通知的手段,告警通知的途径,如 Email、Jabber 或者 SMS 等;

模板(template)

一组可以被应用到一个或多个主机上的实体集合,一个模板通常包含了应用集、监控项、触发器、图形、聚合图形、自动发现规则、Web 场景等几个项目;模板可以直接链接到某个主机。
模板是学习 zabbix 的一个难点和重点,为了实现批量、自动化监控,通常会将具有相同特征的监控项汇总到模板中,然后在主机中直接引用即可,实现快速监控部署。

监控

以下介绍如何使用物理(虚拟)机部署 Zabbix,更多方式见:[[Zabbix 容器化部署]]

LNMP 环境部署

LANMP 环境搭建

优化 PHP

php 配置文件:vim /etc/php.ini

1
2
3
4
5
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
post_max_size = 16M
date.timezone = Asia/Shanghai

修改 php-fpm 配置文件:vim /etc/php-fpm.d/www.conf:
1
2
3
4
5
6
7
user = apache
group = apache
修改为
user = nginx
group = nginx
yum install php-bcmath php-ldap
systemctl restart php-fpm

否则会报错

配置 vhost

vim /etc/nginx/vhost/zabbix.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
#listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name 192.168.10.12;
root /opt/www/zabbix;

#ssl_certificate /etc/nginx/ssl/zabbix.crt;
#ssl_certificate_key /etc/nginx/ssl/zabbix.key;

access_log /dev/null;
error_log /var/log/nginx/error_zabbix.log;

index index.php index.html index.htm;

location / {
proxy_method GET;
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}

搭建 Zabbix

安装 zabbix-web

1
2
3
4
5
6
wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.14.tar.gz
tar xf zabbix-5.0.14.tar.gz
mkdir /opt/www/zabbix
cp -a zabbix-5.0.14/ui/* /opt/www/zabbix
#修改站点目录属主和属组
chown -R nginx:nginx /opt/www/zabbix

重启 nginx 和 php-fpm 服务器 500,查询
chown -R nginx:nginx /var/lib/php/session
安装依赖:yum install -y net-snmp net-snmp-devel curl curl-devel libxml2 libevent libevent-devel
创建一个普通用户用于启动 zabbix 的守护进程

1
2
groupadd zabbix
useradd -g zabbix zabbix

安装 zabbix-server

1
2
3
4
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
#安装 Zabbix Server 和 Agent
yum install zabbix-server-mysql zabbix-agent

创建数据库

1
2
3
4
5
create database zabbix character set utf8 collate utf8_bin;
create user zabbix@localhost identified by '12345678';
grant all privileges on zabbix.* to zabbix@localhost;
flush privileges;
quit;

账户创建一直报错:“ERROR 1396 (HY000): Operation CREATE USER failed for ‘zabbix’@’localhost’”

1
2
drop user zabbix@localhost;
flush privileges;

导入初始架构和数据:zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
报错:“ERROR 1813 (HY000): Tablespace ‘ db1. table1 ‘ exists.”
配置数据库
编辑配置文件:vim /etc/zabbix/zabbix_server.conf
DBPassword=12345678

完成安装



一直下一步,直至安装完成,默认账号密码:Admin/zabbix(区分大小写)。

安装 Agent

官网下载

Linux

  • YUM 安装
    https://www.zabbix.com/cn/download
    1
    2
    3
    4
    5
    rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
    yum clean all
    yum install zabbix-agent
    systemctl start zabbix-agent
    systemctl enable zabbix-agent
  • 编译安装
    wget https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.14/zabbix_agent-5.0.14-linux-ppc64le-static.tar.gz
  • 编辑配置
    vim /etc/zabbix/zabbix_agentd.conf
    1
    2
    3
    4
    5
    6
    Server=zabbix server ip
    ServerActive=zabbix server ip
    Hostname=Hostname of client system
    HostMetadataItem=system.uname

    systemctl restart zabbix-agent

    Windwos


    添加主机

    自动发现



    更新 IP 范围并启用规则;

    自动注册

    agent 自动注册(agent auto-registration),Zabbix agent 自动注册为一个主机,并且开始监控的自动执行进程;自动发现和自动注册是两种不同的添加被监控项主机的方式,在做自动注册时,先将上一步做的“动作“和“自动发现”停用并将发现的主机删除。

    手动添加

    优化

    通过 Zabbix 的 NVPS(每秒处理数值数)来衡量其性能,在 Zabbix 的 dashboard 上的 Status of Zabbix

    Server

    vim /etc/zabbix/zabbix_server.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DisableHousekeeper=1
    StartDiscoverers=5
    StartPollers=90
    StartPingers=10
    StartPollersUnreacheable=80
    StartIPMIPollers=10
    StartTrappers=20
    StartDBSyncers=8
    LogSlowQueries=1000
    systemctl restart zabbix-server

    数据库

  • 用数据服务器
  • 每个 table 一个文件,修改 my.cnf:innodb_file_per_table=1
  • 使用 Percona 代替 MySQL
  • 使用 tmpfs 存储临时文件
    1
    2
    3
    4
    5
    mkdir /tmp/mysqltmp
    vim /etc/fstab
    tmfs /tmp/mysqltmp tmpfsrw,uid=mysql,gid=mysql,size=1G,nr_inodes=10k,mode=0700 0 0
    vim my.cnf
    tmpdir=/tmp/mysqltmp
  • 设置正确的 buffer pool
    1
    2
    3
    4
    5
    设置 Innodb 可用多少内存,建议设置成物理内存的 70%~80%
    vim my.cnf
    innodb_buffer_pool_size=14G
    设置 innodb 使用 O_DIRECT,这样 buffer_pool 中的数据就不会与系统缓存中的重复
    innodb_flush_method=O_DIRECT
  • 设置合适的 log 大小
    1
    2
    3
    4
    zabbix 数据库属于写入较多的数据库,因此设置大一点可以避免 MySQL 持续将 log 文件 flush 到表中
    不过有一个副作用,就是启动和关闭数据库会变慢一点
    vim my.cnf
    innodb_log_file_size=64M
  • 打开慢查询日志
    1
    2
    vim my.cnf
    log_slow_queries=/var/log/mysql.slow.log
  • 设置 thread_cache_size
    1
    2
    3
    这个值似乎会影响 show global status 输出中 Threads_created perConnection 的 hit rate
    当设置成 4 的时候有 3228483 Connections 和 5840 Threads_created、hitrate 达到了 99.2%
    Threads_created 这个数值应该越小越好
  • 其他 MySQL 文档建议的参数调整
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    query_cache_limit=1M
    query_cache_size=128M
    tmp_table_size=256M
    max_heap_table_size=256M
    table_cache=256
    max_connections=300
    innodb_flush_log_at_trx_commit=2
    join_buffer_size=256k
    read_buffer_size=256k
    read_rnd_buffer_size=256k

    字体方块

    1
    2
    3
    cat /opt/www/zabbix/include/defines.inc.php | grep FONT
    find / | grep DejaVuSans
    找到文件位置:/opt/www/zabbix/assets/fonts/DejaVuSans.ttf
    使用中文字体即可解决,两种方法:修改配置文件和替换字体文件,推荐后者。