<-
Apache HTTP 服务器 2.4 > Apache模块mod_http2

Apache模块mod_http2

描述:支持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)。

两种有用的配置方案是:

VirtualHost上下文中的HTTP / 2(仅TLS)

Protocols h2 http/1.1

允许通过sec中的TLS ALPN进行HTTP / 2协商(h2) <VirtualHost>H2Direct默认情况下,禁用HTTP / 2前同步码检查(直接模式,请参阅)h2

服务器上下文中的HTTP / 2(TLS和明文)

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尺寸

在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连接的内存占用量: H2MaxSessionStreamsH2WindowSizeH2StreamMaxMemSize

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_TAGHTTP / 2进程唯一流标识符,由连接ID和由ID分隔的流ID组成-
最佳

H2CopyFiles 指令

描述:确定响应中的文件处理
句法:H2CopyFiles on|off
默认:H2CopyFiles off
内容:服务器配置,虚拟主机,目录,.htaccess
状态:延期
模块:mod_http2
兼容性:在2.4.24版和更高版本中可用。

该指令影响响应中文件内容的处理方式。时off,这是默认的,文件句柄从再审处理下降到主连接通过,使用通常的Apache setaside处理用于管理文件的寿命。

设置on为时,将在仍在处理请求的同时复制文件内容,并将缓冲的数据传递到主连接。如果第三方模块将具有不同生存期的文件注入响应中,则更好。

这种模块的一个示例是mod_wsgi可以将Python文件句柄放入响应中。当Python认为处理完成时,这些文件将关闭。在mod_http2他们完成之前,这可能是很好的选择 。

最佳

H2Direct 指令

描述: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
最佳

H2EarlyHints 指令

描述:确定发送103状态代码
句法:H2EarlyHints on|off
默认:H2EarlyHints off
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2
兼容性:在2.4.24版和更高版本中可用。

此设置控制是否将HTTP状态103临时响应转发给客户端。默认情况下,当前情况并非如此,因为许多客户仍然对意外的临时响应感到麻烦。

设置on为时,用宣布的PUSH资源 H2PushResource将在最终响应之前触发临时103响应。103响应将包含Link 建议preload此类资源的标头。

最佳

H2MaxSessionStreams 指令

描述:每个HTTP / 2会话的最大活动流数。
句法:H2MaxSessionStreams n
默认:H2MaxSessionStreams 100
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2

该指令设置服务器允许的每个HTTP / 2会话(例如连接)的最大活动流数。如果一个流不是活动的,idle或者 closed根据RFC 7540,则该流是活动的。

H2MaxSessionStreams 20
最佳

H2MaxWorkerIdleSeconds 指令

描述:h2工作人员保持空闲直到关闭的最大秒数。
句法:H2MaxWorkerIdleSeconds n
默认:H2MaxWorkerIdleSeconds 600
内容:服务器配置
状态:延期
模块:mod_http2

该指令设置了h2 worker可以关闭直到关闭自身的最大秒数。这仅在h2工人数量超过时发生H2MinWorkers

H2MaxWorkerIdleSeconds 20
最佳

H2MaxWorkers 指令

描述:每个子进程使用的最大工作线程数。
句法:H2MaxWorkers n
内容:服务器配置
状态:延期
模块:mod_http2

该指令设置每个子进程用于HTTP / 2处理的最大工作线程数。如果不使用该指令, mod_http2将选择一个适合所mpm 加载模块的值。

H2MaxWorkers 20
最佳

H2MinWorkers 指令

描述:每个子进程使用的工作线程数最少。
句法:H2MinWorkers n
内容:服务器配置
状态:延期
模块:mod_http2

该指令设置每个子进程为HTTP / 2处理生成的最小工作线程数。如果不使用该指令, mod_http2将选择一个适合所mpm 加载模块的值。

H2MinWorkers 10
最佳

H2ModernTLSOnly 指令

描述:要求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 指令

描述:确定添加到有效载荷帧的填充字节的范围
句法:H2Padding numbits
默认:H2Padding 0
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2
兼容性:在版本2.4.39和更高版本中可用。

默认值为0时,没有填充字节添加到任何有效负载帧,例如HEADERS,DATA和PUSH_PROMISE。这是以前版本的行为。这意味着在某些条件下,网络流量的观察者可以看到TLS流中这些帧的长度。

当配置1-8的位数时,会将[0,2 ^ numbits]范围内的随机数添加到每个帧中。为模块发送回客户端的每个帧独立选择随机值。

尽管更多的填充字节可以更好地混淆消息长度,但它们也是额外的流量。因此,最佳数量取决于服务器承载的Web流量的类型。

为了最大程度地向后兼容,选择了默认值0(例如无填充)。在某些部署中,填充字节是有害的或有害的。最可能的原因是实施有故障的客户端。

最佳

H2Push 指令

描述: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

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)却不支持。同样,推送也只会发生在与原始响应所具有的相同权限的资源上 。

最佳

H2PushDiarySize 指令

描述:H2服务器推送日志大小
句法:H2PushDiarySize n
默认:H2PushDiarySize 256
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2
兼容性:在2.4.19版和更高版本中可用。

