【问题标题】:Tomcat 8.5.29 HTTP/2 is not supporting GZIP compressionTomcat 8.5.29 HTTP/2 不支持 GZIP 压缩
【发布时间】:2018-10-30 03:58:48
【问题描述】:

我正在使用 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 的加载时间更长,因为响应中的“内容编码”不是 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。对此有什么想法吗?

【问题讨论】:

    标签: gzip tomcat8 http2


    【解决方案1】:

    根据Tomcat documentation:

    注意:在使用压缩(节省带宽)和使用 sendfile 功能(节省 CPU 周期)之间需要权衡。如果连接器支持 sendfile 功能,例如NIO2 连接器,使用 sendfile 将优先于压缩。症状是大于 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中,所以不确定它是否存在(有一个对它的引用“你可以通过设置协议的useSendfile属性来关闭sendfile,如下所述”但是没有下面),尽管您也可以在服务器级别关闭。

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

    【讨论】:

    【解决方案2】:

    Tomcat 8.5.33 修复了这个问题;压缩适用于 http/2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多