需在server.xml的connector节点配置compression="on"、compressablemimetype和compressionminsize;spring boot的server.compression.*仅对内嵌tomcat生效,外置部署必须改server.xml;压缩后content-length消失、变为chunked属正常。

Tomcat 的 server.xml 里怎么开 GZIP 压缩
默认不开启,必须手动配置 Connector 节点。只改 web.xml 或 Spring Boot 配置没用,因为压缩发生在容器层。
在 $CATALINA_HOME/conf/server.xml 中找到 <connector></connector> 标签,加上这三组属性:
-
compression="on":必须设为"on","force"会强制压缩所有响应(包括小文件),一般不用 -
compressableMimeType="text/html,text/xml,text/plain,application/json,application/javascript":明确指定哪些 MIME 类型可压,别漏掉application/json,否则 API 返回体不压缩 -
compressionMinSize="1024":单位字节,建议设为1024(1KB)以上才压,太小的响应压了反而增加 CPU 开销和传输延迟
Spring Boot 项目里为什么加了 server.compression.* 还是没效果
因为 Spring Boot 内嵌 Tomcat 时,server.compression.* 配置只对内嵌容器生效;但如果你打的是 WAR 包、部署到独立 Tomcat,这些配置完全被忽略——它根本没机会运行。
判断方式很简单:ps aux | grep tomcat 看进程路径,或检查启动日志里有没有 Tomcat started on port(s): 8080 这类提示。有就是内嵌,没就是外置。
- 内嵌场景:用
server.compression.enabled=true即可,但注意server.compression.mime-types必须显式列出application/json - 外置场景:删掉所有
server.compression.*,直接去server.xml改 Connector - 混合部署(如用
spring-boot-starter-tomcat但又想复用公司统一 Tomcat):以server.xml为准,Boot 配置无效
开了压缩但 Chrome Network 里看不到 Content-Encoding: gzip
常见原因不是配置错,而是响应体太小、或者被中间件/代理提前截断了。
- 检查响应体大小:用
curl -I -H "Accept-Encoding: gzip" http://localhost:8080/api/data,看返回头里有没有Content-Encoding: gzip;如果没,再看Content-Length是否小于你设的compressionMinSize - Nginx 反向代理时,必须加
gzip_proxied any;,否则 Nginx 默认不转发压缩后的响应给客户端 - 某些安全网关(如 AWS ALB、Kong)默认解压再转发,此时浏览器看到的是解压后的内容,但服务端其实已压缩——得看网关日志或抓包确认
- Chrome DevTools 的 Network 面板有时会自动解压显示,勾选 “Disable cache” 并刷新,再点响应头栏确认原始 header
压缩对性能和兼容性有什么实际影响
压缩本身是 CPU 密集型操作,尤其高并发下容易成为瓶颈;但对移动端或弱网用户,节省带宽的价值远大于这点开销。
- 不要对图片、PDF、ZIP 等本就压缩过的格式再启用压缩,Tomcat 不会智能跳过,反而白耗 CPU
- IE6/7 对
Transfer-Encoding: chunked+Content-Encoding: gzip组合支持不稳定,但现代项目基本不用考虑 - Java 8u20+ 的 GZIP 实现比老版本快约 20%,如果还在用 Java 7 或早期 Java 8,升级 JVM 比调参数更有效
- 如果用了
response.getOutputStream()手动写响应(比如导出 Excel),GZIP 会失效——因为压缩器只作用于 ServletOutputStream 封装逻辑,绕过它就等于绕过压缩
真正容易被忽略的是:压缩开关打开后,Content-Length 头会消失,变成 Transfer-Encoding: chunked,这是正常行为。别因此怀疑配置失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











