Zabbix 分散式監控安裝與教學 (一):

LUFOR129
9 min readNov 18, 2021

來講講Zabbix,當你想要做維運時,Zabbix會是好選擇之一。今天來講講Zabbix的安裝與基礎使用。Zabbix是一個企業級、開源、分散式監控的解決方案,採用Master-Slave架構,可以輕鬆橫跨多平台、多協定來監後伺服器或是設備(包含雲端)。此外也提供了多樣化的圖形介面與通知功能,以及許許多多的預設場景監控,讓新手也能對監控快速上手。

會寫本文是由於在參加IT鐵人看到由zyxu所寫的監控大挑戰,大家可以去參考他們的網站,增加點閱率:

本文著重在zabbix介紹與安裝,本文提供Docker方式的安裝Server與Agent。

一、Zabbix架構

官網的架構圖

Zabbix架構是標準Master-Slave架構,有著Zabbix Agent去蒐集伺服器的資訊,並傳給Zabbix Server。此外如果裝置太多,他也支援zabbix proxy功能,將訊息統整在proxy後再傳給Server,這常見於IOT監控場景,避免Zabbix Server與太多socker對連從而降低效能。最後對於一些無法安裝agent的設備(影印機、Router),提供如SNMP、ICMP、TCP等協定服務來去監控。

如果對於Zabbix 的圖形化不滿意,你也可以安裝Grafana來讓他更漂亮。此外,擁有多項通知選項,從Line到Teams都有。也可以整合其他服務的API,如Jenkins、Cloud。

二、Zabbix 安裝 (Docker)

Zabbix Server是一個標準的LAMP網頁架構(Linux、Appache、MySQL、PHP)。我們這次選用官方的Docker安裝流程,將Zabbix Container化。

首先建立Zabbix Server的Docker Network把前後資料庫端都能包含進去

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

建立Zabbix的MySQL

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

建立Zabbix的Proxy Server,即使你只有少少的裝置,官方還是建議裝一下。

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

建立Zabbix的Server並連接MySQL與Proxy,如下可以看到Server默認Port為10051。此外,Agent 默認port 為10050。

docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--network=zabbix-net \
-p 10051:10051 \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-5.4-latest

建立前端,由於我的80port被其他服務佔據了,所以我選擇使用85port。

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="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-p 85:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest

全部都完成後就算是安裝完成了。開啟 http://<Your IP>:85 即可出現登入畫面,默認的Super UserName: Adam 默認Password: zabbix

可能出現的BUG

打開網頁後會出現dbversion not found,代表資料庫還沒初始化完成。如果資料庫等一段時間後還是沒有完成初始化,解法:

1. docker exec -it mysql-server bash (進入mySQL container)
2. mysql --user=zabbix -password=zabbix_pwd (進入mySQL)
3. USE zabbix; (使用zabbix DB)
4. SHOW TABLES; (看看有沒有dbversion這張table, 如果沒,自己建)
5. 建立TABLES並插入如下圖的資料

三、Zabbix Agent安裝 (Docker)

當你安裝Zabbix Server後就會安裝agent來監控localhsot。左邊Menu > Configuration > Hosts 可以看到Zabbix server的agent,監控著 127.0.0.1:10050 。但是實際上你監控不到任何東西的。

為什麼呢? 如下圖,看我們的Docker就知道了,我們建立DockerNet將所有的Container stack起來。Server內的Agent的localhost其實代表的是其虛擬IP的localhost,而非外層的實體IP 140.115.82.3。因此無法成功到監控外部實體的伺服器資訊。

解法有兩種 擇一

  1. 把Zabbix Agent的container加入Docker Network

首先安裝zabbix Agent並加入zabbix Network,其中ZBX_HOSTNAME代表此Agent的名稱,ZBX_SERVER_HOST指定Zabbix Server的IP。

docker run --name some-zabbix-agent \
--network=zabbix-net \
-e ZBX_HOSTNAME="zabbix-server" \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-d zabbix/zabbix-agent

接著搜尋docker network。 docker network inspect zabbix-net 找到some-zabbix-agent的虛擬IP,把這記下來。

2. 將Zabbix Agent開啟port對外port

docker run --name some-zabbix-agent \
-e ZBX_HOSTNAME="zabbix-agent1" \
-e ZBX_SERVER_HOST="對方IP" \
-p 10050:10050 \
-d zabbix/zabbix-agent

同樣的將此個zabbix agent的實體IP記下來。

接著進入zabbix 網頁 > Configuration > Hosts > Create host。如下: 3. 輸入你的Agent Host Name 4.在IP與port

接著點擊5. Template。選擇Link new Template,這是zabbix的一大特點,他們幫你定義好了該監控什麼並包了起來,比如我們想要監控Ubuntu Server。選擇Server > Linux by Zabbix agent。

退出來後,等待一段時間,如果有成功會亮綠色的。

你之後就可以接收到監控訊息了,點擊 Monitoring > Hosts > Choose Hosts > Graphs… 。

快畢業了最近正在找工作,希望能順利找到希望的工作 XD

--

--