该指令切换每个HTTP / 2连接记住的最大HTTP / 2服务器推送次数。可以在本<VirtualHost> 节中使用它 来影响到该虚拟主机的所有连接的数量。

推送日志记录了推送资源(其URL)的摘要(当前使用64位数字),以避免在同一连接上重复推送。这些值不会保持不变,因此打开新连接的客户端将再次经历已知的推送。有正在进行的工作使客户端能够公开其已经拥有的资源的摘要,因此日记可以由客户端在每个连接设置上初始化。

如果达到最大大小,则较新的条目将替换最旧的条目。日记条目使用8个字节,让具有256个条目的默认日记消耗大约2 KB的内存。

大小为0将有效地禁用推送日记。

最佳

H2PushPriority 指令

描述: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就会停止。有效权重是从客户端流继承的。不允许指定重量。

请注意,优先级规范的效果受到可用服务器资源的限制。如果服务器没有可用于推送流的工作程序,则仅当其他流完成后,该流的数据才可能到达。

最后但并非最不重要的一点是,此指令中使用了一些语法细节:

  1. “ *”是唯一与所有其他内容匹配的特殊内容类型。“图像/ *”将不起作用。
  2. 默认依赖项为“之后”。
  3. 还有默认权重:“之后”为16,“交错”为256。

优先顺序较短

H2PushPriority application/json 32         # an After rule
H2PushPriority image/jpeg before           # weight inherited
H2PushPriority text/css   interleaved      # weight 256 default
最佳

H2PushResource 指令

描述:声明资源以尽早推送给客户
句法:H2PushResource [add] path [critical]
内容:服务器配置,虚拟主机,目录,.htaccess
状态:延期
模块:mod_http2
兼容性:在2.4.24版和更高版本中可用。

当添加到目录/位置时,将对通过此伪指令添加的所有路径尝试HTTP / 2 PUSH。该指令可以在同一位置多次使用。

该指令比Link通过添加标题更早地推送资源 mod_headersmod_http2103 Early Hints对客户的临时响应中宣布这些资源 。这意味着不支持PUSH的客户端仍将获得早期的预加载提示。

与通过设置Link响应头相反mod_headers,此伪指令仅对HTTP / 2连接有效。

通过添加critical到这样的资源中,服务器将给予处理更多的优先级,并在可用之前在其来自主请求的数据之前发送其数据。

最佳

H2SerializeHeaders 指令

描述:序列化请求/响应处理开关
句法:H2SerializeHeaders on|off
默认:H2SerializeHeaders off
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2

该指令切换是将HTTP / 2请求以HTTP / 1.1格式序列化以供httpd内核处理,还是将接收到的二进制数据request_rec直接传递到s中。

序列化将降低性能,但是在自定义过滤器/钩子需要它的情况下,可以提供更多的向后兼容性。

H2SerializeHeaders on
最佳

H2StreamMaxMemSize 指令

描述:每个流缓冲的最大输出数据量。
句法:H2StreamMaxMemSize bytes
默认:H2StreamMaxMemSize 65536
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2

此伪指令设置活动流在内存中缓冲的最大传出数据字节数。不会按流分配此内存。即将完成的分配将计入此限制。当达到限制时,流处理将冻结,并且仅在将缓冲的数据发送到客户端后,流处理才会继续。

H2StreamMaxMemSize 128000
最佳

H2TLSCoolDownSecs 指令

描述:在缩小写入之前,在TLS上配置空闲时间的秒数
句法:H2TLSCoolDownSecs seconds
默认:H2TLSCoolDownSecs 1
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2
兼容性:在2.4.18版和更高版本中可用。

此伪指令设置TLS连接上的空闲时间的秒数,直到TLS写大小变小(〜1300字节)。可以在服务器范围内或特定于<VirtualHost>的服务器上使用 。

有关H2TLSWarmUpSizeTLS预热的说明,请参见。H2TLSCoolDownSecs反映了以下事实:对于空闲连接,连接也可能随时间恶化(并且TCP流量会调整)。在几秒钟之内没有发送任何数据后,退回到预热阶段对整体性能是有益的。

在可以认为连接可靠的部署中,可以通过将其设置为0来禁用此计时器。

以下示例将秒设置为零,从而有效地禁用任何冷却。热身的TLS连接保持最大记录大小。

H2TLSCoolDownSecs 0
最佳

H2TLSWarmUpSize 指令

描述:在进行最大写入之前,配置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协议交换机
句法: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
最佳

H2WindowSize 指令

描述:上游数据流窗口的大小。
句法:H2WindowSize bytes
默认:H2WindowSize 65535
内容:服务器配置,虚拟主机
状态:延期
模块:mod_http2

此伪指令设置用于从客户端到服务器的流控制的窗口的大小,并限制服务器必须缓冲的数据量。一旦达到限制,客户端将停止在流上发送,直到服务器宣布有更多可用空间(因为它已经处理了一些数据)。

此限制仅影响请求正文,而不影响其元数据(例如标头)。而且,它对响应主体没有影响,因为响应主体的窗口大小由客户端管理。

H2WindowSize 128000

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。