jetty8上传文件报错排查
问题:
服务器正常运行项目正在使用,突然用户上传文件报错,并且这种情况不是第一次了,所以下定决心排查问题,项目使用的容器是jetty8,脚本都是之前历史遗留的比较乱,这次一起看看
1.错误提示代码:
<html> <head> <meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1"/> <title>Error
500 Server Error</title> </head> <body><h2>HTTP
ERROR 500</h2> <p>Problem accessing
/cgoem/api/files/upload. Reason: <pre>Server
Error</pre></p><h3>Caused by:</h3>
<pre>org.springframework.web.multipart.MultipartException:
Could not parse multipart servlet request; nested
exception is
org.apache.commons.fileupload.FileUploadBase$IOFileUploadE
Processing of multipart/form-data request failed.
/tmp/jetty-0.0.0.0-8086-test.war-test-
any-/upload_82a2b1c4_53f1_496c_a5be_14e918226973_00001
(No such file or directory) at
org.springframework.web.multipart.commons.CommonsMultipart
at
org.springframework.web.multipart.commons.CommonsMultipart
at
org.springframework.web.servlet.Dispatcher Servlet.checkMutipa
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(D
at
2.错误原因排查:
查看报错信息提示中含有(No such file or directory),意思是找不到文件或者文件夹,而提醒信息中确实含有一个明确的目录
/tmp/jetty-0.0.0.0-8086-test.war-test-any-/upload_82a2b1c4_53f1_496c_a5be_14e918226973_00001
于是登录服务器之后手动在根目录的tmp文件夹下新建对应的文件夹,这个时候用户再次上传文件成功且并未报错
初步判定就是这个文件夹的问题,那么这个文件夹是怎么来的,为什么jetty需要它,而为什么用户操作的时候又找不存在了
3.异常原因:
jetty在运行时,会将war包解压到某一个文件夹中,具体解压的文件夹路径配置在,jetty.sh中(jetty9之后似乎可以配置work目录,但是项目用的jetty8,不支持该操作),而当不修改使用jetty的默认配置时,则是在根目录下的 /tmp文件夹中
而服务器使用的CentOS,默认情况下会定时清理 tmp 文件夹,而该项目使用并不是很频繁,导致过一段时间 tmp 文件夹就会被清空,这个时候用户访问文件上传就会报错
4.解决方法:
1.第一种:直接修改CentOS的清理逻辑
/tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定,在该配置文件中加入 下面的配置,就不会删除固定开头的临时文件
x/tmp/tomcat.* 这里是tomcat
x/tmp/jetty.* 这里是jetty
2.第二种:修改jetty启动脚本
①、首先修改 jetty.sh 将原先的目录配置改为tmp以外的目录,可以直接在jetty目录底下新建目录使用,这样的系统清理tmp文件夹就无所谓了
原先是使用根目录TMP文件夹: TMPDIR=${TMPDIR:-/tmp}
修改为jetty下的目录:TMPDIR=${TMPDIR:-/home/jetty-8.1.17/temp}
②、修改jetty目录下的start.ini ,新增一行命令用来启动的时候指定解压的文件夹
-Djava.io.tmpdir=/home/jetty-8.1.17/temp
修改完成后重启jetty即可正常使用