搭建zabbix属于没有事情可干而干的事,其实很大原因是因为宝塔那个插件要钱;简单说就一个“穷”字

以前在内网的树莓派上搭过这玩意,然后成功翻车了当时用的是编译安装,然而怎么整都没有正常工作,当时又懒,所以就把系统重置了(成功让我又编译了一次WiringPi),现在再来装选在了一个我没怎么用过的国内服务器上。

(没有多少图)

简单步骤

因为我可能会写下我安装配置的全过程(包括建议),所以你实在懒得看可以就看这一点点,命令基础为Ubuntu,amd64架构,root权限。宝塔配置为LNMP,Mysql版本8.0(Zabbix 6.0LTS好像强制这个版本,简单步骤不包括有关宝塔强制安装的过程)。提前创建网站连带数据库并按照顺序导入源码包里的schema.sql、images.sql和data.sql,将源码中的ui文件夹下所有文件放在网站根目录。简单步骤不包括zabbix proxy的安装。

同时,因为我是从docker转的数据库,所以可能有想的不周到的地方,配置的时候最好多找找文档。

配置源

echo "deb https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/ubuntu/ $(lsb_release -cs) main" >> /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 082AB56BA14FE591
apt update

安装预编译包

服务器端

apt install -y zabbix-server-mysql zabbix-agent2

监控端

apt install -y zabbix-agent2

配置

服务端

nano /etc/zabbix/zabbix_server.conf

配置 DBNameDBUserDBPassword,同时因为宝塔Mysql的Socket不同,还需设置 DBSocket=/tmp/mysql.sock,或者用软连接 ln -s /tmp/mysql.sock /var/run/mysqld/mysqld.sock

然后 systemctl restart zabbix-server重启服务;systemctl enable zabbix-server开机自启

可以 cat /var/log/zabbix/zabbix_server.log看看有没有报错

监控端

配置文件在 /etc/zabbix/zabbix_agent2.conf如果监控端与服务端在一个服务器就基本不用修改,有需要的话可以修改 Hostname

如果不在一个服务器,需要修改 Server(主动),ServerActiveHostname(被动);有需要的话可以修改 TLSConnectTLSAccept来使用PSK加密,并在 TLSPSKIdentityTLSPSKFile配置PSK密钥的相关设置。并放开服务端与监控端的10050端口,建议用服务器提供商的防火墙来指定该端口只能由服务端的IP访问。

systemctl restart zabbix-agent2重启服务;systemctl enable zabbix-agent2开机自启

日志在 /var/log/zabbix/zabbix_agent2.log

systemctl status里都看不到日志呢

前端

提前把宝塔PHP的禁用函数中的 putenv删除,并把最大输入时间设为300;然后完全按照网页的指引就行,如果没有中文选项就需要服务器安装中文包检查 dpkg-reconfigure locales,选择一个中文就行,或者 apt-get install language-pack-zh-hans然后重启服务器。默认用户为Admin,密码是zabbix (用户名区分大小写)

END

完整步骤

准备工作

以下命令全部基于root权限。

系统为Ubuntu 20.04 LTS 宝塔配置为LNMP,Mysql版本8.0(Zabbix 6.0LTS好像强制这个版本) 除此之外你还需要准备源码包

强制安装Mysql8.0:

编译安装 :

wget http://download.bt.cn/install/0/mysql.sh
bash mysql.sh install 8.0

急速安装:

wget http://download.bt.cn/install/1/mysql.sh
bash mysql.sh install 8.0

同时,zabbix只支持utf8_bin、utf8mb3_bin、utf8mb4_bin编码,具体会在日志里显示为(虽然好像都能用?):

Zabbix supports only "utf8_bin,utf8mb3_bin,utf8mb4_bin" collation(s). Database "zabbix_proxy" has default collation "utf8mb4_unicode_520_ci"
only character set(s) "utf8,utf8mb3,utf8mb4" and corresponding collation(s) "utf8_bin,utf8mb3_bin,utf8mb4_bin" should be used in database

创建网站(PHP)与数据库,数据库按照顺序导入源码里 /database/mysql/目录下的schema.sql、images.sql和data.sql;然后将 /ui/目录下的所有文件放在网站根目录。(schema.sql为数据库表结构,如果后续需要安装zabbix proxy的话,这个文件还会用到,可以先别删。)

把宝塔PHP的禁用函数中的 putenv删除,并把最大输入时间设为300。

当然Zabbix Linux有预编译包可以直接用,可以省去很多时间,但是不要使用系统自带的源,自带的源的包非常旧。

echo "deb https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/ubuntu/ $(lsb_release -cs) main" >> /etc/apt/sources.list

这个是清华的源,官方的源在:Zabbix

如果你要在树莓派等arm架构的Linux上安装请把链接末尾的ubuntu改成ubuntu-arm64或者raspbian。或者,安装其他版本请更改链接中的数字,不确定的话请访问链接然后更改命令里的链接。

然后执行 sudo apt update,若报错,请执行以下命令(把返回的keys替换命令中的 <keys>):

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <keys>

