Nginx 报错记录
报错信息:
net::err_content_length_mismatch 200 ok
网站结构
报错说明
官网解释为:
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
目录的权限
temp
经过排查与 Nginx 启动用户相匹配,并且具有 755的权限,并上传文件访问验证。
结果:与 Nginx 的缓存目录没有关系
排查二
既然不是目录权限的问题,那么会不会是只要是静态资源就会出现此问题呢?
验证相关静态文件
本地上传图片或者 js、css 文件至
Nginx
根目录进行访问验证, 结果都为正常。
结果:不是所有的静态资源都出现通用的问题。
排查三
即不是权限问题也不是静态文件问题,那会是什么问题?再次回到开始分析报错信息
net::err_content_length_mismatch 200 ok
,那么会不会是
Nginx
相关配置问题?
验证是否是配置错误导致
-
准备
- 获取相关所有项目文件
-
安装全新
Nginx
-
获取所有线上
Nginx
配置
-
验证
-
Nginx
默认配置的情况下增加配置访问主目录 - 浏览器验证访问项目,未出现相关报错,问题定位为相关配置导致该报错
- 增加配置文件(每次增加的内容为 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 相关配置,保持默认就好…