tomcat http2 gzip的开启

昨天把nginx给去掉了,想尝试下servlet 4.0的server push,那个坑是一个接一个,好不容易都给填平了,也顺利开启http2了,但发现gzip没有起作用,我的connector是这样的:

<Connector SSLEnabled="true" maxThreads="150" port="443"
    protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    maxSwallowSize="-1" compression="on"
    useSendfile="false">
    <UpgradeProtocol
        className="org.apache.coyote.http2.Http2Protocol"/>
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="f:/server.jks"
            certificateKeystorePassword="server" />
    </SSLHostConfig>
</Connector>

根据官网的描述,只要设置compression为on就可以开启gzip了,(顺便说下compressableMimeType这个属性,在官方文档里,人家在6.0及以前叫这个,但是7.0及以后改名叫 compressibleMimeType…),但是我这里并没有工作,尝试删除 UpgradeProtocol标签之后发现可以顺利开启gzip,所以因该是http2的原因,google了一下之后发现,这原来是个bug: https://bz.apache.org/bugzilla/show_bug.cgi?id=60276#c10

但这个bug早在9.0.3以及8.5.25之后就被修复了,但我是9.0.7,并没有按照预期工作,但上面官方的回复很坚决,大意就是我们已经解决这个bug了,而且已经在很多案例中通过了,你现在碰到的问题不是一个bug,而是你的配置不对。。。于是只能再次搜索解决办法,终于在 https://stackoverflow.com/questions/50432847/tomcat-8-5-29-http-2-is-not-supporting-gzip-compression 这个链接中看到 原来UpgradeProtocol也能加这样这样的属性。。。

<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" useSendfile="false" />

顺便看下 server push的效果: QQ截图20180603102133.png
QQ截图20180603101955.png