通过源码安装Zabbix进行监控 编译安装篇

我发现现在服务器好多啊,之前成功申请到了Oracle的服务器(Oracle真豪气,4核24G的服务器想给就给),所以那么多服务器我觉得有必要监控起来,nagios在公司用过了,所以这次我就是用Zabbix来把我那么多服务器监控起来,这一篇,描述如何完整从源码安装zabbix,下一篇描述如何监控其他服务器并在通信中进行加密。

唉,一年一度的520,帅哥和美女都是成群结队的,单身狗只能独自写写文档加深记忆,习惯了。。。

(English version translate by GPT-3.5)

安装环境

Zabbix server我会安装在自己的阿里云上,自从上个月买了腾讯云服务器后,阿里云就沦落为我家内网穿透专用机了,这篇文章将记录我编译zabbix,到安装zabbix到Oracle机器并完成监控到全过程,本文先做 - 安装完成部分。

1
2
3
4
5
6
服务器:Aliyun(China) 1 core 1G 2M bandwidth
系统:Ubuntu 20.04
Kernel: 5.4.0-110-generic
数据库:Aliyun RDS (自己准备一个MySQL数据库,我用的是MySQL 8.0)
Docker:apt安装最新版本
下面文本中,数据库名称 rt_zabbix,myzabbix,zabbix视为同一个数据库,因为这篇文章我不是一口气写完的,为了最大程度安全,因此所有表单信息,数据库信息均经过修改,公网环境我也不会使用root/root这么简单的密码。

下载源码

第一步当然是下载源码,不使用最新版我难受 zabbix-6.0.4.tar.gz - zabbix.com,在服务器上先下过来

1
wget -c https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.4.tar.gz

控制台内容

1
2
3
4
5
--2022-05-19 19:39:06--  https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.4.tar.gz
......
zabbix-6.0.4.tar.gz 100%[===================>] 31.86M 11.6MB/s in 2.8s

