今天遇到一個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: "m.maowutv.com"
日志已經說清楚: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: "m.maowutv.com"
根據日志提示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。


