先使用外网机器下载离线安装包,然后上传至内网服务器进行全内网安装。
离线包下载
前置准备及目标
- CentOS7 标准版镜像(DVD 版)
- 网络连接正常
- 基础工具(wget、vim)等常见工具不再赘述
- zabbix5.0.x、postgresql9.2.x、php 以及 nginx 使用 scl 提供的,zabbix 与它绑定。详情请查看官网。
- 文末 MySQL 版本目前没有测试,只是做个记录。
目标:下载的离线包需要在内网环境中最小化系统上进行安装。
在 centos-release-scl 中的 PG 10 版本虽然可以离线抽取安装包并且可以安装到内网机器上,但是启动时依然缺少库,同时使用方式也和常规安装的用法有较大区别,目录位置也不同,还会出现其它未知问题。综合考量下,PG 数据库采用默认的版本。
Nginx 和 PHP 都从 centos-release-scl 里面下载离线安装包。经实验,推荐使用该 Nginx,如果本机已安装有 Nginx,避免端口冲突可以直接启动两个 Nginx 服务。
关闭防火墙和 selinux
1 | # 替换 |
文件配置和修改
1 | # 设置 阿里源 |
修改 /etc/yum.repos.d/zabbix.repo
文件把 enabled 的值改为 1:
1 | [zabbix-frontend] |
若不修改该文件启用前端,后续下载 server web 的前端离线包时会报错误 Error: Nothing to do。
提取两个 rpm 包
最小化的 CentOS7 镜像系统 中安装 zabbix5.0,需要这两个 rpm 安装包,这两个包可以通过挂载 标准版镜像 进行提取。
1 | # 挂载到 mnt 目录下 |
把包中的文件备份出来,上传至需要的机器上进行安装:
1 | yum install -y libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm libxslt-1.1.28-5.el7.x86_64.rpm |
下载 zabbix 的离线包
为了方便,本文示例把 zabbix 的 server 端和其它各种组件全部下载到一个文件夹中,使用安装时按需下载使用。当然,你也可以自行分类后放在不同的目录中下载打包。
先修改两个文件,如果没有这两个文件,那么先安装 centos-release-scl
,然后再卸载,之后修改文件后进行离线包下载。该包在安装的情况下无法下载离线包,且 scl 的官方源已经关闭,不再开放和维护。
vim /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
1 | [centos-sclo-rh] |
vim /etc/yum.repos.d/CentOS-SCLo-scl.repo
1 | [centos-sclo-sclo] |
也可以使用阿里的源:https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
如果没有上面两个文件
1 | # 先安装 再卸载,修改配置文件 |
下载 zabbix 相关的包
1 | yum install zabbix-server-pgsql zabbix-agent centos-release-scl zabbix-web-pgsql-scl zabbix-nginx-conf-scl zabbix-proxy-pgsql zabbix-agent zabbix-agent2 zabbix-java-gateway zabbix-get zabbix-sender --downloadonly --downloaddir=zabbix-all |
这里同时下载了 agent 的两个版本,实际使用时根据自己的需要安装。
打包
1 | # 安装打包工具 |
下载 PG9 离线包
1 | yum install postgresql-server.x86_64 postgresql.x86_64 --downloadonly --downloaddir=pg |
离线安装
把上面所有的软件包上传至内网服务器中。若是 内网最小化 CentOS7 系统,先安装开头提到的两个 rpm 包。然后进行一些前置准备。
1 | yum install -y libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm libxslt-1.1.28-5.el7.x86_64.rpm |
创建本地 yum 源
1 | # 备份原有文件 |
zabbix-all.repo 文件内容
1 | [zabbix] |
pg.repo 文件内容
1 | [pg] |
zabixx server 和前端
1 | yum install -y zabbix-server-pgsql zabbix-agent zabbix-web-pgsql-scl zabbix-nginx-conf-scl |
编辑 /etc/zabbix/zabbix_server.conf
配置文件,填写 pg 数据库 zabbix 用户的密码。
1 | DBPassword=password |
编辑 /etc/zabbix/zabbix_agent.conf
文件:
1 | AllowRoot=1 |
编辑 /usr/lib/systemd/system/zabbix-agent.service
文件:
1 | # 找到下面两项信息修改 |
安装 PG 9
1 | # 安装 pg |
设置密码
由于 PG9 默认使用的 peer/ident 认证,使用的时候会出现一些认证问题,所以我们需要修改 /var/lib/pgsql/data/pg_hba.conf
文件,除了第一行之外全部改为 md5。不然无法进入 pg bash 修改 postgres 用户的密码。
建议直接使用下面的内容替换原本的内容。
1 | # TYPE DATABASE USER ADDRESS METHOD |
trust 不需要认证,可以临时使用,后续是否使用自行斟酌。
如果需要远程连接,编辑文件:vi /var/lib/pgsql/data/postgresql.conf
。
1 | listen_addresses = '*' |
1 | # 重启服务 |
Nginx
1 | listen 81; |
这里推荐使用 ip,如果使用 localhost 可能会出现问题,自行尝试能用就行。
PHP
1 | listen.acl_users = apache,nginx |
启动服务
1 | # 重启服务 |
文件位置
- 配置文件位于
/etc/zabbix
目录下。 - 前端文件在
/usr/share/zabbix
。 - 日志文件在
/var/log/zabbix/
。
查看 zabbix server 启动日志:cat /var/log/zabbix/zabbix_server.log
查看 nginx 日志:cat /var/opt/rh/rh-nginx116/log/nginx/error.log
查看 php 日志:cat /var/opt/rh/rh-php72/log/php-fpm/error.log
清除文件内容:
1 | truncate -s 0 file |
zabbix 其它组件
zabbix 组件中 agent 是必装的,(agent 两个版本二选一,2 的性能更好),这里对 proxy、agent 配置加以说明。proxy 组件需要使用单独数据库(不要与 server 使用相同的库,有冲突),proxy 一般是分布式监控,且单独部署在一台服务器。数据库参照上文进行数据库安装和配置,不再赘述。
1 | # 实际使用按需安装 |
zabbix proxy
创建数据库并初始化结构:
1 | # 安装 |
编辑文件 /etc/zabbix/zabbix_proxy.conf
配置数据库的密码
1 | DBPassword=password |
配置
- 监控项(items):zabbix 监控的具体信息,由键值绑定识别,可以通过 zabbix_get 工具测试,是监控的最小单位。比如硬盘已使用空间、硬盘剩余空间等具体指标;
- 应用集(applications):可以简单理解为监控项的分类,例如硬盘有多种监控指标:使用率、剩余空间等,但他们都归到 硬盘(disk) 分类;
- 触发器(triggers):zabbix 监控的 item 达到一定阈值后自动触发其它操作,例如警报等,具有依赖关系
- 图形(graphs):对 item 的指标图形化展示,更加直观友好
- 自动发现规则(Auto Discover Rules):自动发现的时间间隔、使用接口(键值)、名称和分类等信息
- 模板(Template):就是上面一系列信息的组合,方便快速绑定具体主机。模板可以继承,若 A 模板继承 B 模板,那么 A 就会自动绑定 B 具有的监控项、应用集和触发器等。
server 端
开启自动获取资产记录
管理(Administration) -> 常规(General) -> 左上角(GUI)点击切换到 其它(Other) -> 默认主机资产记录模式(Default host inventory mode) 改为 自动(Automatic),然后点击更新(Update)。
创建模板
点击配置 -> 模板 -> 右上角创建模板 -> 填入相关信息 -> 群组选择需要绑定的主机组(可选) -> 点击添加
创建模板时可以直接绑定主机群组,这样群组中的主机都会自动链接到该模板。由于模板之间可以继承,你也可以在 链接的模板 页面进行模板链接,使新创建的模板可以快速拥有监控项(不过这样不如直接全克隆的方式更快)。
创建监控项
监控项是 zabbix 监控的各项指标信息,我们可以在这里添加 zabbix 内置的一些监控指标,也可以自定义 UserParameter 实现自己想要监控的服务,需要注意的是,键值必须唯一,不可冲突,重复的键值模板在链接时会报错。
单击监控项 -> 输入名称 -> 键值选择自己想要监控的项(后面有如何添加自定义监控键值) -> 信息类型选则对应键值返回的类型,否则测试时会报错,根据错误提示修改即可(比如 hostname 的信息类型应是文本)-> 更新间隔根据自己的需要设置。
如果我们想要自定义监控的键值,比如使用 systemctl 简单的判断服务运行状态,就可以使用 UserParameter,以 postgresql 服务为例,可以编辑文件 vi /etc/zabbix/zabbix_agentd.d/my.conf
加入以下内容后重启 Agent 客户端。
1 | UserParameter=postgresql.status,systemctl is-active --quiet postgresql && echo "OK" || echo "ERROR" |
在 Web 端就可以创建新的监控项,键值为 postgresql.status
,如果选择的类型不是主动式的,我们还可以直接对其进行测试。测试通过后,就可以调用 Zabbix API 获取对应键值的信息(前提是获取的主机已经配置该监控项或者链接到具有该监控项的模板)。
应用集也是可选的,例如可以把 CPU、DISK、Memory 都归类为 硬件,在新建监控项的时候可以直接对其进行新建,也可以选择已有的应用集。
agent 端
Agent 客户端 有两种模式,它们之间的区别可以参看:https://www.zabbix.com/documentation/5.0/zh/manual/appendix/items/activepassive
首先,所有 agent 客户端的 hostname 必须要被 server 端识别,本机可以使用 hostnamectl set-hostname [name] 进行配置,然后编辑各个机器上的 /etc/hosts
文件进行添加修改,比较简单,不再赘述。
主动模式和被动模式同时存在,可以让一部分主机监控项处于被动模式,另一部分处于主动模式。
主动模式(自动注册)
zabbix agent 客户端周期性的从本机收集信息并主动向 server 端上报信息。编辑 /etc/zabbix/zabbix_agentd.conf
文件:
1 | # port 如果不是 10051 需要添加 |
重启服务:systemct restart zabbix-agent
如果按照网络其它资料配置了
StartAgents=0
,那么就关闭了被动模式。不推荐关闭被动模式。
然后打开 server web 端,创建动作 -> 自动注册动作 -> 创建动作
条件: 主机元数据 包含 Linux(这就是 HostMetadata、HostMetadataItem 给 server 的信息中包含)
操作: 添加主机、添加到主机组(选择主机分类)、链接到模板(选择绑定的模板)
如果客户端配置了自定义的 UserParamter(后文有示例),可能会出现 Permission denied 的问题,此时我们需要设置 root 用户管理 zabbix-agent。编辑文件:vi /usr/lib/systemd/system/zabbix-agent.service
,修改下面的两个配置后。
1 | # 找到下面两项信息修改 |
重启 Agent 服务
1 | systemctl daemon-reload |
被动模式(自动发现)
zabbix server 向 agent 客户端索要信息,可能有一定的延迟。同样编辑 /etc/zabbix/zabbix_agentd.conf
文件
1 | Server=zabbix_server_ip |
重启服务:systemct restart zabbix-agent
通过 UserParameter 自定义监控项
UserParameter 是一个比较好用的自定义检测扩展,可以让我们更方便的添加 zabbix 中没有的监控项。我们可以把所有的配置文件都放在 /etc/zabbix/zabbix_agentd.d/
目录下,这样不会干扰原有的配置文件,并且还可以被 agent 加载使用。
编辑文件 vi /etc/zabbix/zabbix_agentd.d/my.conf
加入以下内容
1 | UserParameter=postgresql.status,systemctl is-active --quiet postgresql && echo "OK" || echo "ERROR" |
重启 Agent 服务后就可以 zabbix_get 工具进行测试或者在 Web 端创建监控项,键值为 postgresql.status
。
1 | zabbix_get -s 127.0.0.1 -k postgresql.status |
附
一些问题记录
访问前端页面,nginx 日志报错:
1 | FastCGI sent in stderr: "PHP message: PHP Warning: session_start(): open(/var/opt/rh/rh-php72/lib/php/session//sess_2dcabc26in3n1mthl06q7vls0a, O_RDWR) failed: Permission denied (13) in /usr/share/zabbix/include/classes/core/CSession.php on line 45 |
解决方式:
1 | # 没有权限那就增加权限,如果组权限增加后还是不行就 o+w |
sock 文件权限不足,原因:selinux 阻止创建 sock 文件
1 | 10201:20241016:230627.693 cannot start LLD manager service: Cannot bind socket to "/var/run/zabbix/zabbix_server_lld.sock": [13] Permission denied. |
解决方案:
1 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config |
登录发生错误,这个错误大概率是创建用户的时候出错的,因为需要输入三次密码,前两次是新创建用户的密码,最后一次是 postgres 默认用户的密码。有时候根据错误提示可能新建的用户也使用的 postgres 的密码,输入三次一样的就 OK 了。
1 | *31 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught TypeError: Argument 2 passed to makeMessageBox() must be of the type array, null given, called in /usr/share/zabbix/include/classes/setup/CSetupWizard.php on line 322 and defined in /usr/share/zabbix/include/func.inc.php:1614 |
解决方式:直接使用 postgres 用户登录数据库。
zabbix web 前端管理页面使用中文,部分页面出现乱码。解决方式,下载一款支持中英文的字体,备份 zabbix server web 的原有字体,字体位置:/usr/share/fonts/dejavu/DejaVuSans.ttf
,然后覆盖 DejaVuSans.ttf
字体。
MySQL 版记录
MySQL 只是简单提一下。这里分的镜像更细了,上面只分了 zabbix 和 pg。centos-release-scl
的源和 zabbix server 前端需要自己进行配置后才可以正常使用 yum 安装,这些和上面步骤相同,不再赘述。
1 | # 注意 centos-release-scl 的源配置和上面一样 |
Server 配置
1 | mysql -uroot -p |
编辑 /etc/zabbix/zabbix_server.conf
文件
1 | DBPassword=password |
编辑 /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf
文件
1 | listen 80; |
编辑 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
文件
1 | listen.acl_users = apache,nginx |
重启服务
1 | systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm |
proxy
1 | mysql -uroot -p |
禁用 log_bin_trust_function_creators 选项
1 | mysql -uroot -p |
编辑 /etc/zabbix/zabbix_proxy.conf
文件
1 | DBPassword=password |
重启
1 | systemctl restart zabbix-proxy |
Zabbix API
zabbix 提供了 API 让外部应用系统进行调用,非常容易与其它系统集成。一般请求格式如下:
1 | { |
复杂一些的请求:
1 | { |
查询服务器信息使用的 API:host.get
查询服务器监控项使用的 API:item.get
zabbix agent 添加自定义键值获取硬件信息
Linux 下读取一些文件的信息必须使用 root 用户,所以对于某些 UserParamter 来说,会出现 Permission denied 的问题。
1 | vi /usr/lib/systemd/system/zabbix-agent.service |
找到下面两项信息修改:
1 | Uesr=root |
然后重新启动
1 | systemctl daemon-reload |
以获取系统 sn 和简单获取 pg 服务是否运行为例,编辑文件:vi /etc/zabbix/zabbix_agentd.d/my.conf
1 | UserParameter=get.sn.info,echo "`/usr/sbin/dmidecode |egrep -A4 'System Information'|egrep 'Serial Number'|awk -F: '{print $NF}'`" |
保存之后重启 agent 服务。然后在 server 端使用以下命令测试:
1 | zabbix_get -s agent-ip -k get.sn.info |
在 web 页面的模板中添加自定义监控项,键值为上面定义的键值,不可出错!之后就可以调用 zabbix API 获取对应的信息啦!
snmp 离线包制作与安装
1 | # 下载 perl 离线包 |
新建 /etc/yum.repo.d/perl.repo
和 /etc/yum.repo.d/snmp.repo
两个文件,内容如下,baseurl 需要替换为实际位置。
1 | [perl] |
1 | [snmp] |
安装
1 | yum clean all |
启动
1 | systemctl start snmpd |
配置文件
文件位置:/etc/snmp/snmpd.conf
1 | #添加一个采集项.1,意味着可以采集到所有mib tree的信息 |
重启服务
1 | systemctl restart snmpd.service |