Linux服务器nginx访问日志里出现大量http400错误的请求分析「建议收藏」

Linux服务器nginx访问日志里出现大量http400错误的请求分析

大家好,又见面了,我是全栈君。

nginx日志400错误

服务器中的错误记录类似于这种:

124.65.133.242 – – [27/Oct/2014:14:30:51 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”
124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] “-” 400 0 “-” “-”

踩点

经过分析nginx的log文件,发现都是在一次正常访问之后产生的数个400错误,每次有大概连续出现1-6个不等,而且也并不是每次客户访问都会产生400错误。

再观察产生400错误的前一次访问是很正常的,200状态码,正常的文件,正常的来路,正常的User-Agent… 一切都很和谐,那400是肿么来的呢?

通过仔细观察发现,所有产生400错误的前一次访问的User-Agent都是Google Chrome浏览器留下的,也就是说400错误是由Chrome浏览器产生的。但是经过本地抓包发现,chrome是没有向服务器发送异常请求或者数据包的。

在抓包分析中发现,Chrome在访问服务器时发起的连接不止一个,一般有5到6个不等,而如果请求的资源不需要那么多连接时,Chrome就会关闭未用的连接,这项技术叫做pre-connection“预先连接”。

通常我们访问一个网站时,第一个获取的是一个html主文件,而里面链接了网页所需要的css、js、图片等其他媒体资源文件,而一般资源文件和主 html文件是在一个域下的,预先连接就是在获取html之前就建立很多的tcp连接,而不是等到获取到html文件之后再去连接服务器获取其他的文件, 因为连接服务器是需要消耗一些时间的,所以这项技术可以很大程度上加快网页的呈现速度。

如果网页html链接的资源比较少,或者客户端有缓存,不需要连接下载,那么Chrome浏览器发出的5-6个连接很可能只有1个是需要的,其他的 都得关闭掉,这样就产生了一个问题:连接了服务器,而没有发送任何请求。对于这种情况,nginx是当做400错误来处理的,但由于连接已经关闭,错误信 息不会发送到客户端,这就产生了日志文件中记录了错误,而抓包分析中什么也看不到的现象。

测试

要验证上面的分析结果很简单,打开命令行cmd.exe,在里面输入telnet serverip 80,等待连接成功之后直接关掉cmd,这时去查看nginx的log文件中就多了一条400错误记录。

一句评论

pre-connection的优点已经很清楚了,但是它也是有缺点的,如果站长做了优化,使用了Cookie-free技术,或者网页和静态资源 使用不同的服务器,那么网页需要的css、js资源就和主html不在同一个域下,也可能不在同一个IP上,那么pre-connection不仅是鸡 肋,而且会对主html服务器产生不必要的负担。

其它原因

网上很多人写过相关的文章,大多的人的原因是因为 header 的头部大小超了,引起响应 400 告诉是 bad request.但其实还有一种可能,就是象端口测试工具,只是检查端口是否是活的。像 LVS 之类什么的,也会引起这种问题,然后日志中会出现大量的 400 错误。

对于上述问题可以在nginx.conf中,将client_header_buffer_size和large_client_header_buffers都调大,可缓解此问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112035.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vuex持久化插件-解决浏览器刷新数据消失问题

    vuex持久化插件-解决浏览器刷新数据消失问题

    2021年7月4日
    66
  • resnet pytorch代码_resnet pytorch

    resnet pytorch代码_resnet pytorchPyTorch:https://github.com/shanglianlm0525/PyTorch-Networksimporttorchimporttorch.nnasnnimporttorchvisionimportnumpyasnpprint(“PyTorchVersion:”,torch.__version__)print(“TorchvisionVersion:…

    2022年10月6日
    3
  • 【linux命令】 tree命令

    【linux命令】 tree命令文章目录Tree命令安装方法一,yum安装方法二,源码安装Tree命令安装方法一,yum安装命令:yuminstalltree方法二,源码安装1.下载安装包,地址:http://mama.indstate.edu/users/ice/tree/2.解压安装1)Linux环境(CentOS6.5)下安装a.解压tree-1.7.0.tgz文件,命令:tar-zxvftree-1.7.0.tgzb.进入解压目录中,命令:cdtree-1.7.0      c.安装文件,命令:

    2022年7月24日
    9
  • 数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?「建议收藏」

    数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?「建议收藏」先说结论比较次数与序列初态无关的算法是:二路归并排序、简单选择排序、基数排序比较次数与序列初态有关的算法是:快速排序、直接插入排序、冒泡排序、堆排序、希尔排序排序趟数与序列初态无关的算法是:直接插入排序、折半插入排序、希尔排序、简单选择排序、归并排序、基数排序排序趟数与序列初态有关的算法是:冒泡排序、快速排序关于排序趟数插入排序、选择排序趟数都是固定的n-1。对于插入排序来说或,即使序列有序,也要依次从第二个元素开始,向前找它的插入位置。冒泡排序趟数与数据有关,优

    2022年8月23日
    7
  • DreamWeaver CS5视频教程(建站必备)

    DreamWeaver CS5视频教程(建站必备)月云网赚论坛免费分享:(建站必备)DreamWeaverCS5视频教程,学完就可以做自己想要做的网网站了。01dreamweaver教程CS5视频教程_工具栏介绍02dreamweaver教程CS5视频教程_编码工具栏03dreamweaver教程CS5视频教程_“插入”面板104dreamweaver教程CS5视频教程“插入”面板205dreamweav

    2022年6月3日
    35
  • 固态硬盘界的”瑞士军刀”:有这两款工具箱软件才安心

    固态硬盘界的”瑞士军刀”:有这两款工具箱软件才安心固态硬盘每天产生了多少写入量?剩余寿命还能用几年?如何你非常关心这些普通玩家经常忽视的问题,专业的固态硬盘工具箱软件将是必备的。 HardDiskSentinel能够同时支持机械和固态硬盘,依据问题扇区和接口CRC错误、Trim功能开启状况,给出硬盘的健康和性能状态,以及预计的可用剩余寿命。 新版的HardDiskSentinel还能根据硬盘型号识别出固态硬盘所用的…

    2022年6月7日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号