You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:08:10