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

 更新时间:2014年12月13日 13:15:58   投稿:mdxy-dxy  
这篇文章主要介绍了Linux服务器nginx访问日志里出现大量http 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都调大,可缓解此问题。

相关文章

  • Linux虚拟机如何改中文

    Linux虚拟机如何改中文

    这篇文章主要介绍了Linux虚拟机如何改中文问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Linux内核设备驱动之内核的调试技术笔记整理

    Linux内核设备驱动之内核的调试技术笔记整理

    今天小编就为大家分享一篇关于Linux内核设备驱动之内核的调试技术笔记整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Linux性能测试 pmap命令详解

    Linux性能测试 pmap命令详解

    pmap命令用于显示一个或多个进程的内存状态,下面通过本文给大家分享Linux性能测试 pmap命令详解,需要的朋友参考下吧
    2017-09-09
  • 简析Linux网络编程函数

    简析Linux网络编程函数

    这篇文章主要介绍了Linux网络编程函数,利用这些基本函数,可以实现tcp协议通讯,可以实现通信。需要了解的小伙伴可以参考一下
    2021-08-08
  • 详解如何在Linux系统上安装cpolar内网穿透

    详解如何在Linux系统上安装cpolar内网穿透

    cpolar作为一款体积小巧却功能强大的内网穿透软件,不仅能够在多种环境和应用场景中发挥巨大作用,还能适应多种操作系统,本文主要介绍了cpolar在Linux系统下的各种应用类型,感兴趣的可以了解下
    2023-08-08
  • 在Linux环境下安装Kafka

    在Linux环境下安装Kafka

    本文以安装Kafka的步骤做了图文详细介绍,Kafka是一种高吞吐量 的分布式发布订阅消息系统,对Kagka感兴趣的小伙伴可以参考参考本篇文章
    2021-08-08
  • Linux socket函数详解

    Linux socket函数详解

    在网络编程中,协议是指计算机系统之间进行通信和交互所遵循的规则和约定,协议在网络编程中起着举足轻重的作用,它定义了通信双方的行为规范,确保了网络通信的顺利进行,这篇文章主要介绍了Linux socket函数,需要的朋友可以参考下
    2024-02-02
  • 树莓派4安装Ubuntu 19.10的教程详解

    树莓派4安装Ubuntu 19.10的教程详解

    这篇文章主要介绍了树莓派4安装Ubuntu 19.10的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • CentOS 6.5上的Tomcat启动报错问题解决方法

    CentOS 6.5上的Tomcat启动报错问题解决方法

    最近在搭建虚拟机环境,装的是CentOSQL 6.5版本,然后装的OpenJDK1.7,在Apache下载了一个纯净的Tomcat放到虚拟机上启动报错了
    2016-08-08
  • Linux如何配置本地yum源(光盘镜像挂载)

    Linux如何配置本地yum源(光盘镜像挂载)

    这篇文章主要介绍了Linux如何配置本地yum源(光盘镜像挂载),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论