然后 apt install -y zabbix-server-mysql zabbix-agent2安装 (按需安装)


关于proxy,proxy需要单独的数据库,一般用于服务端与客户端访问困难时(监控通信不可靠的位置)的解决方法,或者用于分摊服务端的压力,就像这样:

zabbix官方文档对于proxy的描述

代理只需要一个到 Zabbix 服务器的 TCP 连接。这种方式更容易绕过防火墙,因为您只需要配置一个防火墙规则。

proxy的数据库只需要导入schema.sql这个文件服务启动并连接上数据库时会自动初始化数据库。

配置

server的配置文件在 /etc/zabbix/zabbix_server.conf需要找到并修改:

  • DBName、DBUser、DBPassword
  • 同时因为宝塔Mysql的Socket不同,还需设置 DBSocket=/tmp/mysql.sock,或者用软连接 ln -s /tmp/mysql.sock /var/run/mysqld/mysqld.sock

然后 systemctl restart zabbix-server重启服务;systemctl enable zabbix-server配置开机自启;之后可以 cat /var/log/zabbix/zabbix_server.log看看有没有报错。


agent的配置文件在 /etc/zabbix/zabbix_agent2.conf

  • 如果server与agent在一个机器里可以完全不用配置,直接 systemctl enable zabbix-agent2设置开机自启就行了。
  • 如果不在一个机器,需要更改 Server(主动模式),ServerActiveHostname(被动模式,hostname要唯一)
  • 有需要的话 (前提是agent与server都要有openssl编译,预编译软件包自带,Windows端的agent需要看清楚下载带openssl的) 可以修改 TLSConnectTLSAccept来使用PSK加密,并在 TLSPSKIdentityTLSPSKFile配置PSK密钥的相关设置。

在linux上PSK可以用 openssl rand -hex 32获取并创建 .psk文件,填入命令获取的一长串输出,然后更改文件的权限,设置为仅限zabbix用户读取(路径与文件名替换为自己的):

chown zabbix.zabbix /etc/zabbix/zabbix_agent2.psk
chmod 400 /etc/zabbix/zabbix_agent2.psk

agent的配置文件中 TLSPSKIdentity可以自定义(一个PSK对应一个Identity)

windows版的agent可以就使用msi安装,安装过程可以配置PSK,并自动注册系统服务

相关配置文件在 C:\Program Files\Zabbix agent2(应该没记错)下

关于PSK的问题,最好就用一个PSK,可以保证使用代理的时候也能正确连接(没完全测试过用不同的PSK,好像不行,会报TLS错误好像)

官方文档


