我正在使用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 回答
根据Tomcat documentation:
因此,请尝试将useSendfile =“false”添加到UpgradeProtocol设置中
请注意,此选项不会出现在8.5 documentation中,因此不确定它是否存在(有一个对它的引用"You can turn off sendfile by setting useSendfile attribute of the protocol, as documented below"但后面没有任何内容),尽管您也可以在服务器级别关闭 .
奇怪的是,如果不关闭此选项,我不会期望这在Tomcat 9中工作,但你说它确实如此?你确定你还没有关闭它吗?或者您正在使用小于48KB的文件进行测试?
Tomcat 8.5.33修复了这个问题;压缩与http / 2一起使用 .