首页 文章

Tomcat 8.5.29 HTTP / 2不支持GZIP压缩

提问于
浏览
1

我正在使用Tomcat 8.5.29并使用相应的配置,我已经为该站点启用了HTTP2支持 . 以下是server.xml文件中的配置 .

<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" compression="on" compressionMinSize="1024"
           >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
        <Certificate certificateKeyFile="conf/localhost-key.pem"
                     certificateFile="conf/localhost-cert.pem"
                     certificateChainFile="conf/cacert.pem"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

当我试图比较支持HTTPS 1.1和HTTP2的站点的页面加载时间时,它不一致 . 有时它需要更多的时间来加载,有时它加载的时间比HTTPS 1.1要少 .

要衡量页面加载时间,我使用Chrome浏览器中的开发人员工具 .

后来,我发现HTTP / 2的加载时间更长,因为响应中的“content-encoding”不是gzip . 使用HTTP / 1.1,脚本文件大小为4 MB(gzip),与HTTP / 2一样,同一文件大小为8 MB(无内容编码) . 压缩没有发生 . 我们也尝试使用useSendfile和压缩作为“强制”,但它没有用 .

我们也试过Tomcat版本8.5.31,但没有运气!面对同样的问题 .

我们使用了Tomcat版本9并使用以下配置,获得了gzip(压缩)内容 . 现在文件大小减少了2 MB,快速页面加载 .

<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不支持HTTP2的gzip . 有什么想法吗?

2 回答

  • 1

    根据Tomcat documentation

    注意:在使用压缩(节省带宽)和使用sendfile功能(节省CPU周期)之间需要权衡 . 如果连接器支持sendfile功能,例如使用sendfile的NIO2连接器优先于压缩 . 症状将是静态文件大于48 Kb将被解压缩 . 您可以通过设置协议的useSendfile属性来关闭sendfile,如下所述,或者在默认conf / web.xml或Web应用程序的web.xml中更改DefaultServlet配置中的sendfile使用率阈值 .

    因此,请尝试将useSendfile =“false”添加到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" />
    

    请注意,此选项不会出现在8.5 documentation中,因此不确定它是否存在(有一个对它的引用"You can turn off sendfile by setting useSendfile attribute of the protocol, as documented below"但后面没有任何内容),尽管您也可以在服务器级别关闭 .

    奇怪的是,如果不关闭此选项,我不会期望这在Tomcat 9中工作,但你说它确实如此?你确定你还没有关闭它吗?或者您正在使用小于48KB的文件进行测试?

  • 1

    Tomcat 8.5.33修复了这个问题;压缩与http / 2一起使用 .

相关问题