算了还是提一下proxy的配置,proxy可以在最后配置

  • ProxyMode:proxy的主/被动设置 默认是0(主动式),也就是proxy从服务端10051端口获取配置然后自主监控、存储数据然后把数据发送给服务端,减小服务端的负载。(更新服务端上的使用代理的主机配置后最好把代理重启一下,然后你就会在日志 /var/log/zabbix/zabbix_proxy.log里看见一个类似一下的输出:

    received configuration data from server at "<服务端的IP>", datalen <数字>
  • Server、Hostname(proxy没有ServerActive)跟server与agent一样

  • proxy同样需要填写DBName、DBUser、DBPassword,因为是宝塔的环境,所以一样,DBSocket也要更改为 /tmp/mysql.sock

  • StatsAllowedIP:填只允许的IP的,然而你会在服务端的web界面找到一样的设置,所以这里其实不用管,直接在服务端增加代理的时候填写代理地址就行了<br>agent代理程序配置界面

  • 配置TLSConnect (TLSAccept只需要在设置为ProxyMode=1,也就是被动式的时候填写)、TLSPSKIdentity、TLSPSKFile来使用加密 (在编译有openssl的前提下才能使用加密,预编译软件包自带);配置完后在列表里会有一个小的标志<br>agent代理程序配置PSK<br>配置完后

  • 可以看看列表里的“最近出现(持续)”来看看是不是连上了(主动式不会持续连接,通常就几秒钟)

  • 有关proxy与server的区别,官方文档里有个表格(因为暂时没有中文翻译就用机翻代替一下):

Function 功能 Supported by proxy 代理支持
Items 项目
Zabbix agent checks  Zabbix 代理检查 Yes
Zabbix agent checks (active)   Zabbix 代理检查(主动) Yes
Simple checks  简单检查 Yes
Trapper items  捕手物品? Yes
SNMP checks  SNMP检查 Yes
SNMP traps  SNMP陷阱 Yes
IPMI checks  IPMI检查 Yes
JMX checks  JMX检查 Yes
Log file monitoring  日志文件监控 Yes
Internal checks  内部检查 Yes
SSH checks  SSH检查 Yes
Telnet checks  Telnet检查 Yes
External checks  外部检查 Yes
Dependent items  依赖项 Yes
Built-in web monitoring  内置网络监控 Yes
Network discovery  网络发现 Yes
Low-level discovery  低级发现 Yes
Remote commands  远程命令 Yes
Calculating triggers  计算触发器 No
Processing events  处理事件 No
Event correlation  事件关联 No
Sending alerts  发送警报 No
Item value preprocessing  项值预处理 No

前台

server的前台在PHP配置好的前提下访问网页,一步一步按照提示下一步就行;如果没有中文选项就需要服务器安装中文包检查 dpkg-reconfigure locales,选择一个中文就行,或者 apt-get install language-pack-zh-hans然后重启服务器。 默认用户为Admin,密码是zabbix (用户名区分大小写)

PHP的插件那个界面最好全部装上,装完直接刷新页面即可;网页也需要填写server的数据库信息,后面可能会出现要手动把配置文件放在网站根目录下的 /conf下,直接下载下来用宝塔上传上去就行,配置好权限与用户组。

一些小建议

(部分在宝塔环境下建议)

  • 在添加主机时宏里的所有localhost (除了mysql的,mysql是要填 {$MYSQL.DSN} 最好都改为127.0.0.1,不然会有些奇奇怪怪的报错。(比如有的模板不支持301重定向,而localhost必然301到了127.0.0.1等;还有之前还挺好,我加了个PSK加密就不行了等等奇葩问题)
  • 添加Nginx by Zabbix agent模板时可以完全不用按照模板的操作,直接添加就行,什么都不用改,因为宝塔自己也是用的ngx_http_stub_status_module来显示Nginx状态的;同理添加PHP-FPM by Zabbix agent模板也不需要按照模板的文档添加任何东西,只需要更改宏 {$PHP_FPM.STATUS.PAGE}为phpfpm_74_status(74对应PHP7.4,同理)即可.
  • 因为宝塔的安全设置所以“Nginx: Version”这个监控项是获取不到的,可以不用管或者直接在模板里关闭。(可以调,但是有点麻烦)
  • 官方的Redis by Zabbix agent 2模板不支持设置了密码的Redis,论坛里有相关的问题与回答:Zabbix official redis template does not pass password,不过Redis在本地用可以不用设置密码 (前提是端口对外关闭)
  • 安装proxy带agent时记得在主机配置里添加Zabbix proxy health模板,同理server有Zabbix server health模板
  • 可以直接去模板更改宏一样的项。
  • 对MySQL的监控的账户最好拥有 SELECT, SHOW DATABASES, REPLICATION CLIENT的全局权限以监控每个数据库的状况 (SHOW DATABASES与REPLICATION CLIENT权限是自动发现规则需要用到的,然后后续自动添加的监控项需要SELECT权限来获取数据库的大小)

END

Docker版安装

顺便把我最早用docker部署的全部命令发上来(自行更改<>的内容)

基本来自于官方的文档内容

创建专用于 Zabbix 的网络:

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

启动Mysql8.0的容器

docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="<password>" \
      -e MYSQL_ROOT_PASSWORD="<password>" \
      --network=zabbix-net \
      --restart unless-stopped \
      -d mysql:8.0 \
      --character-set-server=utf8 --collation-server=utf8_bin \
      --default-authentication-plugin=mysql_native_password

启动Zabbix java网关

docker run --name zabbix-java-gateway -t \
      --network=zabbix-net \
      --restart unless-stopped \
      -d zabbix/zabbix-java-gateway:ubuntu-6.0-latest

启动Zabbix server

docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="<password>" \
      -e MYSQL_ROOT_PASSWORD="<password>" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --network=zabbix-net \
      -p 10051:10051 \
      --restart unless-stopped \
      -d zabbix/zabbix-server-mysql:ubuntu-6.0-latest

启动前台

docker run --name zabbix-web-nginx-mysql -t \
      -e ZBX_SERVER_HOST="zabbix-server-mysql" \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="<password>" \
      -e MYSQL_ROOT_PASSWORD="<password>" \
      --network=zabbix-net \
      -p 18080:8080 \
      --restart unless-stopped \
      -d zabbix/zabbix-web-nginx-mysql:ubuntu-6.0-latest

启动agent(用了高权限)

IP参考如何获取 docker 容器(container)的 ip 地址

docker run --name local-zabbix-agent -t \
      --link zabbix-server-mysql:local-zabbix-server \
      -e ZBX_HOSTNAME="Zabbix server" \
      -e ZBX_SERVER_HOST="<server在docker里的ip>" \
      --privileged \
      --network=zabbix-net \
      --restart unless-stopped \
      -d zabbix/zabbix-agent:ubuntu-6.0-latest

访问端口是18080,要监控其他服务器要防火墙开启10050端口

其他服务器用docker(用了高权限):

docker run --name <name> -it \
      -e ZBX_HOSTNAME="<hostname>" \
      -e ZBX_SERVER_HOST="<ip>" \
      -e ZBX_ACTIVESERVERS="<ip>" \
      --privileged \
      -p 10050:10050 \
      --restart unless-stopped \
      -d zabbix/zabbix-agent2:ubuntu-6.0-latest

docker好像不能监控容器外的nginx与php之类的,如果只要监控linux,docker版挺好用的。

参考资料

最后修改:2022 年 04 月 29 日
如果觉得我的文章对你有用,请随意赞赏