Tomcat 8.5.x版本HTTP/2不支持GZIP压缩问题咨询
这个问题的核心是Tomcat 8.5与Tomcat 9在HTTP/2压缩配置的逻辑上存在关键差异,具体原因拆解如下:
Tomcat 8.5的HTTP/2模块独立处理压缩配置
在Tomcat 8.5版本中,HTTP/2协议的压缩规则由Http2Protocol模块单独管控,它不会读取Connector节点下的压缩相关参数(比如compression、compressableMimeType这类配置)。你之前在8.5版本里把所有压缩参数都放在<Connector>节点下,这部分配置仅对HTTP/1.1请求生效,HTTP/2模块完全识别不到这些设置,自然不会对响应执行GZIP压缩。Tomcat 9优化了压缩配置的兼容性
Tomcat 9重构了HTTP/2的压缩处理逻辑:一方面支持将压缩参数直接配置在UpgradeProtocol节点内(就像你调整后的配置那样),另一方面也能复用Connector节点的压缩配置,让HTTP/2和HTTP/1.1共用一套压缩规则。这也是为什么你切换到Tomcat 9并调整配置后,GZIP压缩立刻生效的原因。Tomcat 8.5分支的设计局限
即便升级到Tomcat 8.5.31,这个设计局限依然存在——因为Tomcat 8.5作为稳定维护分支,仅做bug修复,不会引入Tomcat 9的架构级改动。如果要在Tomcat 8.5里让HTTP/2支持GZIP压缩,你需要把压缩参数从Connector节点移到UpgradeProtocol节点内部,配置方式和你在Tomcat 9里使用的一致。
举个Tomcat 8.5的正确HTTP/2压缩配置示例:
<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" compression="on" compressionMinSize="1024" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-key.pem" certificateFile="conf/localhost-cert.pem" certificateChainFile="conf/cacert.pem" type="RSA" /> </SSLHostConfig> </Connector>
这样配置后,Tomcat 8.5的HTTP/2响应就会正常触发GZIP压缩,和HTTP/1.1的表现一致。
内容的提问来源于stack exchange,提问作者sarita

