前端菜鸡记一次nginx缓冲区限制de异常排查(client_body_buffer_size)

1,231 阅读2分钟

起因

事情源于增加一个前端的上传功能,开发完毕以后首先发现图片加载不出来,控制台报错

ERR_CONTENT_LENGTH_MISMATCH(一个加载图片的异常)

搜索发现可能是nginx缓冲区的问题,去查看转发后端nginx的日志,发现

open() "/usr/local/nginx/proxy_temp/4/30/0000000304" failed (13: Permission denied) while blablablabla......

好了嘛,就是没权限,找运维加权限就好

(不过还是没懂为啥会缓存,因为直接在浏览器打开链接,请求头有cache-control: no-cache的情况下还是报错)

部署

打包扔到测试环境以后,测试发现上传接口500报错,返回了一个不相干的页面,应该是nginx的错误处理对应的error_page

查看日志,发现

2019/11/21 17:28:22 [crit] 31566#0: *88028 open() "/opt/nginx-1.16.0/client_body_temp/0000000037" failed (13: Permission denied), client: xxxxxx, server: xxxxxxxx, request: "POST /xxx/uploadFile HTTP/1.1", host: "xxxxx", referrer: "xxxxx"

更不懂了,为什么一个接口会去调用缓存

解决

最后,经过不断的仔细排查与后端大战几百回合我觉得是nginx的问题

查了一下缓存读取目录client_body_temp

仔细看了一下配置,发现有一项client_body_buffer_size是用来配置缓冲区大小的

关于client_body_temp目录的作用,简单说就是如果客户端POST一个比较大的文件,长度超过了nginx缓冲区的大小,需要把这个文件的部分或者全部内容暂存到client_body_temp目录下的临时文件。

了解了这个以后也就不难解释为什么都读取缓存了

  • 加载图片大小超过缓冲区大小限制
  • 请求的body长度超过缓冲区大小限制

都会触发暂存的功能,把配置一改,重新启动nginx,解决问题

总结

没事多看看文档,多看看平常不怎么用的属性