说明:
配置负载均衡后,在查看nginx访问日志的时候,经常看到这些http 400错误:
xxx.xxx.xxx.xxx - - [22/Aug/2013:13:58:13 +0800] "GET / HTTP/1.1" 200 66 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)" xxx.xxx.xxx.xxx - - [22/Aug/2013:13:58:13 +0800] "-" 400 0 "-" "-"
基本上几条正常的访问记录就会有一条400的记录,刚开始还以为是dns错误啥的,后来上网搜了下,发现也有可能是客户端缓存的问题。
实现:
只需要删除浏览器中的cookies,操作方法是:在浏览器中点击“Internet选项”然后再点击删除cookies即可!按照这个思路,尝试清除了谷歌浏览器chrome的浏览记录以后,发现果然彻底解决了访问时经常遇到的HTTP400错误的问题
附录:
附录1.nginx 日志中神秘的 HTTP 400 错误
前几天在查看 Nginx 的访问日志时,发现大量 HTTP 返回码为 400 的记录,见下图
可以看到,除了记录了 IP 以及返回码之外,日志中请求的 URL, Referer, User Agent 等等的信息通通为空白,非常奇怪。根据 HTTP 协议,400 返回码表示服务器认为浏览器发送的请求有错误,参见 HTTP 400 型错误 -请求无效,但是正常通过浏览器访问时,怎么会出现请求错误呢?
我立刻打开自己的 Chrome 浏览器试着访问了一下博客首页,发现居然又出现了三次 400 的记录,IP 自然都是我自己
反复试验,此现象基本都能重现,而且有一个很重要的特征:400 记录并不是紧随着正常记录,而是与之有大约几秒钟的间隔
看来是 Chrome 在请求完网站之后,间隔一段时间后,又发送了几条请求到服务器,但是请求的内容有问题,无法被服务器识别
Chrome 发送的是什么样的请求呢?我立刻打开 SmartSniff 抓取了一下 TCP 的包,见下图
注意选中的那三条记录的字节数,1 Byte ,原来 Chrome 发送了一条空的请求给服务器,所以服务器自然返回 400 了
至此,再结合上面所发现的特征,基本可以猜出原因了:与 Chrome 的并发连接数有关系!
我的判断是:
- 浏览器对于同域名的请求有并发连接数的限制,而 Chrome 的这个并发数的数值很高
- Chrome 访问一个网页时,会立刻建立大量的 TCP 连接,以便进行后续的 HTTP 传输
- 如果此网页的外部资源较少,导致部分 TCP 连接不需要使用,那么在一段时间后,Chrome 会断开这个连接
- 断开连接时,Chrome 的处理方式是发送一个空请求给服务器,造成服务器报 400 错误
为了验证这个判断,我给首页加了一个 img 标签,增加了首页的一个前端资源,然后再访问网站
果然,几十秒之后,日志中只出现了 2 条 400 记录,比之前的少了一条,基本验证了以上我的判断
另外试验了一下IE8 ,发现并不会造成 400 错误,而根据资料,这两个浏览器的并发数都是6,看来这可能属于 Chrome 处理策略上的问题了
呵呵,看来有时候网页外链的资源少了,也会出现烦恼啊…
PS: 谁知道怎么修改 Chrome 的并发连接数?找了 N 久,貌似不支持嘛…
附录2.解决HTTP 400错误的方法
好长时间以来,野草在访问野草博客时就经常遇到HTTP400错误,现象是访问野草的个人门户一切正常,访问别人的博客也一切正常,今天又发现在谷歌浏览器chrome里访问野草博客遇到HTTP400错误,但使用其他浏览器访问野草博客却一切正常,遇到的错误提示如下:400 Bad Request nginx/0.8.15
野草之前搜索后,发现很多人都说这个错误与DNS有关,于是野草把自己的DNS折腾了好多遍,改用Google的DNS后还会遇到HTTP400错误,改用电信的DNS也还会遇到HTTP400错误,改成自动获取DNS服务器地址以后还是会遇到HTTP400错误,真是把野草郁闷的要死。
今天万般无奈之下,向和讯博客管理员求助,因为野草实在是怀疑野草博客所在的和讯服务器是不是出了啥问题,然后,野草得到了和讯博客管理员的提示,也就是本文要分享的解决HTTP400错误的方法:
先删除一下浏览器中的cookies,操作方法是:在浏览器中点击“Internet选项”然后再点击删除cookies。再尝试通过博客首页登录。
野草按照这个思路,尝试清除了谷歌浏览器chrome的浏览记录以后,发现果然彻底解决了野草访问时经常遇到的HTTP400错误的问题。
就这么简单!搞了半天,还是客户端的问题。希望这个方法能够帮到大家解决HTTP400错误的问题。