2022-05-19 19:39:10 (11.6 MB/s) - ‘zabbix-6.0.4.tar.gz’ saved [33412454/33412454

然后解压一下

1
2
tar -zxvf zabbix-6.0.4.tar.gz 
cd zabbix-6.0.4

编译源码 Configure

按照 官方文档 - 17.加密 - zabbix.com 的指引,要使用OpenSSL配置服务器和agent代理的源,可以使用以下内容,我需要在编译时加上如下的参数

1
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

那我就运行它吧,我喜欢在后面加上 –prefix,这样安装的内容就是在一个目录下,下次看到不爽删起来也快得多。

1
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

等待一会后,提示

1
2
3
4
5
6
7
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
...
checking for mariadb_config... no
configure: error: MySQL library not found

好像是mysql的库没有,那么就装一个

1
apt install -y libmysqlclient-dev

再运行上面的configure,又提示了

1
2
3
4
5
6
......
checking for multirow insert statements... yes
checking for pkg-config... no
checking for pkg-config... no
configure: error: LIBXML2 library not found
configure: error: LIBXML2 library not found

那就….

1
apt install -y libxml2-dev

再运行….还是不存在?我查了下,看到了这一条 Compiling Zabbix 5.2 with libxml2 support,里面第一个回答是要安装一个pkg-config,正好提示libxml2上面的是checking for pkg-config... no,那就装一个

1
apt install -y pkg-config

果然错误变了,变成了

1
2
3
4
5
6
......
checking pkg-config is at least version 0.9.0... yes
checking for xmlReadMemory in -lxml2... yes
checking for net-snmp-config... no
configure: error: Invalid Net-SNMP directory - unable to find net-snmp-config
root@iZbp12wn36q08um7s5aap5Z:~/download/zabbix-6.0.4# apt search Net-SNMP

再来。

1
apt install -y libsnmp-dev

提示…

1
2
3
.....
checking for libevent support... no
configure: error: Unable to use libevent (libevent check failed)

安装…

1
apt install -y libevent-dev

提示…

1
2
3
4
.....
checking for gawk... (cached) mawk
checking for curl-config... no
configure: error: Curl library not found

安装…

1
apt install -y libcurl4-openssl-dev

看到如下信息时,即表示预编译环境配置完成

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Configuration:

Detected OS: linux-gnu
Install path: /usr/local/zabbix
Compilation arch: linux

Compiler: cc
Compiler flags: -g -O2

Library-specific flags:
database: -I/usr/include/mysql
libXML2: -I/usr/include/libxml2
Net-SNMP: -I/usr/local/include -I/usr/lib/x86_64-linux-gnu/perl/5.30/CORE -I. -I/usr/include
TLS: -I/usr/include

Enable server: yes
Server details:
With database: MySQL
WEB Monitoring: cURL
SSL certificates: /usr/local/zabbix/share/zabbix/ssl/certs
SSL keys: /usr/local/zabbix/share/zabbix/ssl/keys
SNMP: yes
IPMI: no
SSH: no
TLS: OpenSSL
ODBC: no
Linker flags: -L/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -L/usr/lib -rdynamic
Libraries: -lmysqlclient -lpthread -ldl -lz -lssl -lcrypto -lresolv -lm -lrt -lnetsnmp -lz -lpthread -levent -lssl -lcrypto -lcurl -lm -ldl -lresolv -lxml2 -lpcre
Configuration file: /usr/local/zabbix/etc/zabbix_server.conf
External scripts: /usr/local/zabbix/share/zabbix/externalscripts
Alert scripts: /usr/local/zabbix/share/zabbix/alertscripts
Modules: /usr/local/zabbix/lib/modules

Enable proxy: no

Enable agent: yes
Agent details:
TLS: OpenSSL
Modbus: no
Linker flags: -L/usr/lib -rdynamic
Libraries: -lz -lpthread -lssl -lcrypto -lcurl -lm -ldl -lresolv -lxml2 -lpcre
Configuration file: /usr/local/zabbix/etc/zabbix_agentd.conf
Modules: /usr/local/zabbix/lib/modules

Enable agent 2: no

Enable web service: no

Enable Java gateway: no

LDAP support: no
IPv6 support: yes

***********************************************************
* Now run 'make install' *
* *
* Thank you for using Zabbix! *
* <http://www.zabbix.com> *
***********************************************************

执行编译并安装 make

编译时间,大约 2分34秒

1
make -j1

-jN这个N表示使用多少核编译,如果单纯-j表示使用所有核心,如果内存比较小就可能导致OOM中途失败。这一步会比较慢,泡杯咖啡,慢慢来。

导入数据库

根据官方文档 - 1 创建数据库 - zabbix.com的指引,zabbix mysql必须运行init脚本

建立数据库

可以先看看上面的官方文档 - 1 创建数据库 - zabbix.com,然后下面进行数据库的建立和导入

阿里云RDS走这一步

我zabbix会使用aliyun RDS mysql数据库,所以我的走这一步,注意支持字符集选择utf8mb4,或utf8
新建utf8mb4的数据库
然后左侧对这个新建对数据库进行授权,假设这里数据库使用的名字是 **rt_zabbix**,虽然后面改成了myzabbix
账号授权
接着,使用工具连接过去(我使用navicat连接rds),可以看到zabbix已经在这个账号上了。这里要进行修改,因为rds创建的数据库默认会使用utf8_general_ci的排序规则,这里必须改成utf8_bin,原因是官方文档有这么一句话

1
Zabbix Server/Proxy 完美适配 MySQL 数据库的重要前提是 MySQL 数据库的字符集必须使用 utf8(又名 utf8mb3)或 utf8mb4(分别使用 utf8_bin 和 utf8mb4_bin 排序规则)。建议全新安装时使用 utf8mb4 。

修改数据库排序

自建数据库走这一步

这一步我就不做尝试了

1
2
3
4
mysql -uroot -p<password>
create database zabbix character set utf8mb4 collate utf8mb4_bin;
create user 'zabbix'@'localhost' identified by '<password>';
grant all privileges on zabbix.* to 'zabbix'@'localhost';

导入数据

如果你是从源码安装 Zabbix,请继续按照以下步骤将数据导入数据库。这些数据库文件在 zabbix编译目录下(而不是最后安装的/usr/local/zabbix下)的/zabbix-6.0.4/database/mysql
我们先把【schema.sql,images.sql,data.sql】(注意导入sql的顺序必须按照上面的文件顺序来)复制到本机来,用navicat导入(文件大小共32MB,建议压缩成zip传过来,如果本机有mysql server,可以直接跟着文档导入)。

导入后,一共是173个表,导入过程中我没有遇到任何错误。
zabbix表

配置zabbix

1
vi /usr/local/zabbix/etc/zabbix_server.conf

修改第一个位置(如果数据库在本机,跳过)

1
DBHost=你的数据库地址

修改第二个位置

1
DBName=创建的zabbix数据库,我这里假设是 myzabbix,上面由于后来改过数据库名了,从rt_zabbix改成了myzabbix

修改第三个位置

1
DBUser=数据库用户名,假设这里是 root

修改第四个位置

1
DBPassword=你的密码

其他可修改的地方

1
2
3
ListenPort=10051 #这里修改其zabbix与agent通讯端口,默认是10051
DBPort=3306 # 默认注释

启动服务端和Agent

1
2
/usr/local/zabbix/sbin/zabbix_server
/usr/local/zabbix/sbin/zabbix_agentd

日志在 /tmp下,server打印出这些内容后,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
14212:20220519:203804.857 server #36 started [trapper #5]
14214:20220519:203804.861 server #38 started [alert syncer #1]
14215:20220519:203804.864 server #39 started [history poller #1]
14216:20220519:203804.867 server #40 started [history poller #2]
14217:20220519:203804.868 server #41 started [history poller #3]
14218:20220519:203804.870 server #42 started [history poller #4]
14219:20220519:203804.871 server #43 started [history poller #5]
14220:20220519:203804.872 server #44 started [availability manager #1]
14221:20220519:203804.876 server #45 started [trigger housekeeper #1]
14222:20220519:203804.877 server #46 started [odbc poller #1]
14201:20220519:203805.834 Zabbix agent item "vm.memory.size[total]" on host "Zabbix server" failed: first network error, wait for 15 seconds
.......
14193:20220519:203858.925 item "Zabbix server:zabbix[process,report writer,avg,busy]" became not supported: No "report writer" processes started.
14193:20220519:203859.934 item "Zabbix server:zabbix[process,report manager,avg,busy]" became not supported: No "report manager" processes started.
14207:20220519:203950.941 enabling Zabbix agent checks on host "Zabbix server": interface became available

Agent的日志

1
2
3
4
5
6
7
8
9
10
11
12
14229:20220519:203936.410 Starting Zabbix Agent [Zabbix server]. Zabbix 6.0.4 (revision 3d787ff402e).
14229:20220519:203936.410 **** Enabled features ****
14229:20220519:203936.410 IPv6 support: YES
14229:20220519:203936.410 TLS support: YES
14229:20220519:203936.410 **************************
14229:20220519:203936.410 using configuration file: /usr/local/zabbix/etc/zabbix_agentd.conf
14229:20220519:203936.411 agent #0 started [main process]
14233:20220519:203936.413 agent #4 started [listener #3]
14232:20220519:203936.413 agent #3 started [listener #2]
14234:20220519:203936.414 agent #5 started [active checks #1]
14231:20220519:203936.415 agent #2 started [listener #1]
14230:20220519:203936.418 agent #1 started [collector]

似乎都已经起来了。

准备 docker php环境

这里由于zabbix Web需要php环境,如果从0开始装太折腾了,所以就直接使用docker来完成,直接pull镜像吧

自Zabbix 5.0 版本开始,Zabbix 前端需 PHP 7.2 及以上版本。,那就安装7.4.29版本吧,别用8,后面会说的,然后结合php-fpm与nginx进行交互

1
docker pull php:7.4.29-fpm

然后注意下面的需求,按照下面的需求重新打包php:7.4.29-fpm

PHP 版本 7.2.5
PHP memory_limit 选项 128MB 在 php.ini 中: memory_limit = 128M
PHP post_max_size 选项 16MB 在 php.ini 中: post_max_size = 16M
PHP upload_max_filesize 选项 2MB 在 php.ini 中: upload_max_filesize = 2M
PHP max_execution_time 选项 300 秒(允许值 0 和 -1) 在 php.ini 中: max_execution_time = 300
PHP max_input_time 选项 300 秒(允许值 0 和 -1) 在 php.ini 中: max_input_time = 300
PHP session.auto_start 选项 必须禁用 在 php.ini: session.auto_start = 0
数据库支持 其中之一:MySQL、Oracle、PostgreSQL。 必须安装以下模块之一: mysql、oci8、pgsql
bcmath php-bcmath
mbstring php-mbstring
PHP mbstring.func_overload 选项 必须禁用 在 php.ini: mbstring.func_overload = 0
sockets php-net-socket.需要用户脚本支持。
gd 2.0.28 php-gd. PHP GD 扩展必须支持 PNG 图像 (–with-png-dir)、JPEG (–with-jpeg-dir) 图像和 FreeType 2 (–with-freetype-dir)。
libxml 2.6.15 php-xml
xmlwriter php-xmlwriter
xmlreader php-xmlreader
ctype php-ctype
session php-session
gettext php-gettext 自 Zabbix 2.2.1 起,PHP gettext 扩展不是安装 Zabbix 的强制要求。如果未安装 gettext,前端将照常工作,但是翻译将不可用。

我已经准备好了按上面要求修改过的基于php:7.4.29-fpmphp-template.ini,我们先建立一个目录,假设我建立在 /root/download/docker-php下

1
2
mkdir -p /home/docker-php
cd /home/docker-php

首先,先把这个php-template给下载下来,我已经基于7.4.29-fpm的php.ini-production按上面参数改了php.ini出来,或者,你自己可以自行提取/usr/local/etc/php/php.ini-production

1
wget https://file.ruterfu.com/file/2022/05/19/20220519-php7.4.29-fpm-template.ini -O php-template.ini

然后在把下面的内容写入 sources.list 文件(如果在国外,可以跳过,别忘了Dockerfile删除 COPY sources.list /etc/apt/sources.list 这句话,在国内不替换,卡死你。。)

1
2
3
4
5
6
7
8
deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib

然后新建 Dockerfile,并写入以下内容

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
27
28
# 基于php:7.4.29-fpm构建docker,别用php8,zabbix不支持。
FROM php:7.4.29-fpm
# 复制当前目录下的sources.list到docker中的/etc/apt/sources.list
# 如果上一步sources.list文件不写即使用原来的sources.list,下面用#注释掉
COPY sources.list /etc/apt/sources.list
# 复制当前目录的php-template.ini到docker中的/usr/local/etc/php/php.ini
COPY php-template.ini /usr/local/etc/php/php.ini
# 然后执行下面的命令,根据https://hub.docker.com/_/php重新编辑的,加上了zabbix最低要求支持
# 最后4行表示支持中文,英语,日语的语言选择,如果需要在配置中选择其他语言,请自行加入,否则构建好后只能选择中文英文和日语这3个
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libjpeg-dev \
gettext \
libldap2-dev \
locales \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install gettext \
&& docker-php-ext-install ldap \
&& docker-php-ext-install sockets \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install mysqli \
&& echo 'zh_CN.UTF-8 UTF-8' > /etc/locale.gen \
&& echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen \
&& echo 'ja_JP.UTF-8 UTF-8' >> /etc/locale.gen \
&& locale-gen

千万别用php8,zabbix还不支持php8,不然打开后就是像我这样子

php8 一堆红色

最后,执行 Docker build .

1
docker build .

这个可能需要执行一段时间,执行完毕后,控制台会输出

1
2
3
4
5
6
7
8
9
10
11
12
.......
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp.la modules/* libs/*
Generating locales (this might take a while)...
zh_CN.UTF-8... done
en_US.UTF-8... done
ja_JP.UTF-8... done
Generation complete.
Removing intermediate container 0e992fd8595d
---> 0b79b4c11d3c
Successfully built 0b79b4c11d3c

然后执行下面运行命令,下面的0b79b4c11d3c 就是上面 Successfully built 0b79b4c11d3c的值

下面的 -v /usr/local/zabbix/php-webui:/var/www/zabbix 冒号前面的是宿主机目录,冒号后面的是docker中的目录

1
docker run -itd -p 9000:9000 -v /usr/local/zabbix/php-webui:/var/www/zabbix --name php-fpm 0b79b4c11d3c

输出

1
f7dbe3921462ae42891fef72bb48311f5a7e661486f7e6be485739fc89cf9bb4

然后将zabbix-ui文件复制到 /usr/local/zabbix/php-webui中,下面的/root/download/zabbix-6.0.4是上面编译zabbix的目录

1
cp -rf /root/download/zabbix-6.0.4/ui/* /usr/local/zabbix/php-webui/

这里记住,在Docker里,php-webui对应的是/var/www/zabbix

配置nginx,按照下面改就行了

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 8999;
server_name 填上自己的域名;

location ~ (\/zabbix).*\.php {
# 这里的/var/www指的是docker里面的目录
root /var/www;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location /zabbix/assets {
alias /usr/local/zabbix/php-webui/assets;
expires 30d;
}
location /zabbix/js {
alias /usr/local/zabbix/php-webui/js;
expires 30d;
}
location /zabbix/favicon.ico {
alias /usr/local/zabbix/php-webui/favicon.ico;
expires 30d;
}

}

配置Web环境

欢迎

打开自己网页 假设我这里是 http://127.0.0.1:8999,打开后即可看到Zabbix首页,选择语言包为中文。

打开首页

必要条件检测

刚才构建docker时准备的充分,可以看到这里已经全部支持了

支持所有的环境

配置DB连接

这里跟着上面zabbix的配置方式,配置的完全一致就行了,如果不能连接,试着把Database TLS encryption给关掉,如果连不上数据库是下不去的。

配置DB连接

设置 Settings

这里设置zabbix主机名字,然后时区选择东八区上海,这不用说了把

设置 Settings

安装前汇总

看下哪里是有问题的,不对的返回校对下

安装前汇总

安装

我这里悲剧的出现了无法写入文件,估计是权限不够,那么手动下载这个文件就行。

1
cp /tmp/zabbix.conf.php /usr/local/zabbix/php-webui/conf/zabbix.conf.php

之所以传到 /usr/local/zabbix/php-webui 下面而不是按照网站要求传到/var/www/zabbix/conf/zabbix.conf.php是因为docker run时设置了将 /usr/local/zabbix/php-webui 映射到了 /var/www/zabbix,所以说修改前面的目录等同于修改docker里面的这个目录

最后一步

上传完毕并覆盖后,点击完成,结束

所有配置结束

登录zabbix Web

默认的用户时Admin,密码是zabbix

进去后看到上面有一行报错红字

1
2
3
4
Connection to Zabbix server "localhost" failed. Possible reasons:
1. Incorrect server IP/DNS in the "zabbix.conf.php";
2. Incorrect DNS server configuration.
Cannot assign requested address

很明显是无法解析 localhost 到准确的IP(一般情况下,系统能识别 localhost成127.0.0.1 是因为在 /etc/hosts进行了配置,而这个配置是系统自己做的)

这里很简单,修改下刚刚上传的 zabbix.conf.php,找到如下内容

1
2
3
4
5
6
7
8
9
// Use IEEE754 compatible value range for 64-bit Numeric (float) history values.
// This option is enabled by default for new Zabbix installations.
// For upgraded installations, please read database upgrade notes before enabling this option.
$DB['DOUBLE_IEEE754'] = true;

// Uncomment and set to desired values to override Zabbix hostname/IP and port.
# 取消注释这2行,然后分别填上 172.17.0.1 和 10051
// $ZBX_SERVER = '';
// $ZBX_SERVER_PORT = '';

取消上面 $ZBX_SERVER$ZBX_SERVER_PORT 前面的注释,然后填上值 172.17.0.1 以及 10051,保存即可,无需重启docker。这里为什么要填写 172.17.0.1 是因为docker在默认情况下,会生成一个 172.17.0.1/24 的ip负责docker之间的通信,其中宿主机IP固定是 172.17.0.1,所以,这里填写172.17.0.1等同于访问宿主机10051端口,而刚刚编译后,运行 zabbix_server,它就是监听者10051端口。

安装过程结束

至此,安装过程告终,密码别忘了改,后面zabbix如何自启下一篇会描述,然后zabbix_agent如何和主机建立安全的连接,下一篇会详细描述。至于为什么一篇说不完本身我自己也在挖坑,例如说构建docker时如何一口气装上所有的软件,然后中文tm就弄了我一会,拿php-8.4来构建好了结果一堆红。

关于Oracle云,近期在电报群中听到Oracle Cloud竟然送免费的服务器,我也成功申请了一台,如果你有兴趣的话,Oracle 云免费套餐 - oracle.com 我就贴上地址,自行注册,自行解决问题,我不会为这个提供任何建议以及不会给予任何指导。