java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot项目未访问导致Tomcat被删除

SpringBoot项目长时间未访问导致Tomcat临时文件夹被删除的解决方案

作者:qq_29757467

做SpringBoot开发的同学,大概率会遇到一个隐蔽的坑:项目部署在Linux服务器上,但如果系统长时间(比如10天)无人访问,再次上传文件就会报错,排查半天找不到原因,其实这个问题的根源,和Tomcat的临时文件夹密切相关,今天就带大家彻底搞懂这个问题,从原因到解决方案

引言

做SpringBoot开发的同学,大概率会遇到一个隐蔽的坑:项目部署在Linux服务器上,通过java -jar启动后,文件上传功能一切正常,但如果系统长时间(比如10天)无人访问,再次上传文件就会报错,排查半天找不到原因,最后重启项目又神奇恢复了。

其实这个问题的根源,和Tomcat的临时文件夹、Linux系统的临时文件清理机制密切相关。今天就带大家彻底搞懂这个问题,从原因到解决方案,一步到位,再也不用靠“重启救急”。

一、问题复现:隐蔽且易忽略

先明确问题场景,避免大家对号入座出错:

二、问题根源:两步拆解,一看就懂

这个问题不是SpringBoot的bug,也不是Tomcat的问题,而是「Tomcat临时文件存储机制」和「Linux临时文件清理机制」共同作用的结果,拆解成两步就能明白:

1. Tomcat临时文件夹的作用

当我们用SpringBoot Jar包启动项目时,SpringBoot会内置一个Tomcat容器。当项目中存在「文件上传」功能时,上传的文件并不会直接被处理,而是先转换成临时文件,存放在Tomcat的临时文件夹中,处理完成后再删除临时文件(或保留,取决于业务逻辑)。

重点:SpringBoot内置Tomcat,在Linux环境下,默认的临时文件夹路径是 /tmp/ 目录下(比如 /tmp/tomcat.xxxxxx.xxxx/ ),这个路径是Tomcat自动生成的,无需手动配置。

2. Linux系统的临时文件清理规则

Linux系统为了避免/tmp目录占用过多磁盘空间,有一个默认的临时文件清理机制(由tmpwatch或systemd-tmpfiles服务管理),核心规则是:

「/tmp目录下的文件/文件夹,如果连续10天没有被访问、修改,就会被系统自动删除」。

3. 问题闭环

系统长时间无人访问 → /tmp目录下的Tomcat临时文件夹10天未被 操作 → 被Linux系统自动删除 → 再次上传文件时,Tomcat无法找到临时文件夹存放临时文件 → 上传失败 → 重启项目后,Tomcat重新生成临时文件夹 → 功能恢复。

三、解决方案:两种方式,按需选择

针对这个问题,有两种解决方案,一种是临时救急,一种是彻底根治,大家可以根据自己的部署场景选择。

方案1:临时救急(快速恢复,适合紧急情况)
最简单、最快的方式,就是重启SpringBoot项目。

重启命令(根据自己的项目部署方式调整):

# 1. 查找项目进程(假设项目Jar包名为xxx.jar)
ps -ef | grep xxx.jar
# 2. 杀死进程(替换为查到的进程ID)
kill -9 进程ID
# 3. 重启项目(后台启动,日志输出到nohup.out)
nohup java -jar xxx.jar 

原理:重启项目后,SpringBoot内置的Tomcat会重新在/tmp目录下生成临时文件夹,恢复临时文件存储功能。
缺点:治标不治本,下次系统长时间未访问,问题还会重复出现;如果项目有状态(比如未持久化的会话),重启会导致状态丢失。

方案2:彻底根治(推荐,一劳永逸)
核心思路:修改Tomcat的临时文件夹路径,将临时文件夹从Linux的/tmp目录(会被自动清理),迁移到自定义目录(不会被系统自动清理)。

具体操作:在SpringBoot的配置文件(application.yml 或 application.properties)中,配置Tomcat的basedir属性,指定自定义临时目录。

重点:yml配置示例(直接复制可用,适配大部分场景)

# 开发/生产环境通用配置
server:
  # 服务器HTTP端口(根据自己的需求调整)
  port: 6116
  servlet:
    # 应用访问路径(默认/,无需修改)
    context-path: /
  tomcat:
    # Tomcat URI编码(避免中文乱码,必配)
    uri-encoding: UTF-8
    # Tomcat最大线程数(根据服务器配置调整,默认200)
    max-threads: 800
    # Tomcat初始化线程数(默认25,优化后提升启动速度)
    min-spare-threads: 30
    # 关键配置:自定义Tomcat临时文件夹路径(避免被Linux清理)
    # 注意:Linux环境请配置绝对路径,比如 /home/tomcat/tmp
    # Windows环境可配置 D:\\tmp(双反斜杠转义)
    # 此处为  linux环境可配置
    basedir: /home/tomcat/tmp

配置说明(避坑重点)

权限配置命令(Linux环境必看)
如果配置后报错“权限不足”,执行以下命令赋予权限(替换目录路径和用户名):

# 1. 创建自定义临时目录(如果Tomcat未自动创建)
mkdir -p /home/tomcat/tmp
# 2. 赋予权限(假设启动用户是java,替换为自己的用户)
chown -R java:java /home/tomcat/tmp
# 3. 赋予读写执行权限
chmod -R 755 /home/tomcat/tmp

四、补充注意事项(避坑必看)

  1. 不要将临时目录配置在/tmp、/var/tmp等系统默认临时目录下,这些目录都会被系统定期清理;
  2. 自定义临时目录无需担心磁盘占用:Tomcat会自动清理过期的临时文件(比如上传完成后的临时文件),无需手动删除;
  3. 如果项目部署在Docker容器中,除了配置basedir,还需要将自定义临时目录挂载到宿主机,避免容器重启后临时文件丢失;
  4. 排查技巧:如果不确定临时文件夹是否被删除,可以通过 ls /tmp | grep tomcat 命令查看,若没有相关文件夹,说明已被系统清理。

五、总结

SpringBoot项目长时间未访问,Tomcat临时文件夹被删除的问题,本质是「系统清理机制」和「Tomcat默认配置」的冲突。

紧急情况用「重启项目」快速恢复,生产环境推荐用「配置Tomcat自定义临时目录」彻底根治,配置简单、一劳永逸,还能避免后续重复踩坑。

如果大家在配置过程中遇到权限报错、路径解析错误等问题,可以在评论区留言,我会及时回复排查思路~

以上就是SpringBoot项目长时间未访问导致Tomcat临时文件夹被删除的解决方案的详细内容,更多关于SpringBoot项目未访问导致Tomcat被删除的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文