控實(shí)戰(zhàn):從服務(wù)器監(jiān)控到業(yè)務(wù)感知的跨越)
1. 項(xiàng)目概述從服務(wù)器監(jiān)控到業(yè)務(wù)感知的跨越很多運(yùn)維朋友對(duì)Zabbix的印象還停留在服務(wù)器CPU、內(nèi)存、磁盤(pán)這些硬件指標(biāo)的監(jiān)控上覺(jué)得它就是個(gè)“看機(jī)器的”。但如果你只把它用在這個(gè)層面那真是大材小用了。我干了十多年運(yùn)維從早期的Nagios、Cacti一路用過(guò)來(lái)Zabbix最讓我覺(jué)得“值回票價(jià)”的地方恰恰在于它對(duì)業(yè)務(wù)層面的監(jiān)控能力尤其是對(duì)Web網(wǎng)站和服務(wù)的監(jiān)控?!皕abbix如何網(wǎng)站監(jiān)控web”這個(gè)問(wèn)題背后反映的是一個(gè)非常普遍的需求我們不僅要知道服務(wù)器活著更要知道用戶(hù)訪(fǎng)問(wèn)我們的網(wǎng)站時(shí)體驗(yàn)到底怎么樣。服務(wù)器CPU使用率可能只有10%但用戶(hù)打開(kāi)一個(gè)頁(yè)面卻要等10秒這種問(wèn)題硬件監(jiān)控是發(fā)現(xiàn)不了的。Zabbix的Web監(jiān)控功能就是模擬一個(gè)真實(shí)用戶(hù)去訪(fǎng)問(wèn)你的網(wǎng)站然后告訴你這個(gè)“用戶(hù)”的體驗(yàn)數(shù)據(jù)頁(yè)面打開(kāi)花了多久、每個(gè)元素加載是否正常、關(guān)鍵內(nèi)容有沒(méi)有正確返回等等。這不僅僅是技術(shù)監(jiān)控更是業(yè)務(wù)監(jiān)控。它能幫你發(fā)現(xiàn)CDN節(jié)點(diǎn)異常、第三方API接口變慢、頁(yè)面代碼臃腫導(dǎo)致加載緩慢、甚至是網(wǎng)站被篡改掛馬如果監(jiān)控的關(guān)鍵字不見(jiàn)了等問(wèn)題。接下來(lái)我就結(jié)合自己踩過(guò)的坑和積累的經(jīng)驗(yàn)把Zabbix做Web監(jiān)控從設(shè)計(jì)思路到落地實(shí)操再到問(wèn)題排查給你徹底講透。2. 核心思路模擬用戶(hù)而非探測(cè)端口在開(kāi)始配置之前我們必須先統(tǒng)一思想Zabbix的Web監(jiān)控Web Monitoring和簡(jiǎn)單的主機(jī)可用性監(jiān)控如ICMP Ping、TCP端口探測(cè)是兩碼事。后者告訴你“門(mén)開(kāi)著”前者告訴你“進(jìn)門(mén)后辦事順不順利”。2.1 監(jiān)控場(chǎng)景的深度解析Web監(jiān)控的核心是場(chǎng)景Scenario。一個(gè)場(chǎng)景定義了一次完整的“用戶(hù)訪(fǎng)問(wèn)旅程”。比如監(jiān)控一個(gè)電商網(wǎng)站首頁(yè)的加載這個(gè)場(chǎng)景可能包含以下步驟訪(fǎng)問(wèn)首頁(yè) (GET /)登錄 (POST /login)搜索商品 (GET /search?keywordxxx)查看商品詳情 (GET /product/123)Zabbix會(huì)嚴(yán)格按照你定義的步驟順序執(zhí)行并記錄每一步的耗時(shí)、返回狀態(tài)碼、下載速度、以及你是否預(yù)設(shè)了需要校驗(yàn)的字符串比如檢查頁(yè)面是否包含“登錄成功”字樣。這種基于場(chǎng)景的監(jiān)控能精準(zhǔn)定位問(wèn)題發(fā)生在哪個(gè)環(huán)節(jié)。是登錄接口慢了還是商品詳情頁(yè)的圖片服務(wù)器出了問(wèn)題一目了然。2.2 關(guān)鍵監(jiān)控指標(biāo)與業(yè)務(wù)意義Zabbix Web監(jiān)控會(huì)產(chǎn)出幾個(gè)核心指標(biāo)每個(gè)都對(duì)應(yīng)著不同的業(yè)務(wù)含義下載速度bps反映網(wǎng)絡(luò)質(zhì)量和服務(wù)器帶寬。如果速度遠(yuǎn)低于預(yù)期可能是網(wǎng)絡(luò)鏈路擁塞或服務(wù)器負(fù)載過(guò)高。響應(yīng)時(shí)間Response Time從發(fā)送請(qǐng)求到接收到第一個(gè)字節(jié)的時(shí)間。這主要反映服務(wù)器應(yīng)用的處理能力。數(shù)據(jù)庫(kù)查詢(xún)慢、代碼邏輯復(fù)雜、緩存失效都會(huì)導(dǎo)致這里飆升。連接時(shí)間Connect Time建立TCP連接的時(shí)間。如果這個(gè)時(shí)間很長(zhǎng)可能意味著DNS解析慢、網(wǎng)絡(luò)延遲高、或者服務(wù)器連接池已滿(mǎn)。總加載時(shí)間Total Loading Time整個(gè)場(chǎng)景或單一步驟完成的總時(shí)間。這是最貼近用戶(hù)體驗(yàn)的指標(biāo)。響應(yīng)代碼Response CodeHTTP狀態(tài)碼。非200系列如404、500、502直接告警。字符串校驗(yàn)Required String檢查返回內(nèi)容是否包含特定字符串。這是業(yè)務(wù)正確性監(jiān)控的利器。比如監(jiān)控支付成功頁(yè)面是否包含“支付成功”字樣如果返回的是錯(cuò)誤信息即使?fàn)顟B(tài)碼是200也能觸發(fā)告警。理解了這些你的監(jiān)控就從“技術(shù)健康度”上升到了“業(yè)務(wù)健康度”層面。3. 實(shí)操配置手把手創(chuàng)建一個(gè)Web監(jiān)控場(chǎng)景光說(shuō)不練假把式我們直接進(jìn)入Zabbix前端界面進(jìn)行配置。假設(shè)我們要監(jiān)控一個(gè)外部博客網(wǎng)站https://example-blog.com的訪(fǎng)問(wèn)體驗(yàn)。3.1 創(chuàng)建主機(jī)與監(jiān)控項(xiàng)首先我們需要一個(gè)“掛載”Web場(chǎng)景的載體。雖然Web場(chǎng)景本身不依賴(lài)于特定代理但為了管理方便我們通常創(chuàng)建一個(gè)“虛擬主機(jī)”或使用一個(gè)現(xiàn)有的Zabbix代理主機(jī)來(lái)關(guān)聯(lián)它。登錄Zabbix前端進(jìn)入“配置” - “主機(jī)”。創(chuàng)建主機(jī)點(diǎn)擊“創(chuàng)建主機(jī)”。主機(jī)名稱(chēng)可以定義為WebMonitor_ExampleBlog可見(jiàn)名稱(chēng)寫(xiě)清楚用途。這里有個(gè)關(guān)鍵點(diǎn)“群組”可以選擇像“Web Services”或自建的“網(wǎng)站監(jiān)控”組便于分類(lèi)管理?!癐nterfaces”部分由于是監(jiān)控外部網(wǎng)站不需要添加任何代理或SNMP接口保持空白即可。點(diǎn)擊“添加”。注意很多新手會(huì)在這里糾結(jié)要不要填I(lǐng)P、加代理。對(duì)于純外部HTTP/HTTPS監(jiān)控Zabbix Server會(huì)直接發(fā)起請(qǐng)求不需要通過(guò)代理。這個(gè)主機(jī)對(duì)象只是一個(gè)邏輯容器。創(chuàng)建Web場(chǎng)景在剛創(chuàng)建的主機(jī)頁(yè)面切換到“Web場(chǎng)景”標(biāo)簽頁(yè)點(diǎn)擊“創(chuàng)建Web場(chǎng)景”。名稱(chēng)博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn)客戶(hù)端選擇“Zabbix”。這是指模擬的瀏覽器類(lèi)型對(duì)現(xiàn)代網(wǎng)站影響不大。更新間隔設(shè)為1m每分鐘檢查一次。對(duì)于核心業(yè)務(wù)可以更短如30s但注意不要對(duì)目標(biāo)網(wǎng)站造成壓力。嘗試次數(shù)3。如果第一次失敗會(huì)重試2次3次都失敗才標(biāo)記為問(wèn)題避免網(wǎng)絡(luò)抖動(dòng)誤報(bào)。代理如果你的Zabbix Server無(wú)法直接訪(fǎng)問(wèn)目標(biāo)網(wǎng)站如監(jiān)控內(nèi)網(wǎng)環(huán)境這里可以配置HTTP代理。否則留空。3.2 設(shè)計(jì)監(jiān)控步驟Steps這是Web監(jiān)控的精華所在。點(diǎn)擊“步驟”標(biāo)簽頁(yè)然后“添加”。步驟1訪(fǎng)問(wèn)首頁(yè)名稱(chēng)打開(kāi)博客首頁(yè)URLhttps://example-blog.com必要狀態(tài)代碼200超時(shí)15s。根據(jù)網(wǎng)站正常響應(yīng)時(shí)間設(shè)置一般15-30秒。需要字符串這里我們假設(shè)該博客首頁(yè)標(biāo)題包含“技術(shù)分享”。我們可以填寫(xiě)技術(shù)分享。如果返回的HTML里沒(méi)有這幾個(gè)字這一步就會(huì)失敗。變量這一步我們先不設(shè)置高級(jí)用法里會(huì)講。步驟2檢查關(guān)鍵文章可選演示多步驟名稱(chēng)檢查最新文章列表URLhttps://example-blog.com/articles必要狀態(tài)代碼200需要字符串最新發(fā)布檢查文章列表模塊是否正常加載。配置好后保存Web場(chǎng)景。Zabbix會(huì)立即開(kāi)始執(zhí)行第一次檢查。3.3 配置觸發(fā)器與圖形監(jiān)控?cái)?shù)據(jù)有了我們需要告警和可視化。創(chuàng)建觸發(fā)器在主機(jī)頁(yè)面進(jìn)入“觸發(fā)器”標(biāo)簽頁(yè)點(diǎn)擊“創(chuàng)建觸發(fā)器”。名稱(chēng)博客網(wǎng)站訪(fǎng)問(wèn)異常表達(dá)式點(diǎn)擊“添加”選擇監(jiān)控項(xiàng)。這里不是直接選而是通過(guò)“監(jiān)控項(xiàng)”標(biāo)簽找到我們剛創(chuàng)建的Web場(chǎng)景產(chǎn)生的監(jiān)控項(xiàng)。通常名稱(chēng)是“Web場(chǎng)景[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn)]下載速度”或“... 響應(yīng)時(shí)間”。我們選擇“... 失敗步驟”這個(gè)監(jiān)控項(xiàng)。表達(dá)式可以設(shè)為{WebMonitor_ExampleBlog:web.test.fail[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn)].last()} 0這個(gè)表達(dá)式的意思是如果最后一個(gè)檢查周期內(nèi)有任何步驟失敗則觸發(fā)告警。嚴(yán)重性設(shè)置為“災(zāi)難”或“嚴(yán)重”。你還可以為響應(yīng)時(shí)間創(chuàng)建觸發(fā)器例如{WebMonitor_ExampleBlog:web.test.time[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn), 打開(kāi)博客首頁(yè)].avg(5m)} 5000表示“打開(kāi)博客首頁(yè)”這一步最近5分鐘的平均響應(yīng)時(shí)間如果超過(guò)5秒5000毫秒就告警。創(chuàng)建圖形在“監(jiān)測(cè)” - “主機(jī)” - 選擇你的主機(jī) - “圖形”中可以創(chuàng)建圖形來(lái)可視化監(jiān)控?cái)?shù)據(jù)。添加“Web場(chǎng)景[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn)]的響應(yīng)時(shí)間”和“下載速度”等監(jiān)控項(xiàng)就能看到一個(gè)漂亮的趨勢(shì)圖直觀(guān)反映網(wǎng)站性能變化。4. 高級(jí)技巧與深度優(yōu)化基礎(chǔ)配置只能解決“有無(wú)”問(wèn)題要想讓監(jiān)控真正智能、高效還得靠一些進(jìn)階玩法。4.1 使用變量實(shí)現(xiàn)動(dòng)態(tài)監(jiān)控上面的例子URL是寫(xiě)死的。但如果我們需要監(jiān)控帶會(huì)話(huà)Session或需要登錄的頁(yè)面怎么辦Zabbix Web場(chǎng)景支持變量。提取變量在第一個(gè)步驟比如登錄的“變量”標(biāo)簽頁(yè)可以添加一個(gè)變量。例如你登錄后服務(wù)器返回一個(gè)Set-Cookie: sessionidabc123。你可以添加一個(gè)變量名稱(chēng)SESSIONID值類(lèi)型正則表達(dá)式匹配內(nèi)容Set-Cookie: sessionid([^;])輸出格式\1這樣Zabbix就能從響應(yīng)頭中提取出abc123并存入變量{SESSIONID}。使用變量在后續(xù)步驟的URL或請(qǐng)求頭中就可以使用這個(gè)變量。例如第二步訪(fǎng)問(wèn)個(gè)人中心的URL可以寫(xiě)成https://example.com/dashboard?session{SESSIONID}或者在“請(qǐng)求頭”中添加Cookie: sessionid{SESSIONID}。4.2 監(jiān)控HTTPS與SSL證書(shū)對(duì)于HTTPS網(wǎng)站證書(shū)過(guò)期是重大事故。Zabbix可以通過(guò)低級(jí)自動(dòng)發(fā)現(xiàn)LLD或外部腳本來(lái)監(jiān)控但更簡(jiǎn)單直接的方法是使用web.page.get或web.page.perf監(jiān)控項(xiàng)。不過(guò)更專(zhuān)業(yè)的做法是使用Zabbix Agent 2推薦或自定義腳本。以Agent 2為例它在被監(jiān)控服務(wù)器上運(yùn)行可以添加如下監(jiān)控項(xiàng)鍵值tls.certificate.get[example-blog.com, 443]信息類(lèi)型文本 然后通過(guò)觸發(fā)器判斷返回的證書(shū)過(guò)期時(shí)間nodata()、str()、regexp()函數(shù)組合是否在多少天內(nèi)。注意這需要Zabbix Agent 2能訪(fǎng)問(wèn)到目標(biāo)域名和端口。對(duì)于外部網(wǎng)站如果Zabbix Server無(wú)法運(yùn)行Agent可以編寫(xiě)一個(gè)Python腳本使用openssl命令或cryptography庫(kù)獲取證書(shū)信息然后通過(guò)Zabbix Trapperzabbix_sender方式發(fā)送給Server。這是更靈活的方案。4.3 性能基準(zhǔn)與告警優(yōu)化不要一上來(lái)就設(shè)置嚴(yán)格的閾值。建議觀(guān)察期新建Web場(chǎng)景后先不配置嚴(yán)格的響應(yīng)時(shí)間觸發(fā)器觀(guān)察1-2天了解網(wǎng)站在不同時(shí)段白天/夜晚、工作日/周末的正常性能基線(xiàn)。動(dòng)態(tài)基線(xiàn)告警Zabbix支持基于歷史數(shù)據(jù)的“基線(xiàn)告警”。你可以使用avg()、percentile()等函數(shù)。例如觸發(fā)器表達(dá)式可以寫(xiě)為{WebMonitor_ExampleBlog:web.test.time[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn), 打開(kāi)博客首頁(yè)].last()} {WebMonitor_ExampleBlog:web.test.time[博客首頁(yè)訪(fǎng)問(wèn)與內(nèi)容校驗(yàn), 打開(kāi)博客首頁(yè)].avg(1w)} * 1.5意思是如果本次響應(yīng)時(shí)間超過(guò)了最近一周平均響應(yīng)時(shí)間的1.5倍則告警。這比固定閾值如5秒更智能能適應(yīng)業(yè)務(wù)的自然波動(dòng)。多步驟依賴(lài)告警如果第一步“登錄”就失敗了那么后續(xù)檢查個(gè)人中心、下單等步驟的失敗告警可能會(huì)產(chǎn)生“告警風(fēng)暴”??梢栽诤罄m(xù)步驟的觸發(fā)器上添加依賴(lài)條件或者使用“事件關(guān)聯(lián)”功能來(lái)抑制冗余告警。5. 常見(jiàn)問(wèn)題排查與實(shí)戰(zhàn)心得配置過(guò)程中和運(yùn)行后肯定會(huì)遇到各種問(wèn)題。我把最常見(jiàn)的一些坑和解決辦法整理如下。5.1 Web場(chǎng)景狀態(tài)為“未知”或“不支持”問(wèn)題創(chuàng)建Web場(chǎng)景后在“監(jiān)測(cè)”-“最新數(shù)據(jù)”里看不到數(shù)據(jù)或者狀態(tài)一直是“未知”。排查檢查Zabbix Server配置確認(rèn)zabbix_server.conf中StartPollers和StartHTTPPollers的值不是0。StartHTTPPollers是專(zhuān)門(mén)用于Web監(jiān)控的進(jìn)程建議根據(jù)監(jiān)控的Web場(chǎng)景數(shù)量適當(dāng)調(diào)大如5-10。查看服務(wù)器日志tail -f /var/log/zabbix/zabbix_server.log路徑可能不同搜索你的Web場(chǎng)景名稱(chēng)或“web monitoring”關(guān)鍵詞看是否有錯(cuò)誤信息。常見(jiàn)錯(cuò)誤有DNS解析失敗、SSL證書(shū)驗(yàn)證錯(cuò)誤可嘗試在Web場(chǎng)景高級(jí)設(shè)置中關(guān)閉“驗(yàn)證主機(jī)名”、連接超時(shí)。手動(dòng)測(cè)試在Zabbix Server主機(jī)上用curl命令模擬請(qǐng)求curl -v -L --max-time 15 https://example-blog.com。觀(guān)察是否能正常訪(fǎng)問(wèn)耗時(shí)多少。這能快速定位是網(wǎng)絡(luò)問(wèn)題、目標(biāo)問(wèn)題還是Zabbix配置問(wèn)題。5.2 監(jiān)控項(xiàng)數(shù)據(jù)更新延遲或不準(zhǔn)確問(wèn)題數(shù)據(jù)有更新但感覺(jué)延遲很大或者響應(yīng)時(shí)間數(shù)據(jù)為0。排查更新間隔檢查Web場(chǎng)景和監(jiān)控項(xiàng)的更新間隔。如果設(shè)為1m但數(shù)據(jù)倉(cāng)庫(kù)趨勢(shì)存儲(chǔ)周期是1h那么在圖形上看到的變化就會(huì)很平緩。確保更新間隔符合你的監(jiān)控粒度需求。響應(yīng)時(shí)間為0這通常發(fā)生在步驟非常簡(jiǎn)單、服務(wù)器響應(yīng)極快的情況下。Zabbix的計(jì)時(shí)精度是毫秒如果整個(gè)步驟在1毫秒內(nèi)完成可能會(huì)記錄為0。這本身不是問(wèn)題說(shuō)明網(wǎng)站性能極佳。如果懷疑是錯(cuò)誤可以嘗試在步驟中添加一個(gè)無(wú)意義的查詢(xún)參數(shù)如?t來(lái)增加一點(diǎn)微不足道的處理時(shí)間或者監(jiān)控一個(gè)稍復(fù)雜的接口。檢查步驟超時(shí)如果某個(gè)步驟因?yàn)榫W(wǎng)絡(luò)慢經(jīng)常超時(shí)那么這一步的響應(yīng)時(shí)間數(shù)據(jù)就是缺失的。適當(dāng)調(diào)大超時(shí)時(shí)間或者優(yōu)化網(wǎng)絡(luò)鏈路。5.3 字符串校驗(yàn)Required String失敗問(wèn)題頁(yè)面能打開(kāi)狀態(tài)碼200但Zabbix報(bào)告“需要字符串未找到”。排查編碼問(wèn)題確保你輸入的校驗(yàn)字符串的編碼與網(wǎng)頁(yè)編碼一致通常是UTF-8。如果網(wǎng)頁(yè)是GBK而你在Zabbix里輸入了UTF-8的中文字符就會(huì)匹配失敗。一個(gè)技巧是先用瀏覽器查看網(wǎng)頁(yè)源碼直接從源碼里復(fù)制你要檢查的那段文字。動(dòng)態(tài)內(nèi)容如果頁(yè)面內(nèi)容是JavaScript動(dòng)態(tài)加載的如Vue、React單頁(yè)應(yīng)用Zabbix模擬的簡(jiǎn)單HTTP GET請(qǐng)求獲取到的只是初始HTML骨架看不到動(dòng)態(tài)渲染的內(nèi)容。Zabbix的Web監(jiān)控?zé)o法執(zhí)行JavaScript。對(duì)于這種現(xiàn)代Web應(yīng)用你需要監(jiān)控其提供數(shù)據(jù)的后端API接口而不是前端頁(yè)面本身??崭衽c換行從網(wǎng)頁(yè)復(fù)制字符串時(shí)可能會(huì)包含不可見(jiàn)的換行符或多余空格。在Zabbix輸入框里仔細(xì)核對(duì)或者使用更寬松的正則表達(dá)式來(lái)匹配例如使用.*技術(shù)分享.*來(lái)匹配包含“技術(shù)分享”的任何文本。5.4 關(guān)于Docker部署Zabbix的特別提醒很多朋友現(xiàn)在用Docker或Docker Compose部署Zabbix這很方便但做外部Web監(jiān)控時(shí)有一個(gè)大坑容器內(nèi)的Zabbix Server可能無(wú)法解析外部的DNS或者其出站網(wǎng)絡(luò)受到限制。癥狀監(jiān)控內(nèi)部網(wǎng)絡(luò)服務(wù)正常但監(jiān)控公網(wǎng)網(wǎng)站一直失敗。解決進(jìn)入Zabbix Server容器docker exec -it zabbix-server /bin/bash。嘗試ping example-blog.com和curl -v https://example-blog.com。如果失敗說(shuō)明容器網(wǎng)絡(luò)配置有問(wèn)題。檢查Docker容器的DNS配置。在運(yùn)行容器時(shí)可以添加--dns 8.8.8.8參數(shù)指定DNS服務(wù)器。對(duì)于Docker Compose可以在服務(wù)定義中添加services: zabbix-server: image: zabbix/zabbix-server-mysql:latest dns: - 8.8.8.8 - 114.114.114.114確保容器的網(wǎng)絡(luò)模式如bridge允許訪(fǎng)問(wèn)外網(wǎng)。最簡(jiǎn)單的方法是使用host網(wǎng)絡(luò)模式network_mode: host但會(huì)犧牲一些隔離性。Web監(jiān)控是Zabbix從運(yùn)維工具邁向業(yè)務(wù)保障工具的關(guān)鍵一步。它提供的視角是服務(wù)器指標(biāo)無(wú)法替代的。剛開(kāi)始配置可能會(huì)覺(jué)得步驟繁瑣但一旦跑起來(lái)形成了穩(wěn)定的監(jiān)控基線(xiàn)它就會(huì)成為你發(fā)現(xiàn)線(xiàn)上問(wèn)題的第一雙眼睛。尤其是將Web場(chǎng)景的響應(yīng)時(shí)間與服務(wù)器的CPU、數(shù)據(jù)庫(kù)的慢查詢(xún)等指標(biāo)關(guān)聯(lián)起來(lái)分析能讓你快速定位復(fù)雜問(wèn)題的根因。別怕麻煩把核心業(yè)務(wù)的幾個(gè)關(guān)鍵用戶(hù)路徑都配置上你會(huì)發(fā)現(xiàn)你對(duì)系統(tǒng)穩(wěn)定性的信心會(huì)大大增強(qiáng)。