Zabbix

Zabbix是一款功能强大的开源监控解决方案,为企业和组织提供了可靠、灵活且高度可定制的监控能力。

Zabbix提供了一套全面的监控工具和功能,可用于实时监测网络设备、服务器、虚拟机、应用程序和其他IT基础设施。它通过收集指标和数据,并将其可视化,帮助管理员实时掌握系统的健康状态和性能表现。无论您是运维团队还是系统管理员,Zabbix都能帮助您及时发现和解决潜在的问题,从而提高系统的可用性和性能。

Zabbix的特点之一是其灵活性和可扩展性。它支持多种监控方式,包括主动和被动监控、代理和无代理监控,甚至还可以通过自定义插件和脚本来扩展监控能力。此外,Zabbix提供了广泛的告警机制,可以通过电子邮件、短信、即时消息等方式及时通知管理员,确保问题能够迅速得到响应。

Zabbix还具有强大的报告和数据分析功能,可以生成各种类型的图表和报表,帮助管理员了解系统的趋势和性能变化。这使得管理员能够更好地规划资源、预测需求并进行容量规划。

服务器端配置

  • 操作系统:centos 7
  • 基础环境:LAMP
    本文使用的环境是:LAMP,必须事先配置好LAMP或者LNMP环境,并且正常使用才可以继续,LNMP环境大致上一样,具体可以参考本文最后的文章连接

安装软件源

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,Web前端,agent

yum install zabbix-server-mysql zabbix-agent

安装 Zabbix 前端 启用红帽软件集合

yum install centos-release-scl

编辑:/etc/yum.repos.d/zabbix.repo修改一下内容:

[zabbix-frontend]
...
enabled=1
...

安装前端包:yum install zabbix-web-mysql-scl zabbix-apache-conf-scl

创建数据库

在服务器主机上如下配置:

mysql -uroot -p
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by '你的数据库密码';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;

导入初始架构和数据,系统将提示您输入新创建的密码。
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

导入数据库架构后禁用 log_bin_trust_function_creators 选项。

mysql -uroot -p
password
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;

为Zabbix server配置数据库

编辑配置文件:/etc/zabbix/zabbix_server.conf,修改以下内容

DBPassword=你的数据库密码

为Zabbix前端配置PHP

编辑配置文件:/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf删除注释并修改:php_value[date.timezone] = Asia/Shanghai

解决乱码问题

yum -y install wqy-microhei-fonts
cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf

启动Zabbix server和agent进程

systemctl enable --now zabbix-server zabbix-agent httpd rh-php72-php-fpm

Agent(客户端配置)

安装

Windows端

直接在官网下载MSI安装包即可,安装过程中会要求填入服务器IP等信息,如果修改配置,参照Linux客户端修改即可,配置文件默认位置为:C:\Program Files\Zabbix Agent\zabbix_agentd.conf

Linux端

安装 Zabbix 存储库

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 agent2

yum install zabbix-agent2

修改配置文件

编辑:/etc/zabbix/zabbix_agent2.conf,找到并修改以下内容:

Server=zabbix服务器IP
ServerActive=zabbix服务器IP
Hostname=zabbix agent的英文主机名

OpenWRT路由端

安装:

opkg update 
opkg install zabbix-agentd

配置方法参照Linux端,配置文件路径如下:
- /etc/zabbix_agentd.conf.d
- /etc/zabbix_agentd.conf
启动、停止、重启命令:
- /etc/init.d/zabbix_agentd enable
- /etc/init.d/zabbix_agentd stop
- /etc/init.d/zabbix_agentd restart

配置agent启动

systemctl enable --now zabbix-agent

服务端连通测试

启动agent后,在服务端主机如下测试

yum install zabbix-get -y
zabbix_get -s 'agent主机IP' -p 10050 -k "system.hostname"
zabbix_get -s 'agent主机IP' -p 10050 -k "agent.ping"

shell 反馈正常的信息如下

