通过源码安装Zabbix进行监控 编译安装篇
我发现现在服务器好多啊,之前成功申请到了Oracle的服务器(Oracle真豪气,4核24G的服务器想给就给),所以那么多服务器我觉得有必要监控起来,nagios在公司用过了,所以这次我就是用Zabbix来把我那么多服务器监控起来,这一篇,描述如何完整从源码安装zabbix,下一篇描述如何监控其他服务器并在通信中进行加密。
唉,一年一度的520,帅哥和美女都是成群结队的,单身狗只能独自写写文档加深记忆,习惯了。。。
(English version translate by GPT-3.5)
安装环境
Zabbix server我会安装在自己的阿里云上,自从上个月买了腾讯云服务器后,阿里云就沦落为我家内网穿透专用机了,这篇文章将记录我编译zabbix,到安装zabbix到Oracle机器并完成监控到全过程,本文先做 - 安装完成部分。
1 | 服务器:Aliyun(China) 1 core 1G 2M bandwidth |
下载源码
第一步当然是下载源码,不使用最新版我难受 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 | --2022-05-19 19:39:06-- https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.4.tar.gz |
然后解压一下
1 | tar -zxvf zabbix-6.0.4.tar.gz |
编译源码 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 | checking for a BSD-compatible install... /usr/bin/install -c |
好像是mysql的库没有,那么就装一个
1 | apt install -y libmysqlclient-dev |
再运行上面的configure,又提示了
1 | ...... |
那就….
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 | ...... |
再来。
1 | apt install -y libsnmp-dev |
提示…
1 | ..... |
安装…
1 | apt install -y libevent-dev |
提示…
1 | ..... |
安装…
1 | apt install -y libcurl4-openssl-dev |
看到如下信息时,即表示预编译环境配置完成
1 | Configuration: |
执行编译并安装 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
然后左侧对这个新建对数据库进行授权,假设这里数据库使用的名字是 **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 | mysql -uroot -p<password> |
导入数据
如果你是从源码安装 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
1 | vi /usr/local/zabbix/etc/zabbix_server.conf |
修改第一个位置(如果数据库在本机,跳过)
1 | DBHost=你的数据库地址 |
修改第二个位置
1 | DBName=创建的zabbix数据库,我这里假设是 myzabbix,上面由于后来改过数据库名了,从rt_zabbix改成了myzabbix |
修改第三个位置
1 | DBUser=数据库用户名,假设这里是 root |
修改第四个位置
1 | DBPassword=你的密码 |
其他可修改的地方
1 | ListenPort=10051 #这里修改其zabbix与agent通讯端口,默认是10051 |
启动服务端和Agent
1 | /usr/local/zabbix/sbin/zabbix_server |
日志在 /tmp下,server打印出这些内容后,
1 | 14212:20220519:203804.857 server #36 started [trapper #5] |
Agent的日志
1 | 14229:20220519:203936.410 Starting Zabbix Agent [Zabbix server]. Zabbix 6.0.4 (revision 3d787ff402e). |
似乎都已经起来了。
准备 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-fpm
的 php-template.ini,我们先建立一个目录,假设我建立在 /root/download/docker-php下
1 | mkdir -p /home/docker-php |
首先,先把这个php-template给下载下来,我已经基于7.4.29-fpm的php.ini-production按上面参数改了php.ini出来,或者,你自己可以自行提取/usr/local/etc/php/php.ini-production
1 | wget https://oss.ruterfu.com/blog/2024/05/15/old-files/20220519-php7.4.29-fpm-template.ini -O php-template.ini |
然后在把下面的内容写入 sources.list 文件(如果在国外,可以跳过,别忘了Dockerfile删除 COPY sources.list /etc/apt/sources.list
这句话,在国内不替换,卡死你。。)
1 | deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib |
然后新建 Dockerfile
,并写入以下内容
1 | # 基于php:7.4.29-fpm构建docker,别用php8,zabbix不支持。 |
千万别用php8,zabbix还不支持php8,不然打开后就是像我这样子
最后,执行 Docker build .
1 | docker build . |
这个可能需要执行一段时间,执行完毕后,控制台会输出
1 | ....... |
然后执行下面运行命令,下面的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 | server { |
配置Web环境
欢迎
打开自己网页 假设我这里是 http://127.0.0.1:8999,打开后即可看到Zabbix首页,选择语言包为中文。
必要条件检测
刚才构建docker时准备的充分,可以看到这里已经全部支持了
配置DB连接
这里跟着上面zabbix的配置方式,配置的完全一致就行了,如果不能连接,试着把Database TLS encryption
给关掉,如果连不上数据库是下不去的。
设置 Settings
这里设置zabbix主机名字,然后时区选择东八区上海,这不用说了把
安装前汇总
看下哪里是有问题的,不对的返回校对下
安装
我这里悲剧的出现了无法写入文件,估计是权限不够,那么手动下载这个文件就行。
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 | Connection to Zabbix server "localhost" failed. Possible reasons: |
很明显是无法解析 localhost 到准确的IP(一般情况下,系统能识别 localhost成127.0.0.1 是因为在 /etc/hosts进行了配置,而这个配置是系统自己做的)
这里很简单,修改下刚刚上传的 zabbix.conf.php
,找到如下内容
1 | // Use IEEE754 compatible value range for 64-bit Numeric (float) history values. |
取消上面 $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 我就贴上地址,自行注册,自行解决问题,我不会为这个提供任何建议以及不会给予任何指导。