冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”。这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享。而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原因。

快下班之前,园区里另外一家公司的朋友说他们公司有的人不能正常访问园子——会出现HTTP Error 400错误,而其他人可以正常访问。这个问题立即引起了我们的警觉,因为之前也有园友反馈过同样的问题,当时什么也没动,后来就好了,以为是他们公司网络代理服务器的问题。由于我们从未遇到过这个问题,而且无法重现,也就无从下手。现在再次出现这个问题,也是有代理服务器的网络环境,难得的机会,我们立即去现场一看究竟。

在遇到这个问题的电脑上,不管用什么浏览器,访问www.cnblogs.com都会出现错误:

Bad Request - Invalid Hostname
HTTP Error 400. The request hostname is invalid.

这是IIS返回的标准400错误,说明请求已经由SLB(阿里云负载均衡)到达了Web服务器。

我们查看了浏览器的请求头,一切正常。

在查看Cookie时发现只有一个名为SERVERID的Cookie,于是我们清除一下这个Cookie,结果html页面出来了,但后续的css/js文件加载时又出现400错误,再刷新浏览器,又变成400错误。

这个SERVERID的Cookie让我们想起了在排查“黑色30秒”问题期间,我们开启了SLB的会话保持,这个Cookie是SLB为了保持会话而产生的。难道与SLB会话保持有关?“Bad Request - Invalid Hostname”时,IIS收到的究竟是什么样的hostname?

带着这些问题,我们回到了自己的办公室,立即想到了IIS的一个重要日志——httperr日志,默认存放位置是C:\Windows\System32\LogFiles\HTTPERR\文件夹,打开一个日志文件一看,满眼都是400错误,错误的原因都是Hostname。

之前我们在偶尔看httperr日志时,也看到过这样的400错误,当时想可能是某些出问题的爬虫引起的,SLB怎么可能会把hostname搞错,也就没深究。

这次一定要找出IIS究竟收到的是什么样的hostname,那如何让IIS在httperr中记录hostname的信息呢?

在网上找到了一篇微软的参考资料:Additional properties are now available for logging in the Httperr#.log file in IIS 6.0 and IIS 7.0

只需2步操作实现:

1. 在注册表项HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters中添加名为ErrorLoggingFields、类型为REG_DWORD、值为7DFF4E7 (十六进制)的项目。

2. 在命令行中运行命令:net stop http & net start http & iisreset

然后再查看httperr日志,结果让我们惊呆了,cs-host中竟然有这样的值(见下图):

第1张图中SLB竟然把http header中的max-age=259200当作host的值转发给了IIS。

第2张图片SLB竟然把用户在使用代理服务器的情况下得到的IP信息当作host的值转发给了IIS。

难怪会出现Invalid Hostname的错误!

对于SLB这样的角色,http header失之毫厘,谬以千里。出现这样的问题,真的让人觉得这地方的代码写得很糟糕。

如果SLB的代码是开源的?哪个开发人员敢写出这样的代码?即使敢写,也马上会被人发现。

看来云计算更需要开源,不是把开源变成自己的计算能力,而是把自己的计算能力开源,这样才能更少问题、更让人放心。

禁用SLB的会话保持后,这些400立马消失。

一想到因为这个原因造成很多用户不能正常访问,就有一种说不出的恼火。。。

【更新】

阿里云已于2014年5月22日修复这个问题。

云计算之路-阿里云上:SLB会话保持的一个坑的更多相关文章

  1. 云计算之路-阿里云上:禁用Windows虚拟内存引发的重启

    昨天(2013年8月6日)下午,承载www.cnblogs.com主站的两台云服务器分别自动重启了1次,由于这两台云服务器使用了负载均衡(SLB),重启并未影响网站的正常访问. 与这次重启相关的Win ...

  2. 云计算之路-阿里云上:愚人节被阿里云OCS愚

    今天是愚人节,而我们却被阿里云OCS愚,很多地方的缓存一直不过期,造成很多页面中的数据一直不更新.这篇博文将向您分享我们这两天遇到的OCS问题. 阿里云OCS(Open Cache Service)是 ...

  3. 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...

  4. 云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题

    今天下午访问高峰的时候,主站的Web服务器出现奇怪的问题,开始是2台8核8G的云服务器(ECS),后来又加了1台8核8G的云服务器,问题依旧. 而且3台服务器特地使用了不同的配置:1台是禁用了虚拟内存 ...

  5. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  6. 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况

    在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...

  7. 云计算之路-阿里云上:启用Windows虚拟内存引发的CPU 100%故障

    今天上午11:35~11:40左右,由于负载均衡中的两台云服务器CPU占用突然飚至100%,造成网站5分钟左右不能正常访问,请大家带来了麻烦,请谅解! (上图中红色曲线表示CPU占用) 经过分析,我们 ...

  8. 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时

    在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...

  9. 云计算之路-阿里云上:OCS问题的进展以及11:30-11:50遇到的问题

    (上图是今天出问题期间Web服务器性能监控图,紫色表示的是Request Execution Time) 昨天我们发布了一篇博客分享了我们这两天遇到的OCS(开放缓存服务)问题,详见云计算之路-阿里云 ...

随机推荐

  1. sublime for mac 注册码

    https://www.jianshu.com/p/04e1b65dd2c0https://fatesinger.com/100121

  2. django如何修改开发服务器的端口

    我们启动django开发服务器,输入命令 manage.py  runserver  默认的端口是8000. 我们在浏览器中输入127.0.0.1:8000,可以访问8000端口 我们先停掉djang ...

  3. IOS 颜色 16进制 转换

    #define RGB(r,g,b) ([UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]) #define HEXTO ...

  4. Atitit.用户权限服务 登录退出功能

    Atitit.用户权限服务 登录退出功能 参数说明 /com.attilax/user/loginOut.jsp?url="+url Utype=mer 作者::  ★(attilax)&g ...

  5. jquery几个按钮同时调用一个方法

  6. 关于引脚复用,不得不提的GPIO_Pin_sources 和GPIO_Pin

    今天在端口复用时遇到了困惑,参考:http://www.51hei.com/bbs/dpj-40992-1.html 调整前的代码GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,G ...

  7. Unix系统编程()main函数的命令行参数

    命令行参数输入双引号是什么效果? 好像可以去空格化.

  8. Geek们为什么都用Linux?《完全使用Linux工作-王垠》读后记

    真正开始使用Linux是从2013年某月看到王垠写的一篇<完全用Linux工作>,当时属于无比崇拜王垠的阶段,虽然在那之前常年都在电脑上装着双系统(linux,win),但linux也只能 ...

  9. shell变量自增 || Python脚本接收参数

    一.shell变量自增a=1a=$(($a+1))a=$[$a+1]a=`expr $a + 1`let a++ let a+=1 ((a++)) echo $a 二.python脚本接收参数 fro ...

  10. android启动界面

    /**  * 应用程序启动类:显示欢迎界面并跳转到主界面  * <a href="http://my.oschina.net/arthor" target="_bl ...