最近在需求的驅動下,認真研究了一下F5的http monitor的處理機制。從F5的技術白皮書上初略了解到:http monitor可以通過檢測某個服務目錄,進而從得到的結果中比對相關的字元串。
比如下面的monitor:
b monitor http_mo1 list
monitor http_mo1 {
defaults from http
recv "nameof"
send "GET /services/message/message.html”
}
F5去GET /services/message/message.html這個頁面,然後用"nameof"去比對這個頁面的内容,如果能查到就說明檢測成功;否則失敗。
而後續配置多個不同的系統的http monitor時,進行同樣的配置(僅僅修改服務目錄和recv的字串)下,發現有些monitor竟然比對不到字元串,進而導緻健康檢查失敗。但是直接使用浏覽器浏覽該頁面時是能查找到相關的字元串的。monitor配置如下:
monitor http_mo2 {
recv "targetName"
send "GET /services/conf/message/message.html”
而後使用在F5的CLI上使用如下指令進行檢測:echo -e "GET /services/message/message.html HTTP/1.1\r\nConnection: Close\r\nHost: \r\n\r\n" | nc 1.1.1.1 80;其中1.1.1.1 80是需要監控的位址和服務端口。echo出來的内容如下:
echo -e "GET /services/conf/message/message.html HTTP/1.1\r\nConnection: Close\r\nHost: \r\n\r\n" | nc 1.1.1.1 80 | less
HTTP/1.1 200 OK
Content-Type: text/xml; charset=iso-8859-1
Connection: close
Server: Jetty(6.1.5)
<?xml version="1.0" encoding="UTF-8"?>
&lt;wsdl:definitions targetNamespace=
可以看出targetName從應該能比對到的。後來看了一些文檔說有可能是HTTP的版本問題,因為F5預設是使用HTTP/1.0去GET的,但是目前基本上都是使用HTTP/1.1的。是以在GET中加入了HTTP的版本。即如下:
send "GET /services/conf/message/message.html HTTP/1.1\r\n”
但是這樣的GET還不夠嚴謹,我後續測試也是有檢測不到的現象。後來直接将上面echo指令中的HTTP/1.1\r\nConnection: Close\r\nHost: \r\n\r\n全部加進去就檢測ok了。不能不加Host: \r\n\r\n,否則也有檢測不到關鍵字的情況。
總結:做F5的http的monitor時需要關注GET的格式,即服務目錄後面要添加”HTTP/1.1\r\nConnection: Close\r\nHost: \r\n\r\n“。否則有可能監控失敗,具體為什麼必須添加這些目前不清楚。
注意:
本文轉自 chris_lee 51CTO部落格,原文連結:http://blog.51cto.com/ipneter/221652,如需轉載請自行聯系原作者