我正在使用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。对此有何想法?
答案 0 :(得分:2)
Tomcat 8.5.33修复了此问题;压缩将与http / 2一起使用。
答案 1 :(得分:1)
注意:在使用压缩(节省带宽)和使用sendfile功能(节省CPU周期)之间需要权衡。如果连接器支持sendfile功能,例如使用sendfile的NIO2连接器优先于压缩。症状将是静态文件大于48 Kb将被解压缩。您可以通过设置协议的useSendfile属性来关闭sendfile,如下所述,或者在默认conf / web.xml或Web应用程序的web.xml中更改DefaultServlet配置中的sendfile使用率阈值。 p>
因此,请尝试将useSendfile =“false”添加到UpgradeProtocol设置
infile
注意此选项不会出现在8.5 documentation中,因此不确定它是否存在(存在对它的引用“您可以通过设置协议的useSendfile属性来关闭sendfile,如下所述”但是虽然你也可以在服务器级别关闭。
奇怪的是,如果没有关闭此选项,我不会期望这在Tomcat 9中有效,但你说它确实如此?你确定你没有关闭它吗?或者您正在使用小于48KB的文件进行测试?