场景之一:

基本架构:
网站是由多台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这个资源,我们可以这样做。

 

 
  
  1. [root@squid01 ~]# curl -s -H "Host:www.gyyx.cn" -I \ 
  2. 'http://x.x.x.x/stage/News/NewsContent.aspx?NewsID=310'             HTTP/1.0 200 OK 
  3. Server: nginx/x.x.x
  4. Date: Sun, 13 Mar 2011 13:00:12 GMT 
  5. Content-Type: text/html; charset=utf-8 
  6. X-Powered-By: ASP.NET 
  7. X-AspNet-Version: x.x.x.x
  8. Cache-Control: private 
  9. Content-Length: 13622 
  10. X-Cache: MISS from webcache 
  11. X-Cache-Lookup: MISS from webcache:80 
  12. Via: 1.0 webcache:80 (squid/2.6.STABLE10) 
  13. Connection: close 

不过这样一台一台的测试未免还是有些太慢。

写个脚本来实现同样的功能,您可以通过后面的链接下载到最新的脚本:

 

 
  
  1. #!/bin/bash 
  2. # Custer Web Servers Live Test 
  3. # 可以用来测试网站集群的前端服务器 
  4. # Based host and curl   
  5. # 2011-03-12 23:35:11 
  6. # 2011-03-13 17:01:56 Version 0.2 需要修正
  7. # wangxiaoyu#live.com  
  8. # dig +nocomments -t A www.gyyx.cn |grep -v "^;"|grep -v '^$'|grep -v 'CNAME' |awk '{print $NF}' 
  9.  
  10.  
  11. function Usage(){ 
  12.     echo -e "Usage:\t$0 DomainName [URL]" 
  13.     echo -e "eg:\t$0 www.gyyx.cn '/stage/News/NewsContent.aspx?NewsID=310'" 
  14.     echo -e "\t$0 www.gyyx.cn" 
  15.     echo -e '实现功能: 
  16.  
  17. \t支持域名访问及URL地址的检测 
  18. \t支持显示机房信息 
  19. \t支持显示测试点机房信息 
  20. \t支持显示网站连接延时,但不包括域名解析的时间
  21. \t支持友好的帮助信息 
  22. \t暂不支持批量测试和记日志功能 
  23. \t需要测试点为Linux,且正确安装了 host elinks curl 软件 
  24. \t暂时只能检查监听在80端口网站的检测: 
  25.     echo -e "友情提示:" 
  26.     RETVAL=$1 
  27.     case $RETVAL in 
  28.         1
  29.         echo -e "\t请输入使用网站服务器实际访问的域名\n\t如: www.gyyx.cn" 
  30.         ;; 
  31.         2
  32.         echo -e "\t所给定的域名:$HOST,无法被正常解析\n\t请确认是否拼写错误,或解析就有误" 
  33.         ;;   
  34.         3
  35.         echo -e "\t所给定的域名:$HOST,通过host命令未解析到IP\n\t请确认该域名是不是正常访问网站的域名" 
  36.         ;; 
  37.         4
  38.         echo -e "\t请确认您的主机上安装了 $2 软件,因为脚本某些功能会用到" 
  39.         ;; 
  40.         *) 
  41.         ;;  
  42.     esac 
  43.     exit $RETVAL 
  44. }    
  45.  
  46. ## 容错 
  47. [ $# -lt 1 ] && Usage 1 
  48.  
  49. ## HOST 
  50. HOST=$1 
  51.  
  52. ## 容错 
  53. host $HOST >/dev/null || Usage 2 
  54.  
  55. ## 容错 
  56. which host >/dev/null || Usage 4 'host' 
  57. which elinks >/dev/null || Usage 4 'elinks' 
  58. which curl >/dev/null || Usage 4 'curl' 
  59.  
  60. ## 获取Squid服务器的地址  
  61. typeset -a IPs 
  62. IPs=($(host $HOST |grep -v '\.$'|sort -n |awk 'BEGIN{ORS=" "}{print $NF}')) 
  63. ## 默认curl访问返回HTTP 状态码为200,则认为服务器存活 
  64. ## 如果是其它代码则认为是访问失败,并记录日志 
  65.  
  66. ## 容错 
  67. [ ${#IPs[*]} -eq 0 ] && Usage 3 
  68.  
  69. ## URL  
  70. URL=$2 
  71. ## LOGFILE=$0.log 
  72.  
  73. ## 测试点信息 
  74. MyIP=$(elinks --dump http://checkip.dyndns.org/ |awk -F: '{print $NF}'|sed 's/^[ ]//g'
  75. echo -e "本地出口地址: $MyIP" 
  76.  
  77. ## 国外的ISP信息代码 
  78. ##MyISP="$(elinks --dump "http://www.ip-adress.com/" |awk -F: '/ISP of my IP:/{print $NF}'|sed 's/^[ ]//g')" 
  79.  
  80. ## 另一个版本的ISP信息代码 
  81. MyISP=$(elinks --dump "http://tool.chinaz.com/IP/?IP=$MyIP" |sed -ne '/查询结果/{n;p}'|sed -n 's/^[ ]*//gp'
  82. echo -e "归属ISP 信息: $MyISP" 
  83.  
  84. ## 测试,并打印过程 
  85. echo -e "Web 网站域名: $HOST" 
  86. echo -e "解析得到的IP: ${#IPs[*]} 个IP地址\n" 
  87. echo -e "开始测试 ......\n" 
  88. printf "%-25s%-20s%-20s%-30s\n" 'IP Address' 'HTTP Code' 'Time Connect(ms)' 'ISP Information'  
  89.  
  90. ## 测试代码 
  91. typeset -a RESPONSE 
  92. for IP in ${IPs[*]} 
  93. do 
  94.     RESPONSE=($(curl -s -connect-timeout 5 --max-time 10 -H "Host:$HOST" -o /dev/null -I -w '%{http_code} %{time_connect}' $IP$URL)) 
  95.     ISP=$(elinks --dump "http://tool.chinaz.com/IP/?IP=$IP" |sed -ne '/查询结果/{n;p}'|sed -n 's/^[ ]*//gp'
  96.     if [ ${RESPONSE[0]} -nq 0 ] ;then ##这部分需要修正
  97.         printf "%-25s%-20s%-20s%-30s\n" $IP ${RESPONSE[*]}ms "$ISP" 
  98.     else  
  99.         printf "%s-25%s-20s%-20%-30s\n" $IP '超时' "$ISP" ##这部分也需要改
  100.     fi 
  101. done 
  102.  
  103. echo -e "\n测试结束!\n" 

 

这样我们就可认,把这些脚本上传到测试点,需要测试的时候,我们可以执行一遍,简单查看一下Squid的访问是否正常。需要注意的是我们需要小心地查看返回的HTTP响应码,并且比较保守的办法,是多次curl测试。姑且就抛砖引玉一下了,大家有更好的建议欢迎提出来。

下面是我对一个网站测试的结果:

 

 
  
  1. # ./Web-Cluster-Nodes-Test.sh www.sina.com.cn 
  2. 本地出口地址: 123.117.X.X 
  3. 归属ISP 信息: 北京市昌平区  
  4. Web 网站域名: www.sina.com.cn 
  5. 解析得到的IP: 16 个IP地址 
  6.  
  7. 开始测试 ...... 
  8.  
  9. IP Address               HTTP Code           Time Connect(ms)    ISP Information                
  10. 202.108.33.XX            200                 0.028ms             北京市 中搜公司         
  11. 202.108.33.XX            200                 0.026ms             北京市 中搜公司         
  12. 202.108.33.XX           200                 0.027ms             北京市 中搜公司         
  13. 202.108.33.XX           200                 0.025ms             北京市 中搜公司         
  14. 202.108.33.XX           200                 0.026ms             北京市 中搜公司         
  15. 202.108.33.XX           200                 0.027ms             北京市 中搜公司         
  16. 202.108.33.XX            200                 0.028ms             北京市 中搜公司         
  17. 202.108.33.XX            200                 0.047ms             北京市 中搜公司         
  18. 202.108.33.XX            200                 0.025ms             北京市 中搜公司         
  19. 202.108.33.XX            200                 0.026ms             北京市 中搜公司         
  20. 202.108.33.XX           200                 0.026ms             北京市 中搜公司         
  21. 202.108.33.XX            200                 0.069ms             北京市 中搜公司         
  22. 202.108.33.XX            200                 0.026ms             北京市 中搜公司         
  23. 202.108.33.XX            200                 0.176ms             北京市 中搜公司         
  24. 202.108.33.XX           200                 0.026ms             北京市 中搜公司         
  25. 202.108.33.XX            200                 0.026ms             北京市 中搜公司         
  26.  
  27. 测试结束!