今天遇到一个nginx问题导致上传图片失败,报500错误的经典问题,因为这个原因相比于以前遇到的,超过大小限制、文件传输超时、图片接口服务端异常等原因都不一样,所以阿汤博客这里分享给大家,如果有遇到Nginx上传图片报500错误,可以参考排查一下。
故障现象:
开发反馈,突然通过手机APP上传图片不成功,返回500错误,之前一直上传正常。
排查过程:
1、上传图片只有几MB可以排除文件大小限制原因导致的失败。
2、监听图片上传接口服务bms日志,发现上传接口请求未到此服务。
3、监听zuul网关日志,未发现异常报错。
4、通过网页端其他图片上传接口,上传测试正常,所有日志输出也正常。
5、此时怀疑是nginx方面的问题,查看nginx access访问日志,访问返回500错误,如下:
100.117.132.173 - - [28/Oct/2020:15:36:09 +0800] "POST /bms/images/uploadImg HTTP/1.1" 500 186 "-" "okhttp/3.14.4"
6、查看nginx error 日志,发现有相关报错,如下:
2020/10/28 15:36:09 [crit] 16719#0: *107060 open() "/var/tmp/nginx/client//0000000563" failed (2: No such file or directory), client: 100.117.132.173, server: localhost, request: "POST /bms/images/uploadImg HTTP/1.1", host: "www.amd5.cn"
日志已经说清楚:open() "/var/tmp/nginx/client//0000000563" failed (2: No such file or directory),访问"/var/tmp/nginx/client//0000000563" 文件失败,这个文件不存在。
于是查看服务器是否有此文件,发现/var/tmp/nginx/client目录不存在。
因此新建文件:
# mkdir -pv /var/tmp/nginx/client
然后再上传图片测试,此时日志报错:
2020/10/28 15:38:51 [crit] 16720#0: *107062 open() "/var/tmp/nginx/client//0000000565" failed (13: Permission denied), client: 100.117.132.130, server: localhost, request: "POST /bms/images/uploadImg HTTP/1.1", host: "www.amd5.cn"
根据日志提示Permission denied,得出nginx没有权限访问此目录。
因此赋予nginx访问此目录的权限:
# chown nginx.nginx -R /var/tmp/nginx/
再次上传图片测试,已经正常。
100.117.132.162 - - [28/Oct/2020:15:39:58 +0800] "POST /bms/image/uploadImg HTTP/1.1" 200 140 "-" "okhttp/3.14.4"
/var/tmp/nginx/client/是什么文件夹?
查看nginx编译配置,--http-client-body-temp-path=/var/tmp/nginx/client/,此目录是自己在编译安装nginx时,自己配置的。
那client-body-temp-path参数的作用是什么?网上找了资料。主要作用是:
为存储客户端请求的临时文件存储目录,用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置。
查看我的nginx配置文件,配置为client_body_buffer_size 128k;所以当图片超过128kb时,就会将文件暂存到/var/tmp/nginx/client/目录。
而刚才通过网页上传图片,为什么能成功?此时再去查看是因为上传的图片只有75kb。