天天看點

F5的HTTP monitor機制

最近在需求的驅動下,認真研究了一下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"?> 

<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,如需轉載請自行聯系原作者