Nginx err_content_length_mismatch排查

  • Post author:
  • Post category:其他


Nginx 报错记录

报错信息:

net::err_content_length_mismatch 200 ok



网站结构

Created with Raphaël 2.2.0 用户访问 Nginx HTML 访问结束



报错说明

官网解释为:

err_content_length_mismatch

:错误的内容长度不匹配(请求的Heather 里content-length长度与返回的content-length不一致)

  • 先来张图看下

    现象 1:

    类似这种

    Console

    报错在

    Network

    中显示的状态是

    200

    但是一直是

    pending

    或者

    failed

    百思不得其解,状态已经是正常,为什么还会报错呢?并且获取不到图片或者 JS、CSS、等文件,并且

    Nginx Error

    没有任何报错

    现象 2:

    在chrome下,请缓存或强制刷新,response的status code为200、不强制刷新,response的status code为206,并且response header里面,content-length 的长度和目标文件的实际长度是一致的,其他浏览器处于等待状态


    根据以上信息说明此错误与正常出现该错误的说明不一致,继续排查其他相关信息(心累)



排查一

根据大量的

google



baidu

基本上全是跟

Nginx

产生的临时文件权限有关。



验证

temp

目录的权限

经过排查与 Nginx 启动用户相匹配,并且具有 755的权限,并上传文件访问验证。

结果:与 Nginx 的缓存目录没有关系



排查二

既然不是目录权限的问题,那么会不会是只要是静态资源就会出现此问题呢?



验证相关静态文件

本地上传图片或者 js、css 文件至

Nginx

根目录进行访问验证, 结果都为正常。

结果:不是所有的静态资源都出现通用的问题。



排查三

即不是权限问题也不是静态文件问题,那会是什么问题?再次回到开始分析报错信息

net::err_content_length_mismatch 200 ok

,那么会不会是

Nginx

相关配置问题?



验证是否是配置错误导致

  • 准备

    1. 获取相关所有项目文件
    2. 安装全新

      Nginx
    3. 获取所有线上

      Nginx

      配置
  • 验证


    1. Nginx

      默认配置的情况下增加配置访问主目录
    2. 浏览器验证访问项目,未出现相关报错,问题定位为相关配置导致该报错
    3. 增加配置文件(每次增加的内容为 Nginx 配置的类别,比如:gzip,evens 等),每增加一段配置在浏览器进行验证。



问题解决



问题复现

  • 在进行排查三时问题出现


当增加至客户端先关超时配置项时问题浮现;

keepalive_timeout 20;
client_header_timeout 20;
client_body_timeout 20;
    
reset_timedout_connection on;
send_timeout 2;


keepalive_timeout

: 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们会降低这个值,以避免让 worker 过长时间的忙碌。


client_header_timeout



client_body_timeout

: (分别)设置了请求头和请求体的超时时间。这个值也应该设置得较低。


reset_timedout_connection

: 告诉 nginx 当客户端失去相应时关闭链接。这将会释放为该客户端分配的所有内存。


send_timeout

: 指定了响应客户端的超时时间。这个时间并不是指整个传输时间,而是在客户端两次读操作之间的间隔。如果客户端在这个时间内没有准备好再次读取数据,nginx 会关闭链接。


针对以上 5 条逐一验证,最终找到罪魁祸首

send_timeout

,更改为send_timeout 60 (单位为秒) 问题解决


自认为产生问题的原因

:当用户发起请求Nginx 接受到请求,首先访问到 HTML 页面,其次由页面内的链接代码对服务器的图片发起请求,但是在客户端 2 次的请求间隔超过该项的配置,导致 Nginx 主动关闭链接。前端请求为正确的请求为

206

或者

200

状态,说明请求正常但是 Nginx 主动关闭链接,导致数据未能传输完毕。

经过以上所有排查最终将问题解决!!!!事实告诉我们,如果不了解 Nginx 相关配置,保持默认就好…



版权声明:本文为u011607971原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。