云计算之路-阿里云上:SLB会话保持的一个坑
冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”。这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享。而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原因。
快下班之前,园区里另外一家公司的朋友说他们公司有的人不能正常访问园子——会出现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会话保持的一个坑的更多相关文章
- 云计算之路-阿里云上:禁用Windows虚拟内存引发的重启
昨天(2013年8月6日)下午,承载www.cnblogs.com主站的两台云服务器分别自动重启了1次,由于这两台云服务器使用了负载均衡(SLB),重启并未影响网站的正常访问. 与这次重启相关的Win ...
- 云计算之路-阿里云上:愚人节被阿里云OCS愚
今天是愚人节,而我们却被阿里云OCS愚,很多地方的缓存一直不过期,造成很多页面中的数据一直不更新.这篇博文将向您分享我们这两天遇到的OCS问题. 阿里云OCS(Open Cache Service)是 ...
- 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析
在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...
- 云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题
今天下午访问高峰的时候,主站的Web服务器出现奇怪的问题,开始是2台8核8G的云服务器(ECS),后来又加了1台8核8G的云服务器,问题依旧. 而且3台服务器特地使用了不同的配置:1台是禁用了虚拟内存 ...
- 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...
- 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况
在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...
- 云计算之路-阿里云上:启用Windows虚拟内存引发的CPU 100%故障
今天上午11:35~11:40左右,由于负载均衡中的两台云服务器CPU占用突然飚至100%,造成网站5分钟左右不能正常访问,请大家带来了麻烦,请谅解! (上图中红色曲线表示CPU占用) 经过分析,我们 ...
- 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时
在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...
- 云计算之路-阿里云上:OCS问题的进展以及11:30-11:50遇到的问题
(上图是今天出问题期间Web服务器性能监控图,紫色表示的是Request Execution Time) 昨天我们发布了一篇博客分享了我们这两天遇到的OCS(开放缓存服务)问题,详见云计算之路-阿里云 ...
随机推荐
- Java分布式 一些概念理解
转至 java那些事 2017-02-09 有些朋友工作一年了觉得该深入一下子了,所以想深入学习一下以提升自己的专业技能,想问一下如何入门Java分布式应用,学习过程大致是怎么样的,涉及到那些知识, ...
- Linux 系统 pptpd+radius+mysql 安装攻略
分类: 原文地址:Linux 系统 pptpd+radius+mysql 安装攻略 作者:wfeng .你所需要的软件 内核最好能升级到2.6 如果你是centos的用户,可以通过yum update ...
- zookeeper综述
zk概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.他主要用来解决分布式应用中的数据管理的一 ...
- layui当点击增加的时候,将form中的值获取的添加到table行中代码
layui.use(['table','layer'],function(){ var $=layui.$, table=layui.table, layer=layui.layer; functio ...
- C#通过SFTP协议操作文件
本文主要是C#调用SSH实现文件上传下载功能,主要是要引用第三方类库Tamir.SharpSSH.dll. 以下是SFTPHelper类,实现了对文件的操作,可供参考. public class SF ...
- Oracle Explain plan 使用总结
Oracle Explain plan使用总结 写多了SQL语句,伴随着数据量的海增,总会遇到性能的问题.在Oracle领域一个不好的习惯,一旦遇到性能问题就推给DBA来做.长期如此,反而对DB ...
- City Destruction Kattis - city dp
/** 题目:City Destruction Kattis - city 链接:https://vjudge.net/problem/Kattis-city 题意:有n个怪兽,排成一行.每个怪兽有一 ...
- 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(三):facebook-wda库--API学习以及附录:Github上对WDA的问题解答
下面简单介绍facebook-wda库--API的学习 import wda # debug模式,会在run运行时控制台生成消息 wda.DEBUG = False # False 关闭,True开启 ...
- 二维码生成库phpqrcode使用小结
<img src="data:image/png;base64,这里是base64编码内容" /> 只需要里边的phpqrcode.php这一个文件就可以生成二维码了 ...
- [Tips]Fix node.js addon build error: "gyp: binding.gyp not found"
基于node-gyp写Node.js native addon的时候,碰到一个很恶心的问题. 调用“node-gyp configure”能成功,再调用“node-gyp”时总会报错,最后发现时系统时 ...