spring Boot 上傳檔案,10天后,不能上傳的bug
-
起因
公司研發人員 部署服務在阿里雲 ecs 伺服器; 上傳檔案過1周左右檔案自動丟失;
-
排查思路:
(1).查詢tomcat 啟動日誌出現如下資訊:
java.io.IOException: The temporary upload location [/tmp/tomcat.1593253653386650830.8220/work/Tomcat/localhost/ROOT] is not valid
(2).這個目錄在Linux系統中預設建在/tmp目錄下, 10天就會被清除, 引發上述異常.
(3).man systemd-tmpfiles
(3).由此可確定服務為凶手;就是說/tmp 目錄下除了下面排除的檔案,都給刪了。擦~
-
系統環境:
Centos-7.2
核心版本:
2.6.32-696.3.2.el6.x86_64
容器:
Tomcat 8.5.15.tar.gz
2.tomcat 服務層解決辦法;
JVM_OPTIONS="-Xrs -Xms256m -Xmx512m -Djava.io.tmpdir=/data/app/upload" ####tomcat bin catalina.sh 檔案修改##
3.程式框架解決辦法:
框架配置檔案新增: application.properties ####sprint-boot 框架配置檔案#######
server.tomcat.basedir=/data/app/upload
4.系統解決方案;
解決方案在 /usr/lib/tmpfiles.d/ 新建檔案把指定目錄新增上並規定不讓被清除
[email protected]~:# vi /usr/lib/tmpfiles.d/tomcat.conf
d /tmp/tomcat* 0755 root root -
d /tmp/upload 0755 root root - ##tomcat 程式上傳目錄檔案
OK,重啟 systemctl restart systemd-tmpfiles-clean 服務;
----------------------------------------------------------------------------------------
線上的系統中不能上傳檔案了,出現如下錯誤:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/localhost/ROOT] is not valid org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:112) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.
1
原因:
在linux系統中,springboot應用服務再啟動(java -jar 命令啟動服務)的時候,會在作業系統的/tmp目錄下生成一個tomcat*的檔案目錄,上傳的檔案先要轉換成臨時檔案儲存在這個資料夾下面。由於臨時/tmp目錄下的檔案,在長時間(10天)沒有使用的情況下,就會被系統機制自動刪除掉。所以如果系統長時間無人問津的話,就可能導致上面這個問題。
解決辦法:
在 yml配置檔案 中新增:
server.tomcat.basedir: /data/apps/temp
1
手動的將臨時資料夾設定為自定義的資料夾,就不會被Linux刪除了。
ps:在windows系統中可以生效,系統會自動生成/data/apps/temp這一路徑,但是在Linux系統中不會生成/data/apps/temp路徑。tell me why?…