[root@VM-12-7-centos ~]# zabbix_get -s 'agent主机IP' -p 10050 -k "system.hostname"
你的agent主机名 
[root@VM-12-7-centos ~]# zabbix_get -s 'agent主机IP' -p 10050 -k "agent.ping"
1 

添加被监控的Agent主机

进入zabbix网页

LAMLP环境默认地址为:服务器IP/zabbix,用户名:Admin密码:zabbix

添加agent主机

注意填入正确的agent地址,步骤如图:

成功的话如下图:

如果连接不成功,请尝试重启agent,并检查:防火墙、配置文件、服务器设置的主机模板

配置加密通讯

使用预共享密钥(PSK)

  1. 生成psk:openssl rand -hex 32,得出PSK码
  2. 配置agent端:
    • nano /etc/zabbix/zabbix_agentd.d/zabbix_agentd.psk,把刚才生成的PSK码填入。
    • 编辑/etc/zabbix/zabbix_agentd.conf编辑如下内容:
      TLSConnect=psk
      TLSAccept=psk
      TLSPSKFile=/etc/zabbix/zabbix_agentd.d/zabbix_agentd.psk
      TLSPSKIdentity=PSK 001 #自定义PSK名称,必须和服务器端一直
      
    • 重启agent:systemctl restart zabbix-agent
  3. 服务器前端配置

过一小段时候后

基于API的二次开发

详细的API参考文章请看本文最尾部

以下使用arduino作为基本示例

  1. 获取你的服务器APItoken,在Linux运行:
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0","method": "user.login","params": {"user": "你的用户名","password": "你的密码"},"id": 1,"auth": null}' http://你的zabbix服务器路径/zabbix/api_jsonrpc.php
  1. 在获取到token后记下,用于以下的基本示例程序:
    获取并5秒钟打印一次CPU占用率:
#include  <ESP8266WiFi.h>
#include  <WiFiClient.h>

const  char*  ssid  =  "WiFi_SSID";
const  char*  password  =  "WiFi密码";

const  char*  server  =  "服务器IP或者域名";
const  int  port  =  80;
const  char*  apiPath  =  "/zabbix/api_jsonrpc.php";
const  char*  apiToken  =  "你的APITOKEN";
const  char*  hostname  =  "主机名";

void  printCPUUsage();

// 定义 API 请求字符串变量
String  apiRequest  =  String() +
  "{"
    "\"jsonrpc\": \"2.0\","
    "\"method\": \"item.get\","
    "\"params\": {"
      "\"output\": [\"lastvalue\"],"
      "\"host\": \""  +  String(hostname) +  "\","
      "\"search\": {"
        "\"key_\": \"system.cpu.load[all,avg1]\""
      "},"
      "\"sortfield\": \"name\""
    "},"
    "\"auth\": \""  +  String(apiToken) +  "\","
    "\"id\": 1"
  "}";

void  setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() !=  WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi!");

  printCPUUsage();
}

void  loop() {
  // Do other tasks if needed
  printCPUUsage();
  delay(5000);
}

void  printCPUUsage() {
  WiFiClient  client;
  if (client.connect(server, port)) {
    String  request  =  String() +
      "POST "  +  apiPath  +  " HTTP/1.1\r\n"  +
      "Host: "  +  server  +  "\r\n"  +
      "Content-Type: application/json\r\n"  +
      "Content-Length: "  +  String(apiRequest.length()) +  "\r\n\r\n"  +
      apiRequest;

    client.print(request);

    unsigned  long  timeout  =  millis();
    while (client.available() ==  0) {
      if (millis() -  timeout  >  5000) {
        Serial.println("Error: No response from server!");
        client.stop();
        return;
      }
    }

    while (client.available()) {
      String  line  =  client.readStringUntil('\r');
      Serial.print(line);
    }

    client.stop();
  }
  else {
    Serial.println("Error: Failed to connect to Zabbix server!");
  }
}

获取到的打印效果如图:

参考文章


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。