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