Spring Boot部署云Tomcat后运行一段时间出现500白标错误页
Hey,我来帮你搞定这个运行一段时间就出现的Whitelabel 500错误~首先得明确,这个默认错误页只是Spring Boot的兜底显示,核心是服务器内部发生了未捕获的异常,但现在没给出具体信息,所以第一步必须拿到详细的错误日志,这是定位问题的关键。
一、先抓准错误日志
云Tomcat的日志一般存放在Tomcat安装目录/logs下,重点盯这几个文件:
catalina.out:Tomcat的主日志,几乎所有应用运行时的异常都会在这儿留下痕迹localhost.log:和本地主机请求相关的日志localhost_access_log.*.txt:记录所有访问请求的路径、参数和时间,能帮你确认是特定请求触发还是全局问题
如果是云服务商提供的托管Tomcat(比如阿里云、腾讯云的Web应用服务),直接去控制台的「日志管理」模块就能查看这些日志,找到触发500的具体异常栈,比如是数据库连接失败、内存爆了还是代码逻辑bug。
二、针对外部Tomcat部署Spring Boot的常见坑
因为你是用外部Tomcat而非Spring Boot内置的,这类场景下运行一段时间出问题,大概率是以下几个原因:
1. 数据库连接池被榨干了
如果你的项目用到数据库(比如MySQL),长时间运行后连接池里的连接都被占用没释放,就会导致新请求拿不到连接抛出异常。
- 去
application.properties/application.yml里检查连接池配置:比如HikariCP的spring.datasource.hikari.maximum-pool-size是否设置合理,别超过数据库本身的最大连接数(MySQL默认一般是151) - 看日志里有没有
Cannot get connection from pool这类关键词
2. 内存溢出(OOM)
运行久了应用内存不够用,触发OutOfMemoryError,直接导致Tomcat卡壳或请求失败。
- 去
catalina.out里搜OutOfMemoryError,一搜一个准 - 可以给Tomcat加JVM参数优化:比如
-Xmx2g -Xms1g(根据服务器配置调整大小),再加个内存溢出dump日志参数:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof,方便后续分析内存泄漏点
3. Spring Boot打包配置不对
确保你是打包成war包而非jar包,而且pom.xml里的Tomcat依赖配置正确:
<!-- 移除内置Tomcat,避免和外部Tomcat冲突 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Tomcat Servlet API依赖,范围设为provided,避免打包进去 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>和你的云Tomcat版本对应</version> <scope>provided</scope> </dependency> <!-- 明确打包为war包 --> <packaging>war</packaging>
另外,启动类必须继承SpringBootServletInitializer并重写configure方法,不然外部Tomcat没法正确加载你的Spring Boot应用:
@SpringBootApplication public class CrmApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(CrmApplication.class); } public static void main(String[] args) { SpringApplication.run(CrmApplication.class, args); } }
4. 云服务器资源不够用
有些基础款云服务器的CPU、内存配置太低,当应用并发上来或者后台任务跑起来后,资源直接被占满,导致请求处理超时触发500。去云服务器的监控面板看看CPU、内存、磁盘IO的使用率是不是飙到顶了。
5. 定时/异步任务的内存泄漏
如果项目里有定时任务、异步线程,可能存在资源没释放的情况(比如数据库连接没关、文件流没close、线程没正确终止),长时间积累就会导致内存泄漏,最后OOM。得检查这类代码的资源释放逻辑。
三、临时应急:让错误页显示详细信息
如果不想马上翻日志,可以先在application.properties里加这几个配置,让错误页直接显示异常栈:
# 开启详细错误信息 server.error.include-exception=true server.error.include-stacktrace=always server.error.path=/error
注意生产环境别一直开着,避免泄露敏感代码信息,排查完就关掉。
内容的提问来源于stack exchange,提问作者Neha Vaidya

