ADC

HTTP/2 配置

注意: NetScaler MPX、VPX 和 SDX 机型支持 HTTP/2 功能。在 NetScaler VPX 设备中,从 NetScaler 11.0 版本起,HTTP/2 功能受支持。

Web 应用程序性能的问题与页面大小和网页上对象数量增加的趋势直接相关。HTTP/1.1 的开发是为了支持比现在常见的更小的网页、更慢的 Internet 连接和更有限的服务器硬件。它不适用于 JavaScript 和级联样式表 (CSS) 等新技术,也不适用于 Flash 视频和图形丰富的图像等新媒体类型。这是因为它每次与服务器的连接只能请求一个资源。该限制大大增加了往返次数,导致页面渲染时间延长并降低网络性能。

HTTP/2 协议通过允许在网络上载输的数据较少的情况下进行通信,并提供通过单个连接发送多个请求和响应的能力,从而解决了这些限制。HTTP/2 的核心是通过更有效地使用底层网络连接来解决 HTTP/1.1 的关键局限性。它改变了请求和响应在网络上载输的方式。

HTTP/2 是二进制协议。与 HTTP/1.1 等文本协议相比,解析效率更高,更紧凑,最重要的是,它不容易出错。HTTP/2 协议使用二进制帧层,该层定义帧类型以及如何封装 HTTP 消息以及如何在客户端和服务器之间传输 HTTP 消息。HTTP/2 功能支持使用 CONNECT 方法通过单个 HTTP/2 流与远程主机建立通道连接。

HTTP/2协议包括许多性能增强的更改,这些更改显著提高了性能,特别是对于通过移动网络连接的客户端。

下表列出了 HTTP/2 与 HTTP/1.1 相比的主改进:

HTTP/2 功能 说明
头压缩 HTTP 标头有很多重复信息,因此在数据传输期间消耗不必要的带宽。HTTP/2 通过压缩标头并最大限度地减少传输每个请求和响应 HTTP 标头的要求,从而降低带宽要求。
连接多路复用 延迟会对页面加载时间和最终用户体验产生巨大影响。连接多路复用通过在单个连接中发送多个请求和响应来克服此问题。
服务器推送 服务器推送使服务器能够主动将内容推送到客户端浏览器,从而避免往返延迟。此功能可缓存客户认为需要的响应,减少往返次数,并缩短页面呈现时间。重要提示:NetScaler 设备不支持服务器推送功能。
无标题阻塞 在 HTTP 1.1 下,浏览器可以每个连接一次下载一个资源。当浏览器必须下载大型资源时,它会阻止所有其他资源下载,直到第一次下载完成。HTTP/2 通过多路复用方法克服了这个问题。它允许客户端浏览器通过同一连接并行下载其他 Web 组件,并在可用时显示它们。
请求优先级 浏览器呈现网页时,并非所有资源都具有同等的优先级。为了加快加载时间,所有现代浏览器都会根据资产类型、页面上的位置,甚至根据从以前的访问中学到的优先级来确定请求的优先级。使用 HTTP/1.1 时,浏览器使用优先级数据的能力有限,因为该协议不支持多路复用,而且服务器无法通过传达请求优先级。结果是不必要的网络延迟。HTTP/2 通过允许浏览器调度所有请求来克服这个问题。浏览器可以通过流依赖关系和权重来传达其流优先级优先级的偏好,从而使服务器能够优化响应传递。重要:NetScaler 设备不支持请求优先级排序功能。

HTTP/2 的工作原理

NetScaler 设备在客户端和服务器端都支持 HTTP/2。在客户端,NetScaler 设备充当托管 HTTP/2 的 HTTP/HTTPS 虚拟服务器的服务器。在后端,NetScaler 充当绑定到虚拟服务器的服务器的客户端。

因此,NetScaler 设备在客户端和服务器端保持单独的连接。NetScaler 设备在客户端和服务器端具有单独的 HTTP/2 配置。

HTTP/2 适用于 HTTPS (SSL) 负载平衡配置

对于 HTTPS 负载平衡配置,NetScaler 设备使用 TLS ALPN 扩展 (RFC 7301) 来确定客户端/服务器是否支持 HTTP/2。如果是,设备会选择 HTTP/2 作为应用层协议在客户端/服务器端传输数据(如 RFC 7540-3.3 节所述)。 通过 TLS ALPN 扩展选择应用层协议时,设备使用以下优先顺序:

  • HTTP/2(如果在 HTTP 配置文件中启用)
  • HTTP/1.1

