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

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

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都调大,可缓解此问题。

时间: 2024-09-26 05:46:17

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

Linux定时切割Nginx访问日志并删除指定天数前的日志记录

说明: 操作系统:CentOS 站点1:bbs .111cn.net 站点2:sns .111cn.net Nginx安装路径:/usr/local/nginx Nginx配置文件路径:/usr/local/nginx/conf/nginx.conf 站点1配置文件路径:/usr/local/nginx/conf/vhost/bbs.111cn.net.conf 站点2配置文件路径:/usr/local/nginx/conf/vhost/sns.111cn.net.conf 目的: 1.对站点1

10分钟精通Nginx访问日志分析统计

简介 很多个人站长在搭建网站时使用nginx作为服务器,为了了解网站的访问情况,一般有两种手段: 使用CNZZ之类的方式,在前端页面插入js,用户访问的时候触发js,记录访问请求. 利用流计算.或离线统计分析nginx的access log,从日志中挖掘有用信息. 两种方式各有优缺点: CNZZ使用起来比较简单,各种指标定义清楚.但这种方式只能记录页面的访问请求,像ajax之类的请求是无法记录的,还有爬虫信息也不会记录. 利用流计算.离线计算引擎可以支持个性化需求,但需要搭建一套环境,并且在实时

nginx访问日志并删除指定天数前的日志记录配置方法_nginx

说明: 操作系统:CentOS 站点1:bbs.jb51.net 站点2:sns.jb51.net Nginx安装路径:/usr/local/nginx Nginx配置文件路径:/usr/local/nginx/conf/nginx.conf 站点1配置文件路径:/usr/local/nginx/conf/vhost/bbs.jb51.net.conf 站点2配置文件路径:/usr/local/nginx/conf/vhost/sns.jb51.net.conf 目的: 1.对站点1和站点2的n

《ELK Stack权威指南(第2版)》一3.1 Nginx访问日志

第3章 场 景 示 例 前面虽然介绍了几十个Logstash插件的常见配置项,但是过多的选择下,如何组合使用这些插件,依然是一部分用户的难题.本章将列举一些最常见的日志场景,演示针对性的组件搭配,希望能给读者带来启发. 本章介绍的场景包括:Nginx访问日志.Nginx错误日志.Postfix日志.Ossec日志.Windows系统日志.Java日志.MySQL慢查询日志.Docker容器日志. 3.1 Nginx访问日志 访问日志处理分析绝对是使用ELK stack时最常见的需求.默认的处理方

nginx访问日志,错误日志参数说明

访问日志[Access.log] '$remote_addr $remote_user [$time_local] "$request" $http_host' '$status $upstream_status $body_bytes_sent "$http_referer"' '"$http_user_agent" $ssl_protocol $ssl_cipher $upstream_addr' '$request_time $upstre

调环信的创建群组接口,System.Net.WebException: 远程服务器返回错误: (400) 错误的请求。

问题描述 报错:System.Net.WebException: 远程服务器返回错误: (400) 错误的请求.调这个接口之前成功过,现在报这个,可能是什么问题? 解决方案 (错误请求) 服务器不理解请求的语法.   检查一下

Python 分析Nginx访问日志并保存到MySQL数据库实例_python

使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库.一.Nginx access日志格式如下: 复制代码 代码如下: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_f

linux服务器(nginx或者apache)限制IP访问

 近段时间一直饱受垃圾评论的攻击,服务器一度负载太高而宕机,参见:WordPress垃圾评论防御记.开始试了很多方法都不能很好的解决问题,最后通过屏蔽垃圾评论IP的方式,算是解决了这个问题,当然这个方法不是最好的,但是确实是非常实用的方法. 然后一些朋友就问我是怎么屏蔽这些垃圾评论的IP的,以及能否共享这些垃圾评论的IP,还有朋友问怎么提取自己博客的垃圾评论的IP,这个稍稍讲解下,高手略过,我也是个菜鸟. nginx环境下 新建 denyip.conf 文件,在服务器/usr/local/ngi

linux服务器(nginx或者apache)限制IP访问的方法

近段时间一直饱受垃圾评论的攻击,服务器一度负载太高而宕机,参见:WordPress垃圾评论防御记.开始试了很多方法都不能很好的解决问题,最后通过屏蔽垃圾评论IP的方式,算是解决了这个问题,当然这个方法不是最好的,但是确实是非常实用的方法. 然后一些朋友就问我是怎么屏蔽这些垃圾评论的IP的,以及能否共享这些垃圾评论的IP,还有朋友问怎么提取自己博客的垃圾评论的IP,这个稍稍讲解下,高手略过,我也是个菜鸟. nginx环境下 新建 denyip.conf 文件,在服务器/usr/local/ngin