场景之一:
基本架构:
网站是由多台Squid服务器做集群组成,客户端口访问网站的过程是:
客户端向Web站点发出请求,请求某一URL资源;
本地解析服务器域名的IP地址,由于DNS做了视图和对IP的轮循负载,会根据所在地域,获得一组,离自己比较近的Squid服务器地址;
如果Squid自己没有缓存该资源,会向后端的源服务器询问,并返回给客户端。
问题:
某一时间段,有网站的用户向公司客服反映反映网站不能正常打开,但是客服测试是正常的。
定位:
常规的方法是本地修改hosts文件,然后通过浏览器去访问站点,检查是否能正常访问,如果不能正常访问返回的错误页面是什么。
由于不同地域的用户,来源IP是不同的,如果按常规做法,我们需要登录,各个地域的测试机,而后,修改所有的配置文件,一个IP,一个IP的测试。好像挺费力。
我的思路:
使用curl 测试Squid服务器,只要通过curl向Squid集群中的指定IP发送HTTP请求,指定正确的Host,就会准确地测试出URL资源访问是否正常。
例如:
我们需要测试www.gyyx.cn网站的/stage/News/NewsContent.aspx?NewsID=310这个资源,我们可以这样做。
- [root@squid01 ~]# curl -s -H "Host:www.gyyx.cn" -I \
- 'http://x.x.x.x/stage/News/NewsContent.aspx?NewsID=310' HTTP/1.0 200 OK
- Server: nginx/x.x.x
- Date: Sun, 13 Mar 2011 13:00:12 GMT
- Content-Type: text/html; charset=utf-8
- X-Powered-By: ASP.NET
- X-AspNet-Version: x.x.x.x
- Cache-Control: private
- Content-Length: 13622
- X-Cache: MISS from webcache
- X-Cache-Lookup: MISS from webcache:80
- Via: 1.0 webcache:80 (squid/2.6.STABLE10)
- Connection: close
不过这样一台一台的测试未免还是有些太慢。
写个脚本来实现同样的功能,您可以通过后面的链接下载到最新的脚本:
- #!/bin/bash
- # Custer Web Servers Live Test
- # 可以用来测试网站集群的前端服务器
- # Based host and curl
- # 2011-03-12 23:35:11
- # 2011-03-13 17:01:56 Version 0.2 需要修正
- # wangxiaoyu#live.com
- # dig +nocomments -t A www.gyyx.cn |grep -v "^;"|grep -v '^$'|grep -v 'CNAME' |awk '{print $NF}'
- function Usage(){
- echo -e "Usage:\t$0 DomainName [URL]"
- echo -e "eg:\t$0 www.gyyx.cn '/stage/News/NewsContent.aspx?NewsID=310'"
- echo -e "\t$0 www.gyyx.cn"
- echo -e '实现功能:
- \t支持域名访问及URL地址的检测
- \t支持显示机房信息
- \t支持显示测试点机房信息
- \t支持显示网站连接延时,但不包括域名解析的时间
- \t支持友好的帮助信息
- \t暂不支持批量测试和记日志功能
- \t需要测试点为Linux,且正确安装了 host elinks curl 软件
- \t暂时只能检查监听在80端口网站的检测:
- '
- echo -e "友情提示:"
- RETVAL=$1
- case $RETVAL in
- 1)
- echo -e "\t请输入使用网站服务器实际访问的域名\n\t如: www.gyyx.cn"
- ;;
- 2)
- echo -e "\t所给定的域名:$HOST,无法被正常解析\n\t请确认是否拼写错误,或解析就有误"
- ;;
- 3)
- echo -e "\t所给定的域名:$HOST,通过host命令未解析到IP\n\t请确认该域名是不是正常访问网站的域名"
- ;;
- 4)
- echo -e "\t请确认您的主机上安装了 $2 软件,因为脚本某些功能会用到"
- ;;
- *)
- ;;
- esac
- exit $RETVAL
- }
- ## 容错
- [ $# -lt 1 ] && Usage 1
- ## HOST
- HOST=$1
- ## 容错
- host $HOST >/dev/null || Usage 2
- ## 容错
- which host >/dev/null || Usage 4 'host'
- which elinks >/dev/null || Usage 4 'elinks'
- which curl >/dev/null || Usage 4 'curl'
- ## 获取Squid服务器的地址
- typeset -a IPs
- IPs=($(host $HOST |grep -v '\.$'|sort -n |awk 'BEGIN{ORS=" "}{print $NF}'))
- ## 默认curl访问返回HTTP 状态码为200,则认为服务器存活
- ## 如果是其它代码则认为是访问失败,并记录日志
- ## 容错
- [ ${#IPs[*]} -eq 0 ] && Usage 3
- ## URL
- URL=$2
- ## LOGFILE=$0.log
- ## 测试点信息
- MyIP=$(elinks --dump http://checkip.dyndns.org/ |awk -F: '{print $NF}'|sed 's/^[ ]//g')
- echo -e "本地出口地址: $MyIP"
- ## 国外的ISP信息代码
- ##MyISP="$(elinks --dump "http://www.ip-adress.com/" |awk -F: '/ISP of my IP:/{print $NF}'|sed 's/^[ ]//g')"
- ## 另一个版本的ISP信息代码
- MyISP=$(elinks --dump "http://tool.chinaz.com/IP/?IP=$MyIP" |sed -ne '/查询结果/{n;p}'|sed -n 's/^[ ]*//gp')
- echo -e "归属ISP 信息: $MyISP"
- ## 测试,并打印过程
- echo -e "Web 网站域名: $HOST"
- echo -e "解析得到的IP: ${#IPs[*]} 个IP地址\n"
- echo -e "开始测试 ......\n"
- printf "%-25s%-20s%-20s%-30s\n" 'IP Address' 'HTTP Code' 'Time Connect(ms)' 'ISP Information'
- ## 测试代码
- typeset -a RESPONSE
- for IP in ${IPs[*]}
- do
- RESPONSE=($(curl -s -connect-timeout 5 --max-time 10 -H "Host:$HOST" -o /dev/null -I -w '%{http_code} %{time_connect}' $IP$URL))
- ISP=$(elinks --dump "http://tool.chinaz.com/IP/?IP=$IP" |sed -ne '/查询结果/{n;p}'|sed -n 's/^[ ]*//gp')
- if [ ${RESPONSE[0]} -nq 0 ] ;then ##这部分需要修正
- printf "%-25s%-20s%-20s%-30s\n" $IP ${RESPONSE[*]}ms "$ISP"
- else
- printf "%s-25%s-20s%-20%-30s\n" $IP '超时' "$ISP" ##这部分也需要改
- fi
- done
- echo -e "\n测试结束!\n"
这样我们就可认,把这些脚本上传到测试点,需要测试的时候,我们可以执行一遍,简单查看一下Squid的访问是否正常。需要注意的是我们需要小心地查看返回的HTTP响应码,并且比较保守的办法,是多次curl测试。姑且就抛砖引玉一下了,大家有更好的建议欢迎提出来。
下面是我对一个网站测试的结果:
- # ./Web-Cluster-Nodes-Test.sh www.sina.com.cn
- 本地出口地址: 123.117.X.X
- 归属ISP 信息: 北京市昌平区
- Web 网站域名: www.sina.com.cn
- 解析得到的IP: 16 个IP地址
- 开始测试 ......
- IP Address HTTP Code Time Connect(ms) ISP Information
- 202.108.33.XX 200 0.028ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.027ms 北京市 中搜公司
- 202.108.33.XX 200 0.025ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.027ms 北京市 中搜公司
- 202.108.33.XX 200 0.028ms 北京市 中搜公司
- 202.108.33.XX 200 0.047ms 北京市 中搜公司
- 202.108.33.XX 200 0.025ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.069ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.176ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 202.108.33.XX 200 0.026ms 北京市 中搜公司
- 测试结束!
附件:http://down.51cto.com/data/2357747
本文转自xiaoyuwang 51CTO博客,原文链接:http://blog.51cto.com/wangxiaoyu/514570,如需转载请自行联系原作者