HTTP/2 用于 HTTP 负载平衡配置

对于 HTTP 负载平衡配置,NetScaler 设备使用以下方法之一开始使用 HTTP/2 与客户端/服务器通信。

注意

在以下方法描述中,客户端和服务器是 HTTP/2 连接的通用术语。例如,对于使用 HTTP/2 的 NetScaler 设备的负载平衡设置,NetScaler 设备充当客户端的服务器,并充当服务器端的客户端。

  • HTTP/2 升级。客户端向服务器发送 HTTP/1.1 请求。该请求包含一个升级标头,该标头要求服务器升级到 HTTP/2 的连接。如果服务器支持 HTTP/2,则服务器接受升级请求并在响应中通知它。客户端收到升级确认响应后,客户端和服务器开始使用 HTTP/2 进行通信。

  • 直接 HTTP/2。客户端直接开始与 HTTP/2 中的服务器进行通信,而不是使用 HTTP/2 升级方法。如果服务器不支持 HTTP/2 或没有配置为直接接受 HTTP/2 请求,它会丢弃来自客户端的 HTTP/2 数据包。如果客户端设备的管理员已经知道服务器支持 HTTP/2,则此方法很有用。

  • 使用替代服务 (ALT-SVC) 直接使用 HTTP/2。服务器通过在其 HTTP/1.1 响应中包含替代服务 (ALT-SVC) 字段向客户端宣传它支持 HTTP/2。如果将客户端配置为了解 ALT-SVC 字段,客户端和服务器将在客户端收到响应后开始使用 HTTP/2 直接通信。

NetScaler 设备在 HTTP 配置文件中为 HTTP/2 方法提供了可配置的选项。这些 HTTP/2 选项可以应用于客户端以及 HTTPS 或 HTTP 负载平衡设置的服务器端。有关 HTTP/2 方法和选项的更多信息,请参阅 HTTP/2 选项 PDF。

开始之前的准备工作

在开始在 NetScaler 设备上配置 HTTP/2 之前,请注意以下几点:

  • NetScaler 设备在客户端和服务器端都支持 HTTP/2。
  • NetScaler 设备不支持 HTTP/2 服务器推送功能。
  • NetScaler 设备不支持 HTTP/2 请求优先级排序功能。
  • NetScaler 设备不支持对 HTTPS 负载平衡设置进行 HTTP/2 SSL 重新协商。
  • NetScaler 设备不支持 HTTP/2 NTLM 身份验证。
  • 启用 HTTP/2、禁用连接多路复用(如启用 USIP)以及客户端和服务器 TCP 连接的一对一映射时,关闭事件(如 FIN、reset (RST))将从客户端或服务器连接转发到链接的对等连接。

配置HTTP/2

为负载平衡设置(HTTPS 或 HTTP)配置 HTTP/2 包含以下任务:

  • 启用 HTTP/2 并在 HTTP 配置文件中设置可选的 HTTP/2 参数。在 HTTP 配置文件中启用 HTTP/2。当您仅在 HTTP 配置文件中启用 HTTP/2 时,NetScaler 设备仅使用升级方法(对于 HTTP)或 TLS ALPN 方法(用于 HTTPS)在 HTTP/2 中进行通信。

    要使 NetScaler 设备使用直接 HTTP/2 方法,必须在 HTTP 配置文件中启用直接 HTTP/2 选项。为了使用替代服务方法的 NetScaler 设备使用直接 HTTP/2,必须在 HTTP 配置文件中启用 替代服务 (altsvc) 选项。

  • 将HTTP 配置文件绑定到虚拟服务器或服务。将 HTTP 配置文件绑定到虚拟服务器,为负载平衡设置的客户端配置 HTTP/2。将 HTTP 配置文件绑定到服务,为负载平衡设置的服务器端配置 HTTP2。

注意

Citrix 建议为客户端和服务器端绑定单独的 HTTP 配置文件。

  • 启用 HTTP/2 服务器端支持的全局参数。启用 HTTP/2 服务端 (HTTP2Serverside) 全局 HTTP 参数,以便在配置了 HTTP/2 的所有负载平衡设置的服务器端启用 HTTP/2 支持。

    如果 HTTP/2 服务端被禁用,即使在绑定到相关负载平衡 服务的 HTTP 配置文件上启用了 HTTP/2HTTP/2 也不能在任何负载平衡设置的服务器端 运行。

NetScaler 命令行程序

