目前,对web服务的监控,主要有nagios插件check_http,以及第三方软件webinject。
check_http可以完成常规的web服务检查。
如:
A、页面请求的响应时间是否符合要求(相关选项:-t ,-w,-c )
B、页面请求响应是否正确(相关选项为:-e 。常用的选项值为200,301或者302)
C、URL的检查(相关选项为:-H,-I,-u)
D、页面大小是否符合期待值(相关选项为:-m)
它的具体使用方法,可以查看它的帮助:
$ sudo ./check_http -h
Usage: check_http -H | -I [-u ] [-p ]
[-w ] [-c ] [-t ] [-L]
[-a auth] [-f ] [-e ]
[-s string] [-l] [-r | -R ]
[-P string] [-m :] [-4|-6] [-N]
[-M ] [-A string] [-k string]
NOTE: One or both of -H and -I must be specified
帮助里有各个选项的详细说明,这里省略了。
在nagios里配置service前,一般先在命令行下进行测试:
$ sudo ./check_http -H cn.yahoo.com -u / -w 10 -c 20 -t 30
HTTP OK HTTP/1.1 200 OK - 77530 bytes in 0.021 seconds |time=0.021011s;10.000000;20.000000;0.000000 size=77530B;;;0
补充说明:
-H cn.yahoo.com 和 -u / 表示检查的URL是: http://cn.yahoo.com/ ;
-w 10 表示超过10s响应则发出warning报警;
-c 20 表示超过20s响应则发出critical报警;
-t 30 表示超过30s响应则发出timeout报警;
通过命令行得到的测试结果,你知道了:该URL响应的HTTP信息是200,页面大小为77530 bytes 。
常用的HTTP响应信息如下:
200 OK:一切正常,对GET和POST请求的应答文档跟在后面。
301 Moved Permanently:客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found:类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
404 Not Found:无法找到指定位置的资源。
500 Internal Server Error:服务器遇到了意料不到的情况,不能完成客户的请求。
其他HTTP信息表示的含义请查阅相关文档。
命令行测试获取到以上信息后,在nagios里定义监控任务:
#定义host:
define host {
use colo-vhost-domains
host_name cn.yahoo.com
alias cn.yahoo.com
address cn.yahoo.com
}
#定义contact和contactgroup:
define contact {
use base-web-contact
contact_name web-L1-mail
alias web-L1-mail
host_notification_options n
service_notification_options w,u,c,r,f
email [email protected]
register 1 ; 0 = disable, 1 = enable
}
define contactgroup {
contactgroup_name web-L1
alias web-L1
members web-L1-mail
}
#定义服务检查的command(这里的ARG[1,2,3...]表示命令的参数,在service的定义中用“!”顺序隔开各个参数):
define command {
command_name check_http_vhost_url_200_OK
command_line $USER1$/check_http -H $ARG4$ -w $ARG1$ -c $ARG2$ -m $ARG3$ -I $HOSTADDRESS$ -t 30 -e 200 -u '$ARG5$'
}
#最后定义service:
define service {
use base-http-ycn
service_description cn_homepage
host_name cn.yahoo.com
servicegroups ycn_check_url_ok
contact_groups web-L1
check_command check_http_vhost_url_200_OK!10!20!70000!cn.yahoo.com!/
register 1
}
这里定义的service,在命令行对应的检查命令为:
$sudo ./check_http -H cn.yahoo.com -w 10 -c 20 -m 70000 -I cn.yahoo.com -t 30 -e 200 -u /
即:http://cn.yahoo.com/ 页面响应应为200,页面大小不小于70K;
超过10s才响应时为warning,超过20s才响应时为critical,超过30s则为timeout;
报警时,通知 web-L1这个组的联系人。
整合webinject,增强web服务监控。
webinject是一个用perl语言写的第三方工具,其官方网站为 http://www.webinject.org/ 。
下载解压后即可使用。如果报错,请确认你的系统的perl环境是否满足webinject的要求。
webinject可以模拟用户的 交互行为 来检测你提供的web服务是否正常。
它的大概工作原理是模拟用户 get/post 一个URL,服务器处理后返回一个页面结果,webinject检查这个页面中
是否包含某个特定的字符串,来说明服务的响应是否是正确的。
注意:就目前来说,webinject不支持 中文字符串 作为关键字来检查!
目前,主要应用它来检测(mail,mybox,myweb,photo)登陆服务和(web,music,news...)搜索服务是否正常。
在命令行下,webinject的使用,主要包含以下三个文件:
webinject.pl -- perl语言写的检查程序,系统的perl环境需满足它的要求
config.xml -- 主配置文件,定义的一些全局参数
testcase.xml -- 检查步骤的xml文件(此文件名可任意,这里假定为testcase.xml)
其中,最关键的是 testcase.xml 这个文件。
它将用户的动作设计成一个一个步骤,然后检查服务器的响应是否是期望的结果。
因此,它的设计,将直接影响到检测结果的有效性和准确性。
日常的维护,也是维护这个文件。
命令行下的使用,一般为:
$sudo ./webinject.pl --config=config.xml testcase.xml
或者:$sudo ./webinject.pl -c config.xml testcase.xml
下面来说明webinject和nagios整合的一般使用过程:
A、首先,将主配置文件 config.xml 配置成跟nagios整合的方式。
$ cat ./config.xml <testcasefile>zjwtest.xml</testcasefile> <globalhttplog>onfail</globalhttplog> <useragent>WebInject Application Tester</useragent> <timeout>10</timeout> <globaltimeout>20</globaltimeout> <reporttype>nagios</reporttype>
注意reporttype是nagios。
这样就表示webinject会将它的检测结果报告给nagios,由nagios来展现它的检查结果。
另外,这里还指定了默认的testcase文件是 zjwtest.xml 。
即当你不指定testcase文件时,它会使用此文件来做检测。当然,你也可以指定真正的testcase文件。
B、设计testcase文件,根据用户的动作来模拟出各个步骤
以P4P的一个testcase文件为案例来说明。
$ cat oldp4pagent.xml <testcases repeat="1"> <case id="1" description1="old p4p agent" description2="old p4p agent" method="get" url="http://agent.p4p.cn.yahoo.com/" parseresponse='skey" value="|"' parseresponse1='encrypted" value="|"' verifypositive="loginsys" errormessage="Fail to open old p4p agent page" /> <case id="2" description1="Old p4p agent" description2="home page" method="post" url="https://bssauth.3721.yahoo.com/loginverify.php" postbody="skey={PARSEDRESULT}&encrypted={PARSEDRESULT1}&loginsys=agent&username=abcde&encrypt=&password=p4pwjj&word=1234&ok=%B5%C7+%C2%BC" verifypositive="frame.htm" errormessage="Login fail" /> <case id="3" description1="Old p4p agent" description2="Job Sheet" method="get" url="http://agent.p4p.cn.yahoo.com/tts/index.php?type=2" verifypositive="test for new mysql" errormessage="Job Sheet" /> </testcases>
说明:
id=1,2,3... -- 标识是第几个步骤
在 case 1 中,模拟用户去get:http://agent.p4p.cn.yahoo.com/ 。然后检查返回的结果中是否包含“loginsys”这个字符串。
如果包含,则说明检测是 Passed 的,也就是用户正常打开了这个页面;否则说明用户打开页面失败。
在 case 2 中,模拟用户提交登陆信息。然后检查服务器处理后返回的结果中是否包含“frame.htm”这个字符串。
如果包含,说明用户提交的登陆信息是正确的,即登陆成功,转向登陆后的一个页面。
在 case 3中,模拟用户get:http://agent.p4p.cn.yahoo.com/tts/index.php?type=2 。检查返回结果中是否包含“test for new mysql”。
验证用户登陆成功后,用户已进入相应的页面,该页面包含“test for new mysql”这个字符串。
C、在nagios中定义监控任务
#定义host
define host {
use cnb-host
host_name agent.p4p.cn.yahoo.com
alias agent.p4p.cn.yahoo.com
address agent.p4p.cn.yahoo.com
}
#定义contact和contactgroup
define contact {
use base-contact
contact_name p4p-L1-mail
alias p4p-L1-mail
host_notification_options n
service_notification_options w,u,c,r,f
email [email protected] [email protected]
register 1 ; 0 = disable, 1 = enable
}
define contactgroup {
contactgroup_name p4p-L1
alias p4p common
members p4p-L1-mail
}
#定义command
define command {
command_name webinject
command_line /home/y/conf/nagios/webinject/webinject.pl -c $ARG1$ $ARG2$
}
#定义service
define service {
use base-http-ycn
service_description p4p_agent
host_name agent.p4p.cn.yahoo.com
servicegroups http
contact_groups p4p-L1
check_command webinject!config.xml!oldp4pagent.xml
register 1 ; 0 = disable, 1 = enable
}
这样,一个模拟用户登陆的监控服务就配置完了。
对应地,命令行下的检测命令为:
$sudo ./webinject.pl -c config.xml oldp4pagent.xml
搜索结果返回页的监控相对简单。
$ cat ./search_myweb_cn.xml <testcases repeat="1"> <case id="1" description1="search_myweb_cn" description2="search_myweb_cn" method="get" url="http://myweb.cn.yahoo.com/search.html?showp=%E5%91%A8%E6%9D%B0%E4%BC%A6&p=%E5%91%A8%E6%9D%B0%E4%BC%A6" verifypositive="addp.html\?method=save&ou=" /> </testcases>
日常的维护,主要是根据app ops的调整,修改url的相关参数,和verifypositive的关键字。
关键字选择的原则:
一是有代表性,能说明页面的性质是正常的还是不正常的。
二是相对固定,也就是关键字最好相对固定,不经常改动。
关键字一般由app ops提供。如果你对页面代码有足够了解,并且熟悉页面的内容特点,你也可以自己选择。