阿汤博客-承接Linux服务器维护、服务器配置与管理,有意者可以联系博主!

Nginx上传图片500错误解决办法

运维问题 242℃ 0评论

今天遇到一个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。

转载请注明:阿汤博客 » Nginx上传图片500错误解决办法

喜欢 (0)or分享 (0)