如何测试网站集群节点的页面访问是否正常
时间:2014-10-02 23:21 来源:linux.it.net.cn 作者:it
基本架构:网站是由多台Squid服务器做集群组成,客户端口访问网站的过程是:客户端向Web站点发出请求,请求某一URL资源;
如何测试网站集群节点的页面访问是否正常,感兴趣的朋友可以参考下。
场景之一:
基本架构:
网站是由多台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.XX200 0.028ms 北京市 中搜公司
202.108.33.XX200 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.XX200 0.028ms 北京市 中搜公司
202.108.33.XX200 0.047ms 北京市 中搜公司
202.108.33.XX200 0.025ms 北京市 中搜公司
202.108.33.XX200 0.026ms 北京市 中搜公司
202.108.33.XX 200 0.026ms 北京市 中搜公司
202.108.33.XX200 0.069ms 北京市 中搜公司
202.108.33.XX200 0.026ms 北京市 中搜公司
202.108.33.XX200 0.176ms 北京市 中搜公司
202.108.33.XX 200 0.026ms 北京市 中搜公司
202.108.33.XX200 0.026ms 北京市 中搜公司
(责任编辑:IT)
基本架构:网站是由多台Squid服务器做集群组成,客户端口访问网站的过程是:客户端向Web站点发出请求,请求某一URL资源; 如何测试网站集群节点的页面访问是否正常,感兴趣的朋友可以参考下。
场景之一:
问题:
定位: 由于不同地域的用户,来源IP是不同的,如果按常规做法,我们需要登录,各个地域的测试机,而后,修改所有的配置文件,一个IP,一个IP的测试。好像挺费力。
我的思路:
例如: 不过这样一台一台的测试未免还是有些太慢。
写个脚本来实现同样的功能,您可以通过后面的链接下载到最新的脚本:
复制代码 代码如下:#!/bin/bash
function Usage(){ 这样我们就可认,把这些脚本上传到测试点,需要测试的时候,我们可以执行一遍,简单查看一下Squid的访问是否正常。需要注意的是我们需要小心地查看返回的HTTP响应码,并且比较保守的办法,是多次curl测试。姑且就抛砖引玉一下了,大家有更好的建议欢迎提出来。
下面是我对一个网站测试的结果:
|