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

快下班之前,园区里另外一家公司的朋友说他们公司有的人不能正常访问园子——会出现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. spring中aop以xml配置方式

    1 引jar包 springAOP\aopalliance.jar springAOP\aspectjrt.jar springAOP\aspectjweaver.jar springAOP\spri ...

  2. matplotlib极坐标系应用之雷达图

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: test.py #Autho ...

  3. CentOS上扩充lv-root空间步骤详解

    查看服务器发现vg_host01-lv_root下的空间占用的比较多,需要扩容. 有以下两种方案: )利用空余的磁盘,扩展lv_root的大小(推荐) )将lv_home的空间挪出一部分给lv_roo ...

  4. 使用 Bolt 实现 GridView 表格控件

    用 Bolt 实现了一个表格控件: 1. 提供 Insert,Remove,Get,Set 接口,可以为表格增删数据: 2. 通过  ItemClass, ItemSetDataFunc 属性来指定显 ...

  5. Hadoop 2.0 编译问题小结

    原文见 http://xiguada.org/hadoop-2-x-compile/ 这些问题是2013年初整理的,不过到目前为止,即使最新的hadoop2.0系列,编译总体上变化不大,因此还能适用. ...

  6. jquery为动态添加元素绑定点击事件

    on()方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素) $("#mainbody").on("click",".link&qu ...

  7. gcc,一个神奇的编译器

    gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译器集.gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序.但是在这里,我们 ...

  8. RabbitMQ系列一

    1.http://www.erlang.org/downloads 下载一个比教新的版本(otp_win64_20.2.exe) 2.http://www.rabbitmq.com/install-w ...

  9. atn 编译java提示资源不足

    今天用ant编译项目出现 [javac] 系统资源不足.的错误,如下 Buildfile: build.xml -compile:    [javac] Compiling 919 source fi ...

  10. Linux下vi命令小结

     进入vi的命令         vi filename :打开或新建文件,并将光标置于第一行首    vi n filename :打开文件,并将光标置于第n行首    vi filename :打 ...