Spring Boot是否支持提供预压缩资源?类似Nginx的gzip_static功能
Spring/Spring Boot 实现预压缩静态资源(类似Nginx
gzip_static) 当然可以!Spring Boot完全支持提供预压缩的静态资源,和你说的Nginx gzip_static on效果一致——客户端带Accept-Encoding: gzip请求头时,直接返回预先压缩好的.gz文件,不用实时压缩浪费CPU资源。下面我一步步给你讲具体实现方式:
一、开启预压缩资源自动匹配
Spring Boot本身内置了这个功能的支持,你只需要在配置文件里加几行配置就能启用:
如果用application.yml:
spring: web: resources: chain: compressed: true # 开启预压缩资源的自动识别
如果用application.properties:
spring.web.resources.chain.compressed=true
开启这个配置后,当客户端请求/css/main.css且携带Accept-Encoding: gzip时,Spring Boot会自动去查找同目录下的main.css.gz文件,存在的话直接返回这个预压缩文件,完全跳过实时压缩步骤。
二、预先压缩静态资源
接下来你需要把静态文件夹里的资源预先压缩成.gz格式,这里有两种实用方式:
- 手动压缩:用系统的
gzip命令处理,比如gzip -k main.css(-k参数会保留原文件),把生成的.gz文件和原文件放在同一个静态目录下(比如src/main/resources/static/css/)就行。 - 构建时自动压缩:更高效的方式是让构建工具帮你自动做这件事。比如Maven可以用
maven-assembly-plugin或者frontend-maven-plugin(针对前端资源);Gradle可以配合com.github.gradle-node插件,用Webpack、Gulp这类前端工具在构建时自动压缩生成.gz文件,这样每次打包都会自动处理,不用手动操作。
三、嵌入式Web服务器的优化配置
不同的嵌入式服务器(Tomcat、Undertow、Jetty)可以做一些额外配置来优化这个功能:
Tomcat
Tomcat原生支持预压缩资源的查找,开启上面的Spring Boot配置后就会自动生效。如果你需要更精细的控制(比如指定可压缩的MIME类型、缓存头),可以自定义Tomcat配置:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatResourceConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() { return factory -> factory.addConnectorCustomizers(connector -> { // 配置允许压缩的MIME类型,只针对文本类资源 connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"); }); } }
注意:开启预压缩资源后,Tomcat会优先返回.gz文件,不会再对原文件做实时压缩。
Undertow
Undertow同样支持这个功能,Spring Boot的配置会自动触发它的预压缩资源匹配。如果需要调整细节,可以自定义Undertow的配置:
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class UndertowResourceConfig { @Bean public WebServerFactoryCustomizer<UndertowServletWebServerFactory> undertowCustomizer() { return factory -> factory.addBuilderCustomizers(builder -> { // 这里可以添加Undertow的资源处理优化,比如调整缓存策略 // builder.setServerOption(...) }); } }
四、几个重要的注意点
- 确保
.gz文件和原文件的修改时间一致,不然Spring Boot的缓存策略可能会返回错误的资源。 - 不要压缩已经是压缩格式的文件(比如图片、视频、PDF),这类文件压缩后体积不会变小,反而会浪费存储和带宽。只需要压缩文本类资源:CSS、JS、HTML、JSON等。
- 测试的时候一定要在请求头里带上
Accept-Encoding: gzip,不然服务器会默认返回原文件。
内容的提问来源于stack exchange,提问作者JGrassini
相关产品推荐
相关产品推荐

