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)
- 生成psk:
openssl rand -hex 32
,得出PSK码 - 配置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
- 服务器前端配置
过一小段时候后
基于API的二次开发
详细的API参考文章请看本文最尾部
以下使用arduino作为基本示例
- 获取你的服务器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
- 在获取到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!");
}
}