Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩

2024-04-17

我正在使用 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。对此有什么想法吗?


根据Tomcat 文档 https://tomcat.apache.org/tomcat-9.0-doc/config/http2.html:

注意:使用压缩(节省带宽)和使用 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 文档 https://tomcat.apache.org/tomcat-8.5-doc/config/http2.html所以不确定它是否存在(有一个参考“您可以通过设置协议的 useSendfile 属性来关闭 sendfile,如下所述”,但下面什么也没有),尽管您也可以在服务器级别关闭。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩 的相关文章

随机推荐

  • 错误:BUG!源单元“_BuildScript_”中“类生成”阶段出现异常,目标模块不受支持

    我正在尝试创建一个新的Java 9项目使用gradle但在项目创建后 我收到了来自 gradle 的错误 Error BUG exception in phase class generation in source unit BuildS
  • 多个文件中的多次包含

    我正在制作一个小游戏 在BattleRecord h中 ifndef CHARACTER H define CHARACTER H include Character h endif class BattleRecord public Ch
  • 函数 session_start() 出现问题(运行缓​​慢)

    我有一个问题session start 在主服务器上 当我第一次加载页面时 完成请求只需要不到 1 秒的时间 如果我等待大约 12 15 秒 然后重新加载页面 加载时间将是相同的 但是 当我尝试在初始加载后 3 或 5 秒后刷新页面时 服务
  • Javascript对象:迭代属性[重复]

    这个问题在这里已经有答案了 我有一个变量 当打印到控制台时 它看起来像这样 Object PK 34 PK 35 我向该变量添加一个 size 方法 Model value size function obj var size 0 key
  • 在 Flask 中使用 SqlAlchemy 模型

    我使用 SqlAlchemy 创建了一些模型来最初设置数据库 最初 我解析一些 XML 文件并填充数据库 这是一次性的事情 当我在服务器上设置应用程序时需要完成 Base declarative base class Movie Base
  • 无法打开目标 = 空白的 Electron webview 链接

    我正在使用 Electron 我有一个显示外部网站的 webview 但我无法成功显示通常由该网站上的链接打开且目标 blank 的附加窗口 a href mentions html target blank Mentions l gale
  • java:在一个Web应用程序中使用同一库的两个版本

    我面临以下问题 我的 web 应用程序中有一个模块需要 jaxb 1 x 而另一个模块需要 jaxb 2 x 第一个模块不适用于新版本的 jaxb 反之亦然 如何在一个项目中使用这两个罐子 谢谢 对于常规应用程序 通常不同的版本使用不同的包
  • 设置 cassandra.logdir 的最佳方法是什么

    我已将 cassandra 软件放入 home user所有日志文件应放置在 data log Cassandra 具有文件conf logback xml 其中包含用于确定文件日志路径的参数 例如 cassandra logdir sys
  • 在 VS 2010 中禁用 WPF 设计器?

    有没有办法在 VS 2010 中禁用 WPF 设计器 预览窗格 我只需要带有智能感知的 XAML 窗格 请注意 当hidingWPF 设计器的设计视图 它仍然会呈现表单 控件 我不认为disabled 我只看到 打开方式 XML 编辑器 解
  • 使用 Actionscript 3 连接到数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找有关如何基于数据库在 Flash 中动态创建内容的建议 最初我想将数据库导出到 XML 文件并使用内置的 Actionscr
  • 如何在 Maven 3 站点插件中禁用测试 Javadoc 报告的生成?

    这是我的pom xml 我正在尝试禁用Test Javadoc报到site
  • 如何修复 VS Code 中的错误文件描述符错误?

    我有 vsc 版本 1 63 2 我收到以下通知 文件更改观察程序意外停止 重新加载窗口可能会再次启用观察程序 除非无法监视工作区的文件更改 在 窗口 日志 使用命令面板中的 开发人员 打开日志文件 命令打开 中 出现错误 renderer
  • 使用 R 中的传单库绘制跨越国际日期变更线的路线

    我有兴趣使用 R 的传单库绘制从滑铁卢到台湾的路线 路线的坐标是使用 geosphere 中的 gcIntermediate 函数获得的 然而 该路线涉及穿越国际日期变更线 因此该路线在地图边缘被切断 并在顶部与直线连接 我得到的情节 错误
  • JUnit 5 何时提供场景测试?

    在一次会议 JavaForum Stuttgart 2016 上 他们表示 JUnit 5 将包含一个支持场景测试的功能 http 2016 java forum stuttgart de de Abstracts Slot 1 html
  • Keras LSTM 输入形状的输入形状错误

    在 Keras 中使用时间序列时出现此错误 ValueError Error when checking input expected lstm 1 input to have 3 dimensions but got array with
  • Swift 中基于内容的动态 UITextView 大小

    我不认为有人可以指导我在仍然使用自动布局的同时动态调整 UITextView 大小的正确方法 使用 Swift 就是这样 我尝试以编程方式调整底部约束 试图让 UITextView 拥抱内容 但我不知道如何获取 UITextView 内容的
  • TinyMCE 在 DOM 中渲染后执行操作

    我正在使用 TinyMCE 4 并按如下方式设置 tinyMCE init mode specific textareas editor selector basicTinyMCE theme modern readonly false 我
  • 长度为 5 的回文数

    给定一个二进制字符串 S 找到长度为 5 的回文子序列的数量 长度为 5 的回文子序列是数组 a 我的想法 我想出了如下的递归 palin s palin s 1 palin s 1 palin s 1 1 当 s 0 s 1 时 就是上面
  • Tomcat:绕过指定 IP 地址的基本身份验证

    我已经配置 tomcat 进行基本身份验证 我不希望任何人访问我的 Web 应用程序 但该应用程序正在提供 Web 服务 所以我想从基本身份验证中绕过特定的IP地址 该IP不应该需要身份验证 tomcat users xml
  • Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩

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