server.xml 之 HTTP/2

介绍

HTTP 升级协议元素表示支持 HTTP/2 协议的升级协议组件。此组件的实例必须与现有的 HTTP/1.1 连接器相关联。

HTTP/2 连接器使用非阻塞 I/O,只有在有数据要读取和写入时才使用线程池中的容器线程。然而,由于 Servlet API 基本上是阻塞的,每个 HTTP/2 流在该流的持续时间内都需要一个专用的容器线程。

使用 HTTP/2 处理的请求将具有以下可用的附加请求属性:

  • org.apache.coyote.connectionID 将返回 HTTP/2 连接 ID

  • org.apache.coyote.streamID 将返回 HTTP/2 流 ID

示例

下面是 %TOAMC_HOME%/conf/server.xml 配置文件中部门配置,如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
        <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                     certificateFile="conf/localhost-rsa-cert.pem"
                     certificateChainFile="conf/localhost-rsa-chain.pem"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

属性

通用属性

升级协议的所有实现都支持以下属性:

className

必须是 org.apache.coyote.http2.Http2Protocol。

标准实现

HTTP/2 升级协议实现除了上面列出的通用属性外,还支持以下属性。

allowedTrailerHeaders

默认情况下,Tomcat 将在处理 HTTP/2 连接时忽略所有尾部标头。对于要处理的标头,必须将其添加到以逗号分隔的标头名称列表中。

compressibleMimeType

该值是可以使用 HTTP 压缩的 MIME 类型的逗号分隔列表。默认值为 text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml 。

compression

HTTP/2 协议可能会使用压缩来尝试节省服务器带宽。参数的可接受值为“off”(禁用压缩)、“on”(允许压缩,这会导致文本数据被压缩)、“force”(在所有情况下强制压缩)或数字整数值(即 等价于“on”,但指定输出压缩前的最小数据量)。如果内容长度未知并且压缩设置为“开”或更激进,则输出也将被压缩。如果未指定,则此属性设置为“off”。

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

compressionMinSize

如果将压缩设置为“on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,则此属性默认为“2048”。

initialWindowSize

控制 Tomcat 向客户端通告的流的流控制窗口的初始大小。如果未指定,则使用默认值 65535。

keepAliveTimeout

在关闭连接之前,当没有活动的 Stream 时,Tomcat 在 HTTP/2 帧之间等待的时间(以毫秒为单位)。负值将被视为无限超时。如果未指定,将使用默认值 20000。

maxConcurrentStreamExecution

控制可以从容器线程池分配线程的任何一个连接的最大流数。 如果活动的流多于可用的线程,则这些流将不得不等待流变得可用。 如果未指定,将使用默认值 20。

maxConcurrentStreams

控制任何一个连接允许的最大活动流数。 如果客户端尝试打开比此限制更多的活动流,则流将被重置并出现 STREAM_REFUSED 错误。 如果未指定,将使用默认值 100。

maxHeaderCount

容器允许的请求中的最大标头数。包含超过指定限制的标头的请求将被拒绝。小于 0 的值表示没有限制。如果未指定,则使用默认值 100。

maxHeaderSize

容器允许的请求中所有标头的最大总大小。 标头的总大小计算为标头名称的未压缩大小(以字节为单位),加上标头值的未压缩大小(以字节为单位)加上每个标头 3 个字节的 HTTP/2 开销。 包含一组需要超过指定限制的标头的请求将被拒绝。 小于 0 的值表示没有限制。 如果未指定,则使用默认值 8192。

maxTrailerCount

容器允许的请求中的最大尾部标头数。包含比指定限制更多的尾部标头的请求将被拒绝。小于 0 的值表示没有限制。如果未指定,则使用默认值 100。

maxTrailerSize

容器允许的请求中所有尾部标头的最大总大小。标头的总大小计算为标头名称的未压缩大小(以字节为单位),加上标头值的未压缩大小(以字节为单位)加上每个标头 3 个字节的 HTTP/2 开销。包含一组需要超过指定限制的尾部标头的请求将被拒绝。 小于 0 的值表示没有限制。如果未指定,则使用默认值 8192。

noCompressionStrongETag

此标志配置是否考虑压缩具有强 ETag 的资源。如果为真,则不会压缩具有强 ETag 的资源。默认值是true。

此属性已弃用。它将在 Tomcat 10 及以后的版本中被删除,在那里它将被硬编码为 true。

noCompressionUserAgents

该值是一个正则表达式(使用 java.util.regex),它与不应使用压缩的 HTTP 客户端的用户代理标头匹配,因为这些客户端虽然确实宣传了对该功能的支持,但其实现已损坏。 默认值为空字符串(禁用正则表达式匹配)。

overheadContinuationThreshold

低于该阈值的非最终 CONTINUATION 帧的有效负载大小将触发开销计数的增加(请参阅overheadCountFactor)。开销计数将通过overheadContinuationThreshold/payloadSize 增加,因此CONTINUATION 帧越小,开销计数的增加越大。零或更小的值会禁用对非最终 CONTINUATION 帧的检查。如果未指定,将使用默认值 1024。

overheadCountFactor

在计算开销帧以确定连接是否具有过高开销并应关闭时应用的因素。开销计数从 -10 * overheadCountFactor 开始。对于发送或接收的每个数据帧以及接收的每个标头帧,计数都会减少 20。对于接收到的每个设置、接收到的优先级帧和接收到的 ping,计数会增加overheadCountFactor。如果开销计数超过零,则关闭连接。小于 1 的值将禁用此保护。在正常使用中,大约 20 或更高的值将在任何流完成之前关闭连接。如果未指定,将使用默认值 10。

overheadDataThreshold

当前和先前非最终 DATA 帧的平均有效负载大小低于该阈值将触发开销计数的增加(请参阅overheadCountFactor)。开销计数将通过overheadDataThreshold/average 增加,因此平均值越小,开销计数的增加越大。零或更小的值禁用非最终数据帧的检查。 如果未指定,将使用默认值 1024。

overheadWindowUpdateThreshold

低于当前和之前WINDOW_UPDATE帧的平均大小的阈值将触发开销计数的增加(参见overheadCountFactor)。开销计数将通过overheadWindowUpdateThreshold/average增加,因此平均值越小,开销计数的增加越大。值为0或更小的值禁止检查WINDOW_UPDATE帧。如果未指定,将使用默认值1024。

readTimeout

当接收到部分 HTTP/2 帧时,Tomcat 将等待额外数据的时间(以毫秒为单位)。负值将被视为无限超时。如果未指定,将使用默认值 5000。

streamReadTimeout

当应用程序执行阻塞I/O读取并且需要附加数据时,Tomcat等待流的附加数据帧到达的时间(以毫秒为单位)。负值将被视为无限超时。如果未指定,将使用默认值20000。

streamWriteTimeout

当应用程序执行阻塞I/O写入并且流和/或连接流控制窗口太小而无法完成写入时,Tomcat将等待流和/或连接的附加窗口更新帧到达的时间(以毫秒为单位)。负值将被视为无限超时。如果未指定,将使用默认值20000。

writeTimeout

当 HTTP/2 帧被部分写入时,Tomcat 将等待写入额外数据的时间(以毫秒为单位)。负值将被视为无限超时。如果未指定,将使用默认值 5000。

HTTP/2 升级协议还将从嵌套的 HTTP 连接器继承以下限制:

  • maxCookieCount

  • maxParameterCount

  • maxPostSize

  • maxSavePostSize

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号