描述: | 支持HTTP / 2传输层 |
---|---|
状态: | 延期 |
模块标识符: | http2_module |
源文件: | mod_http2.c |
兼容性: | 在2.4.17版和更高版本中可用 |
该模块为Apache HTTP Server 提供HTTP / 2(RFC 7540)支持。
该模块依靠libnghttp2 提供核心的http / 2引擎。
您必须通过启用HTTP / 2 Protocols
才能使用本文档中描述的功能。HTTP / 2协议不需要使用加密,因此有两种方案可用:(
h2
基于TLS的HTTP / 2)和h2c
(基于TCP的HTTP / 2)。
两种有用的配置方案是:
Protocols h2 http/1.1
允许通过sec中的TLS ALPN进行HTTP / 2协商(h2)
<VirtualHost>
。H2Direct
默认情况下,禁用HTTP / 2前同步码检查(直接模式,请参阅)h2
。
Protocols h2 h2c http/1.1
允许通过TLS ALPN进行HTTP / 2协商(h2)以确保安全
<VirtualHost>
。允许从初始HTTP / 1.1连接或通过HTTP / 2前导码检查(直接模式,请参见H2Direct
)进行HTTP / 2明文协商(h2c)升级
。
有关协议的任何疑问,请参考官方的HTTP / 2常见问题解答。
在Apache服务器上启用HTTP / 2会对资源消耗产生影响,如果站点繁忙,则可能需要仔细考虑其含义。
启用HTTP / 2后的第一件事是服务器进程将启动其他线程。原因是HTTP / 2将收到的所有请求都交给自己的Worker 线程进行处理,收集结果并将它们流式传输到客户端。
在当前的实现中,这些工作程序使用与您可能熟悉的MPM工作程序不同的线程池。这就是现在的情况,并非永远如此。(不过,对于2.4.x版本,它可能永远存在。)因此,HTTP / 2 worker或更短的H2Workers不会显示在中mod_status
。也不会将它们计入指令之内ThreadsPerChild
。但是ThreadsPerChild
,如果您尚未通过H2MinWorkers
和
配置其他功能,它们将作为默认设置H2MaxWorkers
。
要注意的另一件事是内存消耗。由于HTTP / 2在服务器上保留更多状态来管理所有打开的请求,它们的优先级和它们之间的依赖关系,因此与HTTP / 1.1处理相比,它总是需要更多的内存。有三个指令,其引导一个HTTP / 2连接的内存占用量:
H2MaxSessionStreams
,
H2WindowSize
和
H2StreamMaxMemSize
。
H2MaxSessionStreams
限制客户端可以在HTTP / 2连接上发出的并行请求的数量。这取决于您的站点应允许多少个。默认值为100,这足够了,除非您遇到内存问题,否则我将保持这种方式。浏览器发送的大多数请求都是没有主体的GET,因此它们仅占用一点内存,直到开始实际处理为止。
H2WindowSize
控制在客户端等待服务器鼓励更多请求之前,允许客户端作为请求主体发送的数量。或者,相反,它是服务器需要能够缓冲的请求主体数据量。这是每个请求。
最后但并非最不重要的一点是H2StreamMaxMemSize
控制应缓冲多少响应数据。该请求位于H2Worker线程中并正在生成数据,HTTP / 2连接尝试将其发送给客户端。如果客户端读取速度不够快,连接将缓冲此数据量,然后挂起H2Worker。
许多站点将相同的TLS证书用于多个虚拟主机。证书具有通配符名称(例如“ * .example.org”)或带有多个备用名称。使用HTTP / 2的浏览器将识别出这种情况,并为这些主机重新使用已经打开的连接。
尽管这对于性能而言非常重要,但要付出一定的代价:此类虚拟主机在配置方面需要格外小心。问题是您将在同一TLS连接上对多个主机发出多个请求。面对HTTP / 2标准,禁止重新协商成为了不可能。
因此,如果您有多个使用相同证书的虚拟主机,并想对它们使用HTTP / 2,则需要确保所有虚拟主机具有完全相同的SSL配置。您需要相同的协议,密码和设置来进行客户端验证。
如果混合使用,Apache httpd将对其进行检测,并向客户端返回特殊的响应代码421 Misdirected Request。
可以将该模块配置为向SSI和CGI命名空间以及自定义日志配置中提供HTTP / 2相关信息作为附加环境变量(请参阅参考资料%{VAR_NAME}e
)。
变量名: | 值类型: | 描述: |
---|---|---|
HTTP2 | 旗 | 正在使用HTTP / 2。 |
H2PUSH | 旗 | 对此连接启用了HTTP / 2服务器推送,并且客户端也支持。 |
H2_PUSH | 旗 | 的备用名称 H2PUSH |
H2_PUSHED | 串 | 为空或PUSHED 服务器推送请求。 |
H2_PUSHED_ON | 数 | 触发此请求推送的HTTP / 2流号。 |
H2_STREAM_ID | 数 | 此请求的HTTP / 2流号。 |
H2_STREAM_TAG | 串 | HTTP / 2进程唯一流标识符,由连接ID和由ID分隔的流ID组成- 。 |
描述: | 确定响应中的文件处理 |
---|---|
句法: | H2CopyFiles on|off |
默认: | H2CopyFiles off |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.24版和更高版本中可用。 |
该指令影响响应中文件内容的处理方式。时off
,这是默认的,文件句柄从再审处理下降到主连接通过,使用通常的Apache setaside处理用于管理文件的寿命。
设置on
为时,将在仍在处理请求的同时复制文件内容,并将缓冲的数据传递到主连接。如果第三方模块将具有不同生存期的文件注入响应中,则更好。
这种模块的一个示例是mod_wsgi
可以将Python文件句柄放入响应中。当Python认为处理完成时,这些文件将关闭。在mod_http2
他们完成之前,这可能是很好的选择
。
描述: | H2直接协议交换机 |
---|---|
句法: | H2Direct on|off |
默认: | H2Direct on for h2c, off for h2 protocol |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
该指令切换HTTP / 2直接模式的用法。应该在一个<VirtualHost>
部分中使用它
来为该虚拟主机启用直接HTTP / 2通信。
直接通信意味着,如果服务器在连接上接收到的第一个字节与HTTP / 2前同步码匹配,则HTTP / 2协议将立即切换为无需进一步协商。RFC 7540中针对明文(h2c)情况定义了此模式。它在标准未要求的TLS连接上使用。
当服务器/虚拟主机未通过启用h2或h2c时
Protocols
,将永远不会检查该连接是否有HTTP / 2前导。
H2Direct
那没关系。这对于使用可能无限期挂起初始读取的协议的连接(例如NNTP)非常重要。
对于具有有关支持h2c的服务器的带外知识的客户端,直接HTTP / 2可以使客户端不必执行HTTP / 1.1升级,从而获得更好的性能并避免了对请求正文的升级限制。
当可以信任连接或通过其他方式保护连接时,直接h2c也对服务器到服务器的通信很有吸引力。
H2Direct on
描述: | 确定发送103状态代码 |
---|---|
句法: | H2EarlyHints on|off |
默认: | H2EarlyHints off |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.24版和更高版本中可用。 |
此设置控制是否将HTTP状态103临时响应转发给客户端。默认情况下,当前情况并非如此,因为许多客户仍然对意外的临时响应感到麻烦。
设置on
为时,用宣布的PUSH资源
H2PushResource
将在最终响应之前触发临时103响应。103响应将包含Link
建议preload
此类资源的标头。
描述: | 每个HTTP / 2会话的最大活动流数。 |
---|---|
句法: | H2MaxSessionStreams n |
默认: | H2MaxSessionStreams 100 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
该指令设置服务器允许的每个HTTP / 2会话(例如连接)的最大活动流数。如果一个流不是活动的,idle
或者
closed
根据RFC 7540,则该流是活动的。
H2MaxSessionStreams 20
描述: | h2工作人员保持空闲直到关闭的最大秒数。 |
---|---|
句法: | H2MaxWorkerIdleSeconds n |
默认: | H2MaxWorkerIdleSeconds 600 |
内容: | 服务器配置 |
状态: | 延期 |
模块: | mod_http2 |
该指令设置了h2 worker可以关闭直到关闭自身的最大秒数。这仅在h2工人数量超过时发生H2MinWorkers
。
H2MaxWorkerIdleSeconds 20
描述: | 每个子进程使用的最大工作线程数。 |
---|---|
句法: | H2MaxWorkers n |
内容: | 服务器配置 |
状态: | 延期 |
模块: | mod_http2 |
该指令设置每个子进程用于HTTP / 2处理的最大工作线程数。如果不使用该指令,
mod_http2
将选择一个适合所mpm
加载模块的值。
H2MaxWorkers 20
描述: | 每个子进程使用的工作线程数最少。 |
---|---|
句法: | H2MinWorkers n |
内容: | 服务器配置 |
状态: | 延期 |
模块: | mod_http2 |
该指令设置每个子进程为HTTP / 2处理生成的最小工作线程数。如果不使用该指令,
mod_http2
将选择一个适合所mpm
加载模块的值。
H2MinWorkers 10
描述: | 要求HTTP / 2连接仅是“现代TLS” |
---|---|
句法: | H2ModernTLSOnly on|off |
默认: | H2ModernTLSOnly on |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.18版和更高版本中可用。 |
此伪指令在TLS模式(https :)中切换对HTTP / 2连接的安全检查。可以在服务器范围内或特定于<VirtualHost>
的服务器上使用
。
安全检查要求TSL协议至少为TLSv1.2,并且不使用RFC 7540附录A中列出的密码。一旦新的安全要求到位,这些检查将得到扩展。
该名称源自 mozilla中定义了“现代兼容性” 的 安全性/服务器端TLS定义。Mozilla Firefox和其他浏览器要求HTTP / 2连接具有现代兼容性。作为OpSec中的所有内容,这是一个不断发展的目标,并且有望在未来发展。
进行这些检查的目的之一mod_http2
是对所有连接(不仅是来自浏览器的连接)强制实施此安全级别。另一个目的是防止在不满足要求的情况下将HTTP / 2作为协议进行协商。
最终,TLS连接的安全性由的服务器配置指令确定mod_ssl
。
H2ModernTLSOnly off
描述: | 确定添加到有效载荷帧的填充字节的范围 |
---|---|
句法: | H2Padding numbits |
默认: | H2Padding 0 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在版本2.4.39和更高版本中可用。 |
默认值为0时,没有填充字节添加到任何有效负载帧,例如HEADERS,DATA和PUSH_PROMISE。这是以前版本的行为。这意味着在某些条件下,网络流量的观察者可以看到TLS流中这些帧的长度。
当配置1-8的位数时,会将[0,2 ^ numbits]范围内的随机数添加到每个帧中。为模块发送回客户端的每个帧独立选择随机值。
尽管更多的填充字节可以更好地混淆消息长度,但它们也是额外的流量。因此,最佳数量取决于服务器承载的Web流量的类型。
为了最大程度地向后兼容,选择了默认值0(例如无填充)。在某些部署中,填充字节是有害的或有害的。最可能的原因是实施有故障的客户端。
描述: | H2服务器按键开关 |
---|---|
句法: | H2Push on|off |
默认: | H2Push on |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.18版和更高版本中可用。 |
此伪指令切换HTTP / 2服务器推送协议功能的用法。
HTTP / 2协议允许服务器在请求特定资源时将其他资源推送到客户端。如果这些资源以某种方式连接并且可以期望客户端仍然要求它,这将很有帮助。这样,推送就节省了客户端请求资源本身所花费的时间。另一方面,推送客户端不再需要或已经拥有的资源会浪费带宽。
通过检查Link
响应的标头来检测服务器推送(有关规范,请参阅https://tools.ietf.org/html/rfc5988)。当这样指定的链接具有rel=preload
属性时,它将被视为要推送的资源。
响应中的链接头可以由应用程序设置,也可以通过H2PushResource
或使用以下方式配置mod_headers
:
<Location /index.html> Header add Link "</css/site.css>;rel=preload" Header add Link "</images/logo.jpg>;rel=preload" </Location>
如示例所示,可以将多个链接头添加到响应中,从而导致多次推送。该模块中没有检查,以避免将同一资源两次或多次推送到一个客户端。小心使用。
默认情况下启用HTTP / 2服务器推送。在服务器或虚拟主机上,您可以为与主机的任何连接启用/禁用此功能。此外,您可以禁用目录/位置中的一组资源的PUSH。这控制哪些资源可能导致“推”,而不控制哪些资源可能通过“推”发送。
H2Push off
最后但并非最不重要的一点是,仅当客户表示愿意接受推送时,才会进行推送。大多数浏览器都支持,某些浏览器(如Safari 9)却不支持。同样,推送也只会发生在与原始响应所具有的相同权限的资源上 。
描述: | H2服务器推送日志大小 |
---|---|
句法: | H2PushDiarySize n |
默认: | H2PushDiarySize 256 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.19版和更高版本中可用。 |
该指令切换每个HTTP / 2连接记住的最大HTTP / 2服务器推送次数。可以在本<VirtualHost>
节中使用它
来影响到该虚拟主机的所有连接的数量。
推送日志记录了推送资源(其URL)的摘要(当前使用64位数字),以避免在同一连接上重复推送。这些值不会保持不变,因此打开新连接的客户端将再次经历已知的推送。有正在进行的工作使客户端能够公开其已经拥有的资源的摘要,因此日记可以由客户端在每个连接设置上初始化。
如果达到最大大小,则较新的条目将替换最旧的条目。日记条目使用8个字节,让具有256个条目的默认日记消耗大约2 KB的内存。
大小为0将有效地禁用推送日记。
描述: | H2服务器推送优先级 |
---|---|
句法: | H2PushPriority mime-type [after|before|interleaved] [weight] |
默认: | H2PushPriority * After 16 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.18版和更高版本中可用。为了产生效果,需要使用nghttp2库1.5.0或更高版本。 |
该指令根据响应的内容类型定义推送响应的优先级处理。这通常是根据服务器配置定义的,但也可能出现在虚拟主机中。
HTTP / 2服务器推送始终与客户端请求相关。每个这样的请求/响应对或流都具有依赖性和权重,一起定义了流的优先级。
当一个流依赖于另一个流时,比如说X依赖于Y,则Y在获得任何带宽之前先获得所有带宽。请注意,这并不意味着Y将阻止X。如果Y没有要发送的数据,则X可以使用分配给Y的所有带宽。
当流具有多个从属关系时,例如X1和X2都取决于Y,则权重确定带宽分配。如果X1和X2具有相同的权重,则它们都将获得可用带宽的一半。如果X1的权重是X2的两倍,则X1的带宽是X2的两倍。
最终,每个流都取决于获得所有可用带宽的根流,但从不发送任何内容。因此,其所有带宽均按权重在其子级之间分配。它们要么有数据发送带宽,要么将带宽分配给自己的孩子。等等。如果所有子级都没有要发送的数据,则根据相同规则将该带宽分配到其他地方。
该优先级系统的目的是始终利用可用带宽,同时允许将优先级和权重赋予特定的流。通常,由于所有流都是由客户端启动的,因此设置这些优先级的也是流。
仅当此类流导致PUSH时,才让服务器决定此类推送流的初始优先级是多少。在下面的示例中,X是客户端流。它取决于Y,服务器决定将流P1和P2推入X。
默认优先级规则为:
H2PushPriority * After 16
读为“根据权重为16的客户端流发送任何内容类型的推送流”。因此,P1和P2将在X之后发送,并且由于它们具有相等的权重,因此它们之间平均共享带宽。
H2PushPriority text/css Interleaved 256
读为“以与客户端流相同的依赖关系和权重发送任何CSS资源”。如果P1的内容类型为“ text / css”,则它将取决于Y(与X一样),其有效权重将计算为P1ew = Xw * (P1w / 256)
。当P1w为256时,这将使有效权重与X的权重相同。如果X和P1都有要发送的数据,则带宽将被均等地分配给两者。
在Pw指定为512的情况下,推送的交错流的权重是X的两倍。而128的权重仅为X的一半。请注意,有效权重始终限制为256。
H2PushPriority application/json Before
这表示任何推送的内容类型为'application / json'的流都应在 X 之前发出。这使P1依赖于Y,X依赖于P1。因此,只要P1有要发送的数据,X就会停止。有效权重是从客户端流继承的。不允许指定重量。
请注意,优先级规范的效果受到可用服务器资源的限制。如果服务器没有可用于推送流的工作程序,则仅当其他流完成后,该流的数据才可能到达。
最后但并非最不重要的一点是,此指令中使用了一些语法细节:
H2PushPriority application/json 32 # an After rule H2PushPriority image/jpeg before # weight inherited H2PushPriority text/css interleaved # weight 256 default
描述: | 声明资源以尽早推送给客户 |
---|---|
句法: | H2PushResource [add] path [critical] |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.24版和更高版本中可用。 |
当添加到目录/位置时,将对通过此伪指令添加的所有路径尝试HTTP / 2 PUSH。该指令可以在同一位置多次使用。
该指令比Link
通过添加标题更早地推送资源
mod_headers
。
mod_http2
在103 Early Hints
对客户的临时响应中宣布这些资源
。这意味着不支持PUSH的客户端仍将获得早期的预加载提示。
与通过设置Link
响应头相反mod_headers
,此伪指令仅对HTTP / 2连接有效。
通过添加critical
到这样的资源中,服务器将给予处理更多的优先级,并在可用之前在其来自主请求的数据之前发送其数据。
描述: | 序列化请求/响应处理开关 |
---|---|
句法: | H2SerializeHeaders on|off |
默认: | H2SerializeHeaders off |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
该指令切换是将HTTP / 2请求以HTTP / 1.1格式序列化以供httpd
内核处理,还是将接收到的二进制数据request_rec
直接传递到s中。
序列化将降低性能,但是在自定义过滤器/钩子需要它的情况下,可以提供更多的向后兼容性。
H2SerializeHeaders on
描述: | 每个流缓冲的最大输出数据量。 |
---|---|
句法: | H2StreamMaxMemSize bytes |
默认: | H2StreamMaxMemSize 65536 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
此伪指令设置活动流在内存中缓冲的最大传出数据字节数。不会按流分配此内存。即将完成的分配将计入此限制。当达到限制时,流处理将冻结,并且仅在将缓冲的数据发送到客户端后,流处理才会继续。
H2StreamMaxMemSize 128000
描述: | 在缩小写入之前,在TLS上配置空闲时间的秒数 |
---|---|
句法: | H2TLSCoolDownSecs seconds |
默认: | H2TLSCoolDownSecs 1 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.18版和更高版本中可用。 |
此伪指令设置TLS连接上的空闲时间的秒数,直到TLS写大小变小(〜1300字节)。可以在服务器范围内或特定于<VirtualHost>
的服务器上使用
。
有关H2TLSWarmUpSize
TLS预热的说明,请参见。H2TLSCoolDownSecs
反映了以下事实:对于空闲连接,连接也可能随时间恶化(并且TCP流量会调整)。在几秒钟之内没有发送任何数据后,退回到预热阶段对整体性能是有益的。
在可以认为连接可靠的部署中,可以通过将其设置为0来禁用此计时器。
以下示例将秒设置为零,从而有效地禁用任何冷却。热身的TLS连接保持最大记录大小。
H2TLSCoolDownSecs 0
描述: | 在进行最大写入之前,配置TLS连接上的字节数 |
---|---|
句法: | H2TLSWarmUpSize amount |
默认: | H2TLSWarmUpSize 1048576 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_http2 |
兼容性: | 在2.4.18版和更高版本中可用。 |
该指令设置在TLS小记录(〜1300字节)中发送的字节数,直到在https:HTTP / 2连接上执行最大大小的写操作(16k)为止。可以在服务器范围内或特定于<VirtualHost>
的服务器上使用
。
谷歌性能实验室的 评估表明,如果初始记录的大小保持在MTU级别以下,则TLS连接可达到最佳性能,以使完整的记录适合IP数据包。
当TCP调整其流控制和窗口大小时,更长的TLS记录可能会卡在队列中或丢失并需要重新传输。对于所有数据包当然都是这样。但是,TLS需要整个记录才能对其进行解密。最后任何丢失的字节将使接收到的字节的使用停止。
成功发送足够数量的字节后,连接的TCP状态将稳定,并且可以使用最大TLS记录大小(16 KB)以获得最佳性能。
在本地访问服务器或仅通过可靠连接访问的部署中,如果完全禁用任何预热阶段,则该值为0可能会降低。
以下示例将大小设置为零,从而有效地禁用了任何预热阶段。
H2TLSWarmUpSize 0
描述: | H2Upgrade on协议交换机 |
---|---|
句法: | H2Upgrade on|off |
默认: | H2Upgrade on for h2c, off for h2 protocol |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
状态: | 延期 |
模块: | mod_http2 |
此伪指令切换用于切换到HTTP / 2的HTTP / 1.1升级方法的用法。应该在一个<VirtualHost>
部分中使用它
来为该虚拟主机启用升级到HTTP / 2。
这种切换协议的方法在HTTP / 1.1中定义,并使用“ Upgrade”标头(因此为名称)来宣布愿意使用其他协议。这可能在HTTP / 1.1连接的任何请求上发生。
根据RFC 7540的要求,默认情况下,此协议切换方法在明文(潜在的h2c)连接上启用,而在TLS(潜在的h2)上禁用。
请注意,升级仅适用于不包含任何正文的请求。具有内容的POST和PUT将永远不会触发升级到HTTP / 2。请参阅H2Direct
以获取升级的替代方法。
仅当通过启用h2或h2c时,此模式才有效Protocols
。
H2Upgrade on