今天遇到一個nginx問題導(dǎo)致上傳圖片失敗,報500錯誤的經(jīng)典問題,因為這個原因相比于以前遇到的,超過大小限制、文件傳輸超時、圖片接口服務(wù)端異常等原因都不一樣,所以阿湯博客這里分享給大家,如果有遇到Nginx上傳圖片報500錯誤,可以參考排查一下。
故障現(xiàn)象:
開發(fā)反饋,突然通過手機APP上傳圖片不成功,返回500錯誤,之前一直上傳正常。
排查過程:
1、上傳圖片只有幾MB可以排除文件大小限制原因?qū)е碌氖 ?/p>
2、監(jiān)聽圖片上傳接口服務(wù)bms日志,發(fā)現(xiàn)上傳接口請求未到此服務(wù)。
3、監(jiān)聽zuul網(wǎng)關(guān)日志,未發(fā)現(xiàn)異常報錯。
4、通過網(wǎng)頁端其他圖片上傳接口,上傳測試正常,所有日志輸出也正常。
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 日志,發(fā)現(xiàn)有相關(guān)報錯,如下:
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.zhongjima.net"
日志已經(jīng)說清楚:open() "/var/tmp/nginx/client//0000000563" failed (2: No such file or directory),訪問"/var/tmp/nginx/client//0000000563" 文件失敗,這個文件不存在。
于是查看服務(wù)器是否有此文件,發(fā)現(xiàn)/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.zhongjima.net"
根據(jù)日志提示Permission denied,得出nginx沒有權(quán)限訪問此目錄。
因此賦予nginx訪問此目錄的權(quán)限:
# chown nginx.nginx -R /var/tmp/nginx/
再次上傳圖片測試,已經(jīng)正常。
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參數(shù)的作用是什么?網(wǎng)上找了資料。主要作用是:
為存儲客戶端請求的臨時文件存儲目錄,用于接收客戶端請求報文的body部分的緩沖區(qū)大小;默認(rèn)為16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置。
查看我的nginx配置文件,配置為client_body_buffer_size 128k;所以當(dāng)圖片超過128kb時,就會將文件暫存到/var/tmp/nginx/client/目錄。
而剛才通過網(wǎng)頁上傳圖片,為什么能成功?此時再去查看是因為上傳的圖片只有75kb。