Nginx err_content_length_mismatch排查

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不一致)

  • 先来张图看下
    Nginx err_content_length_mismatch排查_第1张图片

    现象 1:类似这种Console报错在 Network 中显示的状态是 200但是一直是pending 或者failed 百思不得其解,状态已经是正常,为什么还会报错呢?并且获取不到图片或者 JS、CSS、等文件,并且 Nginx Error 没有任何报错

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

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

排查一

根据大量的googlebaidu基本上全是跟 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_timeoutclient_body_timeout: (分别)设置了请求头和请求体的超时时间。这个值也应该设置得较低。
reset_timedout_connection : 告诉 nginx 当客户端失去相应时关闭链接。这将会释放为该客户端分配的所有内存。
send_timeout: 指定了响应客户端的超时时间。这个时间并不是指整个传输时间,而是在客户端两次读操作之间的间隔。如果客户端在这个时间内没有准备好再次读取数据,nginx 会关闭链接。

针对以上 5 条逐一验证,最终找到罪魁祸首send_timeout,更改为send_timeout 60 (单位为秒) 问题解决

自认为产生问题的原因:当用户发起请求Nginx 接受到请求,首先访问到 HTML 页面,其次由页面内的链接代码对服务器的图片发起请求,但是在客户端 2 次的请求间隔超过该项的配置,导致 Nginx 主动关闭链接。前端请求为正确的请求为 206或者200 状态,说明请求正常但是 Nginx 主动关闭链接,导致数据未能传输完毕。

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

你可能感兴趣的:(Linux,运维)