起因
事情源于增加一个前端的上传功能,开发完毕以后首先发现图片加载不出来,控制台报错
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,解决问题