博主在偶然间遇到过网站突然不能正常访问了,部分资源请求失败 net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 错误经过最开始排查以为是文件太大 nginx 处理拦截了然后调整了一下buff大小结果还是提示错误信息 net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 最后发现是 nginx 中开启的 sendfile on 导致的。

1720497568

主要原因

  ERR_CONTENT_LENGTH_MISMATCH 错误表明Nginx 在使用 sendfile 指令进行文件传输时,发送的字节数与响应头中声明的 Content-Length 头部不一致。这可能是由于文件在传输过程中被修改,或者 Nginx 与上游服务器之间的连接被意外终止。

解决方案

 我们如果想要临时解决 net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 错误信息 只需要在 nginx 配置中将 sendfile on 设置为 sendfile off 即可 解决 ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 异常

1720497708

其他解决方案

  1. 检查文件是否在传输过程中被修改。如果是,确保文件完整且未被篡改。
  2. 检查Nginx配置文件中是否有错误的sendfile指令使用,确保它正确配置且适用于您的场景。
  3. 如果问题发生在反向代理场景中,请检查上游服务器是否按预期发送了正确的内容长度。
  4. 查看Nginx和上游服务器的日志文件,以获取更多错误信息,并根据日志提示进行调试。
  5. 如果使用了缓存,尝试清除缓存,并重新测试以确定问题是否由缓存引起。
  6. 确保Nginx和上游服务器的网络连接稳定,没有意外中断。
  7. 如果以上步骤无法解决问题,可能需要进一步诊断网络问题或联系Nginx和上游服务器的技术支持。

什么是 sendfile

 Nginx 中的 sendfile 配置项用来在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

  • 配置如下
http {
    sendfile on;
}

 默认配置下,Nginx 读取本地文件后,在进行网络传输时会先将硬盘文件从硬盘中读取到 Nginx 的文件缓冲区中,操作流程为硬盘 → 内核文件缓冲区 → 应用缓冲区。然后将 Nginx 文件缓冲区的数据写入网络接口,操作流程:应用缓冲区 → 内核网络缓冲区 → 网络接口。

 Nginx 的本地文件在进行网络传输的过程中,经历了上述两个操作过程,两次操作都在内核缓冲区中存储了相同的数据。为了提高文件的传输效率,内核提供了零复制技术,该技术支持文件在内核缓冲区内直接交换打开的文件句柄,无须重复复制文件内容到缓冲区,则上述两个操作的流程变为:硬盘 → 内核文件缓冲区 → 内核网络缓冲区 → 网络接口。

 零复制技术减少了文件的读写次数,提升了本地文件的网络传输速度。内核缓冲区的默认大小为 4096B

以上就是网站资源请求提示 ERR_CONTENT_LENGTH_MISMATCH 错误的解决方法。