控Nginx實(shí)戰(zhàn):Agent端配置與狀態(tài)頁采集全解析)
先說結(jié)論Zabbix 監(jiān)控 Nginx最關(guān)鍵的環(huán)節(jié)不在 Server 端怎么寫監(jiān)控項(xiàng)而在 Agent 端怎么把 Nginx 的實(shí)時(shí)狀態(tài)穩(wěn)定采集上來。很多人裝了一堆組件最后發(fā)現(xiàn)數(shù)據(jù)過不來問題大多出在 Nginx 狀態(tài)頁沒開、Agent 配置文件沒改對(duì)、自定義監(jiān)控項(xiàng)寫錯(cuò)這三個(gè)地方。這篇文章適合兩類人。一類是剛開始接觸 Zabbix想用 Agent 方式給 Nginx 加監(jiān)控的新手另一類是已經(jīng)把 Zabbix Server 跑起來但搞不清客戶端、狀態(tài)頁、自定義 key 之間關(guān)系的人??赐曛竽隳馨错樞虼畛鲆粭l完整鏈路Nginx 暴露狀態(tài)頁Agent 執(zhí)行采集命令Zabbix Server 通過 key 拿到數(shù)據(jù)最終在 Web 界面看到指標(biāo)曲線和告警。下面按實(shí)際落地順序拆一遍。1. 先把Zabbix監(jiān)控Nginx的數(shù)據(jù)鏈路拆清楚1.1 Agent在監(jiān)控鏈路里到底干什么Zabbix 監(jiān)控 Nginx 可以有多種方式比如直接用 SNMP、用 Zabbix Agent、或者讓 Zabbix Server 主動(dòng)去請(qǐng)求 HTTP 接口。最常見、也最適合多數(shù)企業(yè)內(nèi)部場(chǎng)景的就是Zabbix Agent方式。Agent 本質(zhì)上是一個(gè)安裝在被監(jiān)控機(jī)器上的小服務(wù)。它負(fù)責(zé)做三件事接收 Zabbix Server 或 Zabbix Proxy 發(fā)來的數(shù)據(jù)請(qǐng)求執(zhí)行本地的采集命令、腳本或從狀態(tài)頁讀取數(shù)據(jù)把結(jié)果返回給 Server 端。所以Agent 不是直接“連”上 Nginx而是起到了一個(gè)翻譯和采集的作用。Nginx 本身不會(huì)主動(dòng)告訴 Zabbix “我的并發(fā)連接是多少”Agent 需要自己去讀 Nginx 暴露出來的狀態(tài)信息然后轉(zhuǎn)換成 Zabbix 能識(shí)別的數(shù)值。理解這條鏈路非常重要。很多人直接照著網(wǎng)上配置往配置文件里寫了幾行UserParameter發(fā)現(xiàn)沒數(shù)據(jù)就以為是 Zabbix 的問題。實(shí)際上往往是 Nginx 狀態(tài)頁本身打不開或者 Agent 所在用戶沒有權(quán)限執(zhí)行 curl又或者 key 名稱寫錯(cuò)了導(dǎo)致 Server 端拿不到結(jié)果。1.2 基礎(chǔ)監(jiān)控項(xiàng)可以直接用高級(jí)指標(biāo)要靠狀態(tài)頁或腳本如果你只是監(jiān)控“進(jìn)程在不在”那 Zabbix 自帶的模板和內(nèi)置 key 就夠了。比如用proc.num[nginx]或proc.num[nginx.exe]判斷 Nginx 進(jìn)程數(shù)量用system.cpu.load看 CPU 負(fù)載用net.if.in、net.if.out看網(wǎng)卡流量。這些不需要改動(dòng) Nginx 配置Agent 裝上之后就能用。但如果你想監(jiān)控 Nginx 的業(yè)務(wù)指標(biāo)比如當(dāng)前活躍連接數(shù)總連接數(shù)總請(qǐng)求數(shù)每秒請(qǐng)求數(shù)Reading、Writing、Waiting 的數(shù)量那一定要開啟 Nginx 的stub_status模塊并配置一個(gè)狀態(tài)頁。然后通過 Agent 的UserParameter去讀取解析。這里有一個(gè)常見誤解以為 Zabbix 官方模板會(huì)自動(dòng)采集這些數(shù)據(jù)。實(shí)際上官方模板里包含這些監(jiān)控項(xiàng)但前提是 Agent 端已經(jīng)裝好了 Nginx 狀態(tài)頁采集腳本或自定義 key。模板只是“裝了 CPU 插座”還得你自己把“電源線”接上。1.3 環(huán)境準(zhǔn)備和判斷標(biāo)準(zhǔn)準(zhǔn)備環(huán)境時(shí)先確認(rèn)以下條件Zabbix Server 已經(jīng)安裝并運(yùn)行Web 界面可以打開被監(jiān)控的 Nginx 服務(wù)器能訪問 Zabbix Server/Serve 端也能訪問 Agent 的監(jiān)聽端口Agent 版本盡量和 Server 主版本接近避免低版本 agent 不支持某些 keyNginx 編譯時(shí)帶上了--with-http_stub_status_module或者本身就是發(fā)行版默認(rèn)編譯好的版本如果是 Docker 部署的 Nginx也要確認(rèn)容器內(nèi)是否有 curl、grep、awk 這些基礎(chǔ)命令后面腳本采集時(shí)會(huì)用到。其中“Agent 版本和 Server 版本盡量一致”這條很多人會(huì)忽略。雖然 Zabbix Agent 大體上向后兼容但高版本 Server 搭配特別老的 Agent可能出現(xiàn)監(jiān)控項(xiàng)顯示“不支持”的情況。建議落地前先統(tǒng)一版本。如果只是學(xué)習(xí)測(cè)試單機(jī)部署一臺(tái) VM 就夠如果要進(jìn)生產(chǎn)建議把 Zabbix Server 和 Agent 分別部署在不同機(jī)器上避免性能干擾。2. Agent端安裝和基礎(chǔ)配置決定后面少踩一半坑2.1 安裝方式選擇Zabbix Agent 的安裝方式取決于操作系統(tǒng)。常見的有使用發(fā)行版官方倉庫或 Zabbix 官方倉庫安裝下載源碼編譯安裝使用 Docker 容器運(yùn)行 agent如果是 Windows Nginx還需要安裝 Windows 版本的 agent。安裝時(shí)最好不要用“從網(wǎng)上隨手找個(gè)包”的方式因?yàn)?Zabbix 官方倉庫會(huì)根據(jù)你使用的系統(tǒng)版本提供對(duì)應(yīng)的 agent 包依賴也能自動(dòng)處理。具體安裝命令這里不給死版本因?yàn)椴煌到y(tǒng)和 Zabbix 版本的倉庫地址差異很大。建議參考官方安裝文檔或者直接看倉庫安裝提示按照“添加官方倉庫 - 刷新包列表 - 安裝 zabbix-agent”的順序走。安裝完成后先不著急改配置確認(rèn) agent 二進(jìn)制文件已經(jīng)存在。which zabbix_agentd或者zabbix_agentd --version如果命令能打印出版本信息說明安裝成功。這一步能提前發(fā)現(xiàn)“安裝到一半缺依賴”“架構(gòu)不對(duì)”等問題。2.2 修改Agent配置文件Agent 的主配置文件一般叫zabbix_agentd.conf在 Linux 上常見路徑有/etc/zabbix/zabbix_agentd.conf、/usr/local/etc/zabbix_agentd.conf。Windows 上通常安裝在 agent 安裝目錄下。需要重點(diǎn)關(guān)注這幾個(gè)參數(shù)參數(shù)作用填寫建議Server允許向本 Agent 請(qǐng)求數(shù)據(jù)的 Zabbix Server 或 Proxy IP寫 Server 的實(shí)際 IP不要寫 0.0.0.0ServerActiveAgent 主動(dòng)連接 Server 的地址用于主動(dòng)模式同樣寫 Server IP 和端口HostnameAgent 在 Server 端注冊(cè)或顯示的主機(jī)名必須和 Web 界面創(chuàng)建的主機(jī)名一致UnsafeUserParameters是否允許自定義 key 包含特殊字符或帶參數(shù)如果自定義命令很簡(jiǎn)單可以設(shè)為 0如果帶參數(shù)、管道最好設(shè)為 1UserParameter自定義監(jiān)控項(xiàng) key 和采集命令可以寫在單獨(dú)文件里引用一個(gè)常見的問題是同時(shí)配置了Server和ServerActive但 Hostname 寫錯(cuò)了。結(jié)果就是 Zabbix Server 能看到主機(jī)但數(shù)據(jù)全斷斷續(xù)續(xù)。原因是被動(dòng)模式下 Server 根據(jù) IP 來找 Agent主動(dòng)模式下 Agent 要上報(bào)自己的 Hostname兩套機(jī)制的校驗(yàn)方式不一樣。我給你一個(gè)比較穩(wěn)妥的配置習(xí)慣先只配置被動(dòng)模式也就是Server和Hostname確認(rèn) zabbix_get 能取到數(shù)據(jù)后再按需開啟主動(dòng)模式不要一上來就同時(shí)開兩個(gè)模式排查起來不方便。2.3 啟動(dòng)與連通性驗(yàn)證配置文件改完后重啟 Agent 服務(wù)。systemctl restart zabbix-agent確認(rèn)進(jìn)程狀態(tài)systemctl status zabbix-agent然后看 Agent 日志確認(rèn)沒有報(bào)錯(cuò)。日志位置通常在/var/log/zabbix/zabbix_agentd.log。如果 Agent 和服務(wù)在同一臺(tái)機(jī)器可以用zabbix_get命令模擬 Server 拉取數(shù)據(jù)。zabbix_get -s 127.0.0.1 -k agent.ping返回1代表 Agent 活著。返回超時(shí)或cannot connect就要檢查端口監(jiān)聽和防火墻。接下來用同樣方式測(cè)試 Nginx 相關(guān)的內(nèi)置 key比如zabbix_get -s 127.0.0.1 -k proc.num[nginx]如果返回?cái)?shù)字說明 Agent 部署正常已經(jīng)能獲取系統(tǒng)數(shù)據(jù)。到這里基礎(chǔ)的 Agent 鏈路算通了。3. Nginx狀態(tài)頁開啟核心指標(biāo)都從這里來3.1 檢查Nginx是否帶stub_status模塊Nginx 的stub_status是官方自帶的一個(gè)模塊但很多源碼編譯的 Nginx 默認(rèn)并沒有把它帶上。所以第一步是先確認(rèn)??匆寻惭b Nginx 是否包含該模塊nginx -V 21 | grep stub_status如果有輸出說明模塊已經(jīng)編譯進(jìn)去了。如果沒有輸出有兩種處理方式重新編譯 Nginx在 configure 參數(shù)中加上--with-http_stub_status_module如果用的是發(fā)行版默認(rèn) Nginx可以檢查是否已經(jīng)默認(rèn)帶了這個(gè)模塊。比如某些 Linux 發(fā)行版的 nginx 包會(huì)默認(rèn)包含。重新編譯相對(duì)麻煩尤其會(huì)影響現(xiàn)有 Nginx 的平滑升級(jí)。建議先在測(cè)試環(huán)境驗(yàn)證不要直接在線上操作。如果線上 Nginx 是別人裝的你也不清楚編譯參數(shù)那就先跑nginx -V看看結(jié)果。3.2 配置location /nginx_status在 Nginx 配置中增加一個(gè)狀態(tài)頁 location。常見做法是新增一個(gè)獨(dú)立配置文件或者在server塊中新增 location。location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }這里最重要的不是stub_status on;而是allow和deny的訪問控制。默認(rèn)情況下這個(gè)頁面會(huì)暴露 Nginx 當(dāng)前所有連接和請(qǐng)求狀態(tài)。如果不做限制外網(wǎng)可以隨便訪問等于泄露了服務(wù)運(yùn)行基礎(chǔ)信息。所以一般只允許本機(jī)或內(nèi)網(wǎng)監(jiān)控網(wǎng)段訪問。如果 Agent 和 Nginx 在同一臺(tái)機(jī)器allow 127.0.0.1就夠了。如果 Agent 要從另一臺(tái)機(jī)器抓取就把a(bǔ)llow換成監(jiān)控網(wǎng)段但這樣會(huì)對(duì) Nginx 暴露一個(gè) HTTP 端點(diǎn)必須在防火墻層面做好限制。有些朋友會(huì)問不是 Agent 本機(jī)采集嗎為什么還要允許局域網(wǎng)因?yàn)槿绻愕牟杉_本是跑在 Agent 本機(jī)通過http://127.0.0.1/nginx_status訪問那確實(shí)只需要允許本機(jī)。但如果你嘗試從 Zabbix Server 直接用 HTTP agent 監(jiān)控 Nginx那就必須允許 Server IP。本文統(tǒng)一采用 Agent 本機(jī)采集的方式所以只允許 127.0.0.1 最穩(wěn)。配置完成后重載 Nginx。nginx -t nginx -s reload3.3 本地curl驗(yàn)證輸出格式在 Agent 本機(jī)執(zhí)行curl http://127.0.0.1/nginx_status正常情況下會(huì)看到類似這樣的輸出Active connections: 12 server accepts handled requests 100 100 200 Reading: 0 Writing: 1 Waiting: 11四行數(shù)據(jù)的含義第一行當(dāng)前活躍連接數(shù)第二行三個(gè)計(jì)數(shù)器的標(biāo)題第三行總接受連接數(shù)、總握手連接數(shù)、總請(qǐng)求數(shù)第四行正在讀取請(qǐng)求頭的連接數(shù)、正在寫入響應(yīng)的連接數(shù)、空閑等待請(qǐng)求的連接數(shù)。如果 curl 返回空或者 403、404先查 Nginx 配置是否真正生效再查防火墻。403 通常是 allow/deny 規(guī)則問題404 通常是 location 路徑或配置文件沒加載。4. 自定義監(jiān)控項(xiàng)把status頁轉(zhuǎn)換成Zabbix能識(shí)別的數(shù)據(jù)4.1 用UserParameter定義KeyAgent 拿到 Nginx 狀態(tài)頁內(nèi)容之后還需要把它解析成獨(dú)立指標(biāo)。Zabbix 是通過自定義 key 來實(shí)現(xiàn)的。在/etc/zabbix/zabbix_agentd.d/目錄下新建一個(gè)配置文件比如userparameter_nginx.conf寫入U(xiǎn)serParameternginx.active,curl -s http://127.0.0.1/nginx_status | grep Active | awk {print $NF} UserParameternginx.requests,curl -s http://127.0.0.1/nginx_status | sed -n 3p | awk {print $3} UserParameternginx.reading,curl -s http://127.0.0.1/nginx_status | grep Reading | awk {print $2} UserParameternginx.writing,curl -s http://127.0.0.1/nginx_status | grep Writing | awk {print $4} UserParameternginx.waiting,curl -s http://127.0.0.1/nginx_status | grep Waiting | awk {print $6}注意這里的命令里用到了管道和grep所以UnsafeUserParameters需要設(shè)為1否則 Agent 可能拒絕執(zhí)行這類帶特殊字符的命令。配置完重啟 Agentsystemctl restart zabbix-agent用zabbix_get測(cè)試zabbix_get -s 127.0.0.1 -k nginx.active如果返回?cái)?shù)字說明自定義 key 已經(jīng)生效。4.2 用腳本代替多條命令上面的寫法雖然簡(jiǎn)單但每條 key 都執(zhí)行一次 curl而且解析邏輯各不相同。如果有 5 個(gè)指標(biāo)每次采集都要重復(fù)請(qǐng)求 5 次狀態(tài)頁。雖然對(duì)單機(jī)來說影響不大但會(huì)讓監(jiān)控?cái)?shù)據(jù)點(diǎn)的時(shí)間不完全一致尤其是 active、connections、requests 三個(gè)值是不同時(shí)間快照畫圖時(shí)可能看到輕微波動(dòng)。更好的方式是寫一個(gè)采集腳本一次請(qǐng)求拿到所有值再按需輸出。#!/bin/bash STATUS$(curl -s http://127.0.0.1/nginx_status) case $1 in active) echo $STATUS | grep Active | awk {print $NF} ;; requests) echo $STATUS | sed -n 3p | awk {print $3} ;; reading) echo $STATUS | grep Reading | awk {print $2} ;; writing) echo $STATUS | grep Writing | awk {print $4} ;; waiting) echo $STATUS | grep Waiting | awk {print $6} ;; *) echo UNKNOWN ;; esac把這個(gè)腳本放到/usr/local/bin/nginx_status.sh并加執(zhí)行權(quán)限chmod x /usr/local/bin/nginx_status.sh然后配置 userparameterUserParameternginx.status[*],/usr/local/bin/nginx_status.sh $1這樣在 Zabbix Server 端可以用nginx.status[active]、nginx.status[waiting]讀取不同指標(biāo)每次采集只請(qǐng)求一次 Nginx 狀態(tài)頁。這類腳本方案適合指標(biāo)多、采集頻率高的場(chǎng)景。缺點(diǎn)是腳本出了問題排查難度更大所以腳本里盡量減少對(duì)系統(tǒng)命令路徑的依賴。4.3 主動(dòng)模式和被動(dòng)模式對(duì)自定義key的影響自定義 key 本身不區(qū)分主動(dòng)還是被動(dòng)兩種模式都支持。區(qū)別在于被動(dòng)模式Zabbix Server 發(fā)起 TCP 連接向 Agent 請(qǐng)求 keyAgent 執(zhí)行命令返回結(jié)果。適合監(jiān)控項(xiàng)不多、Server 并發(fā)壓力不大的場(chǎng)景。主動(dòng)模式Agent 每隔一段時(shí)間主動(dòng)去向 Server 獲取監(jiān)控項(xiàng)列表然后執(zhí)行并上報(bào)結(jié)果。適合監(jiān)控項(xiàng)很多、網(wǎng)絡(luò)分區(qū)復(fù)雜的場(chǎng)景。如果你使用主動(dòng)模式ServerActive必須配置正確并且 Agent 能訪問 Server 的 10051 端口。同時(shí) Hostname 必須和 Web 界面創(chuàng)建的主機(jī)名完全一致否則 Agent 上報(bào)的數(shù)據(jù)找不到歸屬主機(jī)。在測(cè)試階段建議先使用被動(dòng)模式因?yàn)閦abbix_get就是模擬被動(dòng)模式的請(qǐng)求排錯(cuò)更直觀。5. Server端把主機(jī)和監(jiān)控項(xiàng)綁定起來5.1 在Web界面添加主機(jī)Zabbix Server 裝好并配置好 Agent 后登錄 Web 界面在“數(shù)據(jù)采集 - 主機(jī)”里創(chuàng)建新主機(jī)。需要填寫的內(nèi)容主機(jī)名稱必須與 Agent 配置里的Hostname一致可見名稱可以自定義顯示在頁面上模板可以先選擇自帶模板測(cè)試連接性群組選一個(gè)已有主機(jī)組或者新建一個(gè) Nginx 組Interface選擇 Agent填寫被監(jiān)控機(jī)器 IP 地址端口默認(rèn) 10050。創(chuàng)建時(shí)如果勾選了“添加后啟用”保存后主機(jī)應(yīng)該會(huì)出現(xiàn)在可用主機(jī)列表里。很多人第一次配置時(shí)會(huì)把“主機(jī)名稱”和“可見名稱”混在一起。實(shí)際上主機(jī)名稱是 Zabbix 內(nèi)部用于匹配 Agent 上報(bào)的標(biāo)識(shí)必須嚴(yán)格對(duì)應(yīng)可見名稱可以隨便寫。如果主機(jī)名稱填錯(cuò)主動(dòng)模式下數(shù)據(jù)絕對(duì)不來被動(dòng)模式下有時(shí)還能通過 IP 匹配所以這個(gè)坑要記住。5.2 關(guān)聯(lián)模板或手動(dòng)添加監(jiān)控項(xiàng)Zabbix 官方提供了 Nginx by Zabbix agent 模板里面已經(jīng)定義好了監(jiān)控項(xiàng)和觸發(fā)器。如果你的 Agent 端已經(jīng)配好了對(duì)應(yīng)的自定義 key直接關(guān)聯(lián)模板就能看到數(shù)據(jù)。關(guān)聯(lián)模板之后建議先看“最新數(shù)據(jù)”。如果監(jiān)控項(xiàng)顯示“不支持”說明模板里引用的 key 在 Agent 端并沒有定義要么是自定義配置文件沒生效要么是 key 名稱不匹配。不使用模板的情況下也可以手動(dòng)創(chuàng)建監(jiān)控項(xiàng)字段示例名稱Nginx 活躍連接數(shù)類型Zabbix agent鍵值nginx.status[active]信息類型數(shù)字無正負(fù)更新時(shí)間30s手動(dòng)創(chuàng)建的好處是靈活壞處是每臺(tái)主機(jī)都要配一遍效率低。建議至少從模板開始再按需修改。5.3 最新數(shù)據(jù)驗(yàn)證添加監(jiān)控項(xiàng)后等一兩個(gè)更新周期再到“監(jiān)測(cè) - 最新數(shù)據(jù)”里查看。判斷標(biāo)準(zhǔn)有數(shù)值且持續(xù)更新鏈路完全通顯示不支持Agent 執(zhí)行命令失敗或 key 名稱不對(duì)顯示“不支持”但 zabbix_get 正常檢查 Server 端 Agent 配置的 IP 和端口有數(shù)據(jù)但一直不變檢查腳本是否用了緩存或者 Nginx 狀態(tài)頁是否更新異常。有時(shí)候 Agent 端剛改了自定義配置需要等 Agent 重啟后才會(huì)重新加載。如果發(fā)現(xiàn)改了配置但沒生效先確認(rèn)是否重啟了 zabbix-agent。我用 zabbix_get 排查時(shí)會(huì)習(xí)慣在前面加一個(gè)timeouttimeout 5 zabbix_get -s 192.168.1.10 -k nginx.status[active]加上 timeout 可以避免命令長(zhǎng)時(shí)間卡住尤其當(dāng)腳本內(nèi)部頻繁請(qǐng)求外部地址時(shí)。生產(chǎn)上不建議讓監(jiān)控采集命令永久阻塞Zabbix Agent 本身有 timeout 限制但腳本內(nèi)部如果卡在某個(gè)命令上也會(huì)拖慢采集。6. 數(shù)據(jù)沒到、不支持、為0時(shí)按這個(gè)順序排查6.1 Agent狀態(tài)不可達(dá)現(xiàn)象Zabbix Server 頁面顯示主機(jī)離線zabbix_get -s 目標(biāo)IP -k agent.ping超時(shí)或 cannot connect。排查順序先確認(rèn)目標(biāo) IP 是否通ping 目標(biāo)IP確認(rèn) Agent 端口監(jiān)聽是否正常ss -lntp | grep 10050確認(rèn)防火墻是否放行端口Linux 檢查firewalld或iptables確認(rèn) Zabbix Server 能否連接到該端口用telnet 目標(biāo)IP 10050或nc -vz 目標(biāo)IP 10050如果前面都正???Agent 日志可能有配置錯(cuò)誤或啟動(dòng)失敗。大多數(shù)“不可達(dá)”不是 Zabbix Server 的問題而是防火墻或者 Agent 沒啟動(dòng)。6.2 監(jiān)控項(xiàng)顯示不支持現(xiàn)象agent.ping正常但 Nginx 相關(guān)監(jiān)控項(xiàng)顯示“不支持”。在 Agent 本機(jī)執(zhí)行zabbix_get -s 127.0.0.1 -k nginx.status[active]如果返回非數(shù)字或報(bào)錯(cuò)繼續(xù)看key 名稱是否和 Server 端完全一致自定義配置文件是否生效腳本是否有執(zhí)行權(quán)限腳本里的 curl 是否能訪問 Nginx 狀態(tài)頁Agent 日志里是否有cannot run command之類的記錄。這一層最常見的問題有兩個(gè)一個(gè)是UnsafeUserParameters0導(dǎo)致帶管道或參數(shù)字符的命令被攔截另一個(gè)是腳本權(quán)限不對(duì)Agent 執(zhí)行腳本時(shí)沒有執(zhí)行權(quán)限返回空值。6.3 數(shù)據(jù)為0或長(zhǎng)時(shí)間不變?nèi)绻?zabbix_get 能返回?cái)?shù)字但 Web 界面數(shù)據(jù)為 0 或不變可能的原因監(jiān)控項(xiàng)類型設(shè)置錯(cuò)誤比如把整數(shù)項(xiàng)配置成字符型更新周期太長(zhǎng)短時(shí)間內(nèi)看不到變化Agent 端腳本使用了緩存文件但緩存文件沒有及時(shí)更新Nginx 狀態(tài)頁的數(shù)值確實(shí)沒變化尤其是 Reading/Writing/Waiting請(qǐng)求量低的時(shí)候波動(dòng)很小。遇到這種問題先把監(jiān)控項(xiàng)改成 10s 更新間隔觀察同時(shí)把采集腳本手動(dòng)執(zhí)行幾次對(duì)比結(jié)果。如果手動(dòng)執(zhí)行有變化而 Zabbix 一直取舊值多半是 Agent 端緩存或 Server 端歷史數(shù)據(jù)存儲(chǔ)延遲。6.4 檢查權(quán)限和SELinux這個(gè)坑在 Linux 生產(chǎn)環(huán)境中非常普遍。如果 Agent 和 Nginx 都在同一臺(tái)機(jī)器Agent 執(zhí)行 curl 訪問http://127.0.0.1/nginx_status一般沒問題。但如果 SELinux 開啟可能會(huì)有連接被拒的情況。排查時(shí)先看/var/log/audit/audit.log有沒有 denied 記錄。有的話可以采用兩種方式放通相關(guān)端口或者把 SELinux 臨時(shí)轉(zhuǎn)為 permissive 測(cè)試。不要一上來就永久關(guān)閉 SELinux先確認(rèn)是不是它的原因。Zabbix Agent 默認(rèn)以zabbix用戶運(yùn)行這個(gè)用戶對(duì) Nginx 狀態(tài)頁的訪問是走 HTTP 協(xié)議的不涉及文件系統(tǒng)權(quán)限但要在操作系統(tǒng)層面允許它建立本地網(wǎng)絡(luò)連接。如果連本機(jī)回環(huán)都被限制curl 會(huì)返回空。7. 從單臺(tái)試跑到批量部署還要補(bǔ)三件事7.1 批量部署Agent單機(jī)跑通后批量監(jiān)控也別急著手工逐臺(tái)配置。建議提前準(zhǔn)備好 Agent 配置文件模板和安裝腳本利用自動(dòng)化運(yùn)維工具分發(fā)安裝。批量部署時(shí)每臺(tái)機(jī)器需要變化的內(nèi)容主要有兩個(gè)Hostname和Server。Server通常都指向同一個(gè) Zabbix ServerHostname則建議用機(jī)器名或業(yè)務(wù)名方便識(shí)別。如果沒有自動(dòng)化工具可以寫一個(gè)簡(jiǎn)單的 Shell 腳本在一批機(jī)器上執(zhí)行安裝、寫入配置、啟動(dòng)服務(wù)。關(guān)鍵點(diǎn)在于腳本要冪等重復(fù)執(zhí)行不會(huì)產(chǎn)生重復(fù)監(jiān)控項(xiàng)或配置沖突。7.2 模板復(fù)用和指標(biāo)命名規(guī)范批量部署前先定義一套統(tǒng)一的監(jiān)控項(xiàng)命名規(guī)范。比如nginx.active nginx.requests nginx.reading nginx.writing nginx.waiting不要每臺(tái)機(jī)器都用不同的 key 名。否則后面加圖形、加聚合、加告警時(shí)工作量會(huì)翻好幾倍。在 Zabbix 里一套完整的 Nginx 監(jiān)控模板應(yīng)該包含監(jiān)控項(xiàng)連接數(shù)、請(qǐng)求數(shù)、Reading、Writing、Waiting觸發(fā)器活躍連接數(shù)過高、請(qǐng)求數(shù)異常下降、Nginx 進(jìn)程數(shù)小于 1圖形連接數(shù)和請(qǐng)求數(shù)趨勢(shì)圖聚合原型如果需要按集群視圖查看可以配置聚合監(jiān)控項(xiàng)。模板設(shè)計(jì)好之后所有新主機(jī)直接關(guān)聯(lián)模板避免人工逐條添加監(jiān)控項(xiàng)。7.3 監(jiān)控頻率與告警閾值的取舍Nginx 的指標(biāo)采集頻率不建議太高。默認(rèn) 30 秒到 1 分鐘已經(jīng)足夠尤其是請(qǐng)求數(shù)、活躍連接數(shù)這類指標(biāo)本身就是瞬時(shí)快照采集頻率高并不能提高準(zhǔn)確性反而會(huì)增加 Agent 和 Server 的負(fù)擔(dān)。告警閾值要根據(jù)實(shí)際業(yè)務(wù)來定。比如活躍連接數(shù)超過某個(gè)值就告警但不同服務(wù)器的性能差異很大最好先采集一周數(shù)據(jù)再看基線請(qǐng)求數(shù)突然掉到接近 0可能是 Nginx 掛了也可能是業(yè)務(wù)本身陷入了低谷Reading、Writing 長(zhǎng)期偏高說明可能有大文件傳輸或慢客戶端不一定是故障。我在實(shí)際項(xiàng)目中用過的最不后悔的一個(gè)習(xí)慣是剛開始只采集不告警。先積累一兩周數(shù)據(jù)再根據(jù)真實(shí)基線設(shè)定閾值否則很容易被誤報(bào)刷屏。7.4 日志和備份最后補(bǔ)一個(gè)容易被忽略的點(diǎn)Agent 端自定義配置和腳本要納入版本管理不能只留在機(jī)器上。否則重裝機(jī)器后監(jiān)控配置就很難原樣恢復(fù)了。Zabbix 本身的模板、主機(jī)、監(jiān)控項(xiàng)配置也要定期導(dǎo)出備份。監(jiān)控系統(tǒng)一旦配置多了重新手搭非常痛苦。備份不只是保護(hù)數(shù)據(jù)也是在保護(hù)自己的運(yùn)維效率。如果只是學(xué)習(xí)按默認(rèn)配置跑通就可以了如果要長(zhǎng)期維護(hù)那就把日志、輸出目錄、模板備份和權(quán)限控制都提前整理好后面真的會(huì)省很多事。踩過幾次之后我發(fā)現(xiàn)Zabbix 監(jiān)控 Nginx 的坑很少在“功能不夠”上多半是前置環(huán)境不一致、狀態(tài)頁訪問受限、自定義 key 書寫習(xí)慣不統(tǒng)一。把這幾條理順整個(gè)監(jiān)控鏈路就穩(wěn)了。