Spring Boot 内置 Undertow 容器 MP4 播放异常排查
在 Spring Boot 项目开发中,将默认 Web 容器从 Tomcat 替换为高性能的 Undertow 是一个常见需求。但在实测中发现,使用 Spring Boot 2.2.11 至 2.2.13 等特定版本搭配 Undertow 时,通过 WebMvcConfigurer 映射的本地路径静态资源(特别是 MP4 视频文件)会出现无法正常加载的情况。本文总结了环境搭建步骤,分析了潜在问题原因,并给出了调整容器配置、更换服务器组件及优化架构的具体建议。
实验环境与前置准备
为了复现该问题并验证相关容器配置,本次测试的基础环境如下:
- 操作系统:Windows 7
- 开发工具:Eclipse
- JDK 版本:JDK 1.8
- 构建工具:Maven 3.3.9
- 核心框架:Spring Boot 2.2.x
第一步:Maven 依赖配置
首先需要移除 Spring Boot 默认的 Tomcat 依赖,并引入 Undertow 容器支持。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yelang</groupId>
<artifactId>undertowdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Undertow测试</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除掉默认支持的 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Undertow 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
</project>
第二步:Undertow 参数配置
在 application.yml 中对 Undertow 进行基础参数调优,涉及缓冲区大小、直接内存分配及线程池设置。
# undertow 配置
server:
undertow:
max-http-post-size: -1 # HTTP post内容的最大大小
buffer-size: 512 # buffer的空间大小
direct-buffers: true # 是否分配的直接内存
threads:
io: 8 # IO线程数,每个CPU核心一个线程
worker: 256 # 阻塞任务线程池,视系统负载而定
第三步:配置静态资源映射
通过实现 WebMvcConfigurer 接口,将本地物理路径映射到 URL 路径,以便访问外部文件(如上传的视频)。同时保留 Swagger 相关资源的映射。
package com.yelang.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 本地文件上传路径映射
registry.addResourceHandler("/profile/**")
.addResourceLocations("file:D:/wzh/uploadPath/");
// swagger配置
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
完成上述配置后,启动项目并将测试用的 MP4 文件放置于 D:/wzh/uploadPath/ 目录下。理论上可以通过 http://localhost:8080/profile/2.mp4 正常访问该视频。

遇到的坑:特定版本的资源加载失败
尽管配置看似完整且符合规范,但在实际测试中使用 Spring Boot 2.2.11、2.2.12 和 2.2.13 版本时,发现 MP4 等资源文件均无法加载。这可能与这些版本底层针对静态资源处理的一些机制变更有关。如果生产环境恰好部署了这几个版本的 Spring Boot + Undertow 组合,将面临业务风险。
Spring Boot 如何选择:Tomcat 还是 Undertow?
Spring Boot 默认内嵌的是 Tomcat 容器,绝大多数开发者对其最为熟悉。然而,随着业务对性能要求的提高,Undertow 逐渐进入视野。它由 Red Hat 开源,完全采用 Java 编写,灵活支持阻塞和非阻塞 I/O,在高并发场景下表现优异。新版 Undertow 默认启用持久连接,进一步提升了并发吞吐能力。
压测性能与内存对比
在相同机器配置与请求模拟条件下,对 Tomcat 和 Undertow 进行 QPS(每秒查询率)及内存占用测试:




从 QPS 测试结果来看:


从内存使用对比来看:


数据显示,在处理相等请求数时,Undertow 在性能和内存利用率上均优于 Tomcat。因此,对于高并发业务系统,Undertow 是更为理想的选择。
生产环境的修复方案建议
如果在生产环境中必须使用受影响的 Spring Boot 2.2.x 系列版本与 Undertow,导致 MP4 等静态资源无法预览,可参考以下解决策略:
- 版本回退/升级:尝试调整 Spring Boot 或 Undertow 的版本,避开已知的问题版本区间。
- 引入专业 Web 服务器:不再利用 Spring Boot 的内嵌容器提供大文件或视频资源,而是改用
Nginx等专业静态资源服务器进行代理或直接托管。 - 迁移至第三方存储:采用对象存储服务或专用的分布式文件系统来管理非结构化数据。
- 换回 Tomcat:如果项目复杂度不高且对极致性能要求不迫切,直接将容器替换回默认的 Tomcat 是最快速的兼容手段。
以上就是关于 Spring Boot 集成 Undertow 引发静态资源无法访问问题的详细内容,更多关于 Spring Boot 容器选型与优化避坑的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