使用 NetScaler 命令行启用 HTTP/2 并设置 HTTP/2 参数

  • 要在添加 HTTP 配置文件时启用 HTTP/2 并设置 HTTP/2 参数,请在命令提示符下键入:

add ns httpProfile <name> - http2 ( ENABLED | DISABLED ) [-http2Direct ( ENABLED | DISABLED )] [-altsvc ( ENABLED | DISABLED )] show ns httpProfile <name>

  • 要在修改 HTTP 配置文件时启用 HTTP/2 并设置 HTTP/2 参数,请在命令提示符下键入:

set ns httpProfile <name> -http2 ( ENABLED | DISABLED ) [-http2Direct ( ENABLED | DISABLED)] [-altsvc (ENABLED | DISABLED )] show ns httpProfile <name>

使用 NetScaler 命令行将 HTTP 配置文件绑定到虚拟服务器

在命令提示符下,键入:

set lb vserver <name> - httpProfileName <string> show lb vserver <name>

使用 NetScaler 命令行将 HTTP 配置文件绑定到负载平衡服务

在命令提示符下,键入:

set service <name> -httpProfileName <string> show service <name>

使用 NetScaler 命令行在服务器端全局启用 HTTP/2 支持

在命令提示符下,键入:

set ns httpParam -HTTP2Serverside( ENABLED | DISABLED ) show ns httpParam

使用 NetScaler GUI 启用 HTTP/2 并设置 HTTP/2 参数

  1. 导航到 系统 > 配置文件,然后单击 HTTP 配置文件 选项卡。
  2. 在添加 HTTP 配置文件或修改现有 HTTP 配置文件时启用 HTTP /2。

使用 NetScaler GUI 将 HTTP 配置文件绑定到虚拟服务器

  1. 导航到“流量管理”>“负载平衡”>“虚拟服务器”,然后打开虚拟服务器。
  2. 高级设置中,单击 + HTTP 配置文件 将创建的 HTTP 配置文件绑定到虚拟服务器。

使用 NetScaler GUI 将 HTTP 配置文件绑定到负载平衡服务

  1. 导航到 流量管理 > 负载平衡 > 服务,然后打开该服务。
  2. 高级设置中,单击 + HTTP 配置文件以将创建的 HTTP 配置文件绑定到服务。

使用 GUI 在服务器端全局启用 HTTP/2 支持

导航到 系统 > 设置,单击 更改 HTTP 参数 ,然后启用 HTTP/2 服务器端

示例配置

在以下示例配置中,HTTP 配置文件 HTTP-PROFILE-HTTP2-CLIENT-SIDE 上启用了 HTTP/2 和直接 HTTP/2。 配置文件绑定到虚拟服务器 LB-VS-1。

set ns httpProfile HTTP-PROFILE-HTTP2-CLIENT-SIDE -http2 enabled -http2Direct enabled
Done

set lb vserver LB-VS-1 -httpProfileName HTTP-PROFILE-HTTP2-CLIENT-SIDE

Done
<!--NeedCopy-->

在以下示例配置中,HTTP 配置文件 HTTP-PROFILE-HTTP2-SERVER-SIDE 上启用了 HTTP/2 和替代服务 (ALT-SVC)。配置文件绑定到服务 LB-SERVICE-1。

set ns httpparam -HTTP2Serverside ENABLED
Done

set ns httpProfile HTTP-PROFILE-HTTP2-SERVER-SIDE -http2 ENABLED -altsvc ENABLED
Done

set service LB-SERVICE-1 -httpProfileName HTTP-PROFILE-HTTP2-SERVER-SIDE
Done
<!--NeedCopy-->

配置HTTP/2 初始连接窗口大小

根据 RFC 7540,HTTP2 流和连接的流控制窗口必须设置为 64 K (65535) 八位组,对此值所做的任何更改都必须传达给对等体。ADC 设备传达流量控制窗口大小的变化,如下所示:

  • 使用 SETTINGS 帧作为直播。
  • 使用 WINDOW_UPDATE 帧进行连接。

在 HTTP 配置文件中,必须配置 http2InitialWindowSize 参数以在流级别设置初始窗口大小。由于内部系统错误,ADC 设备也初始化了连接的流量控制窗口。当流配置的流量控制窗口发生更改时,ADC 设备将使用 STESTINGS 帧与对等体进行通信。但是,ADC 设备无法通报使用该 WINDOW_UPDATE 帧的连接的流量控制窗口中的变化。这导致连接冻结。

