Google 标签: http monitor, f5, GET
最近在需求的驱动下,认真研究了一下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 {
   defaults from http
   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的版本。即如下:
monitor http_mo2 {
   defaults from http
   recv "targetName"
   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“。否则有可能监控失败,具体为什么必须添加这些目前不清楚。

注意:
①,F5只能针对url进行grep来进行检查,不能进行http_states的检测;
②,匹配字不能与文件名一致或者是文件名的一部分。否则,即使服务器上没有改文件,也会标示为up。这是因为仅仅是从GET命令后得出的结果中去grep,那肯定会有该匹配字了。所以需要确认匹配字只能出现在该文件中的内容。