为了解决这个问题,现在添加了 http2InitialConnWindowSize 参数(以字节为单位)来控制连接的流控制窗口。通过使用单独的可配置参数,您现在可以使设备在流和连接级别发送更改窗口大小的更新。

使用 CLI 配置 HTTP/2 初始连接窗口大小参数

在命令提示符下,键入:

set http profile p1 -http2InitialConnWindowSize 8290
Initial window size for stream level flow control, in bytes.
Default value: 65535
Minimum value: 8192
Maximum value: 20971520
<!--NeedCopy-->

注意: 启用 HTTP/2 后,Citrix 建议您在 TCP 配置文件中禁用 TCP 动态接收缓冲参数。

基于 HTTP/2 配置的 WebSocket

NetScaler 设备支持通过 HTTP/2 进行的 WebSocket 连接。您可以使用 CLI 或 GUI 界面启用 WebSocket 连接。WebSocket HTTP/2 连接可以多路复用。

使用 CLI 通过 HTTP/2 配置 WebSocket 连接

默认情况下, WebSocket 连接 参数处于禁用状态。您可以使用 CLI 接口启用 WebSocket 连接。

启用前端 HTTP/2 WebSocket 连接:

在命令提示符下,键入:

对于 SSL 配置:


add httpprofile <http_profile_name> -http2 enabled -websocket enabled

<!--NeedCopy-->

对于纯文本配置:


add httpprofile <http_profile_name> -http2 enabled -http2direct enabled -websocket enabled

<!--NeedCopy-->

启用后端 HTTP/2 WebSocket 连接:

在命令提示符下,键入:

对于 SSL 配置:

add httpprofile <http_profile_name> -http2 enabled
set httpparam -http2serverside ON
<!--NeedCopy-->

对于纯文本配置:

add httpprofile <http_profile_name> -http2 enabled -http2direct enabled
set httpparam -http2serverside ON
<!--NeedCopy-->

使用 GUI 通过 HTTP/2 配置 WebSocket 连接

您可以使用以下步骤通过 GUI 界面启用 WebSocket 连接。

编辑现有配置文件:

  1. 导航到“系统”>“配置文件”>“HTTP 配置文件”。
  2. 从“配置文件”中选择所需的 配置文件 ,然后单击“编辑”
  3. 在“配置 HTTP 配置文件”中,启用 HTTP2DirectHTTP2 复选框。
  4. 通过选中“启用 WebSocket 连接”复选框来 启用 WebSocket 连接

添加新的配置文件:

  1. 导航到“系统”>“配置文件”>“HTTP 配置文件”。
  2. 您可以通过单击“添加”来 添加新的 HTTP2 配置文件。
  3. 在“创建 HTTP 配置文件”中,启用 HTTP2DirectHTTP2 复选框。
  4. 选中“启用 WebSocket 连接”复选框。

下表描述了禁用后端多路复用时的 WebSocket 连接行为:

HTTP 数据包版本 HTTP 配置文件中的 WebSocket 请求采取操作 后端 HTTP/1.1 后端 HTTP/2
HTTP/1.1 已禁用 dropped 不适用 不适用
HTTP/1.1 已启用 HTTP/1.1 每个 HTTP/1.1 连接都映射到后端的专用 HTTP/1.1 连接 每个 HTTP/1.1 连接在后端都有专用 HTTP/2 连接
HTTP/2 已启用 HTTP/2 前端的每个流都映射到专用 HTTP/1.1 连接 所有前端流都可以映射到后端的单个 HTTP/2 连接或最多三个 HTTP/2 连接。
HTTP/2 已禁用 dropped 不适用 不适用

下表描述了启用后端多路复用时的 WebSocket 连接行为:

HTTP 数据包版本 HTTP 配置文件中的 WebSocket 请求采取操作 后端 HTTP/1.1 后端 HTTP/2
HTTP/1.1 已禁用 dropped 不适用 不适用
HTTP/1.1 已启用 HTTP/1.1 每个 HTTP/1.1 连接都映射到后端的专用 HTTP/1.1 连接 多个 Http/1.1 客户端可以多路复用到单个 HTTP/2 连接或多个 HTTP/2 连接
HTTP/2 已启用 HTTP/2 前端的每个流都映射到专用 HTTP/1.1 连接 所有前端流都可以映射到后端的单个 HTTP/2 连接或多个 HTTP/2 连接
HTTP/2 已禁用 dropped 不适用 不适用