本节介绍了 NSX Advanced Load Balancer 中的 HTTP/2 支持。HTTP/2(最初命名为 HTTP/2.0)是最新的 HTTP 版本,它是在 HTTP 1.1 基础上开发的。HTTP/2 是二进制协议,而 HTTP 1.1 是文本协议。
以下是 HTTP/2 相对于 HTTP/1.1 的优势:
请求和响应多路复用 - 对于 HTTP/1.1,将为多个并行请求打开多个 TCP 连接。对于 HTTP/2,可以将多个请求拆分为可以交错处理的帧;远端可以重新组装这些帧。仍然可以打开多个连接,但连接数没有 HTTP/1.1 中那么多。
服务器推送 - 通过使用该功能,服务器可以发送多个资源以响应客户端请求,客户端无需为每个资源明确发送请求。这减少了等待每个请求提供资源而产生的延迟。在 HTTP/1.1 中,应用程序尝试内嵌资源以解决该问题。HTTP/2 允许客户端缓存资源,在页面之间重用资源以及与其他资源一起使用多路复用。
流控制 - HTTP/2 使用窗口大小在应用程序层提供流控制,从而防止一端导致另一端不堪重负。
标头压缩 - 在 HTTP/1.1 中,请求中的每个标头是以文本形式发送的。在 HTTP/2 中,标头使用 HPACK 压缩格式压缩请求和响应标头元数据,从而减少发送的标头大小。
流优先级 - 由于 HTTP 消息作为帧发送,并且可能会交错处理来自不同流的帧,因此,HTTP/2 可以指定流的优先级。即,可以根据流优先级区别处理所有收到的帧。
NSX Advanced Load Balancer 支持 HTTP/2 服务器推送。
用例
不再需要 HTTP 1.1 使浏览器与 HTTP/2 兼容而使用的解决方法。
可以将所有使用 HTTP/2 的浏览器部署在 NSX Advanced Load Balancer 上。
支持应用程序使用反向代理进行 gRPC。
NSX Advanced Load Balancer 上支持的 HTTP/2 方法和模式
通过 TLS 的 HTTP 或通过 SSL 的 HTTP - NSX Advanced Load Balancer 支持所有 HTTP/2 请求使用通过 TLS 的 HTTP 或通过 SSL 的 HTTP 方法。该方法使用 TLS 1.2 或更高版本。
适用于 HTTP 设置的所有设置和选项也适用于启用了 HTTP/2 的虚拟服务。还支持 HTTP/2 请求使用 HTTP 功能,例如,HTTP 策略、DataScript、HTTP 超时设置,等等。
虚拟服务、池和池组的 HTTP/2 支持
前端和后端(服务器端)连接支持 HTTP/2。HTTP/2 具有以下增强功能:
对于前端流量,在启用了 SSL 的端口和未启用 SSL 的端口上均支持 HTTP/2。
对于后端流量,在池级别启用了 HTTP/2。
在虚拟服务和池上启用 HTTP/2
无法通过应用程序配置文件提供 HTTP/2 配置选项。可以通过虚拟服务配置访问该选项。
以下配置更改在前端和后端支持 HTTP/2:
在应用程序配置文件中弃用了 http2_enabled 标记。
可以将 enable_http2 标记用于虚拟服务。
可以将 enable_http2 标记用于池和池组级别,以指示该池中配置的所有服务器是 HTTP/2.0 服务器。
使用 NSX Advanced Load Balancer 配置 HTTP/2
要为虚拟服务配置 HTTP2,请执行以下步骤:
导航到
。编辑现有虚拟服务或创建新的虚拟服务。
选中HTTP2 复选框。
下面提供的可以根据需要为 SSL 端口和非 SSL 端口启用 HTTP2。
要为与虚拟服务关联的池和池组配置 HTTP2,请执行以下步骤:
导航到创建池或使用现有的池。选中服务器下面提供的启用 HTTP2 复选框,如下所示:
,然后单击
2. 对于池组,导航到创建池组或使用现有的池组。要启用 HTTP2,请选中池服务器下面提供的启用 HTTP2 复选框,如下所示:
,然后单击使用 NSX Advanced Load Balancer UI 配置 HTTP/2
导航到HTTP2。可以根据需要为 SSL 端口和非 SSL 端口启用 HTTP2。
,使用现有虚拟服务或创建新的虚拟服务。选择 下面提供的为与虚拟服务关联的池和池组启用 HTTP2。导航到创建池或使用现有的池。选择服务器下面提供的启用 HTTP2 选项,如下所示:
,然后单击要为池组启用 HTTP2,请选择池服务器下面提供的启用 HTTP2,如下所示:
使用 NSX Advanced Load Balancer CLI 配置 HTTP/2
在 configure virtual service 模式下使用 enable_http2 标记。
配置虚拟服务
[admin:controller]: > configure virtualservice http2_vs [admin:controller]: virtualservice> services index 1 [admin:controller]: virtualservice:services> enable_http2
同样,将 enable_http2 标记用于虚拟服务的关联池和池组。
配置池
[admin:controller]: > configure pool v2-pool [admin:controller]: pool> enable_http2
配置池组
使用以下步骤为池组启用 HTTP/2。
[admin:controller]: > configure poolgroup v2-pg [admin:controller]: poolgroup> enable_http2
为现有池组启用 HTTP/2 - 要为现有池组启用 HTTP/2,请执行以下操作:
从池组中移除所有池成员。
使用上述步骤为所有池配置 enable_http2。
为池组配置 enable_http2。
将所有池添加到池组中。
正在检查状态
show virtualservice <virtual service name>
命令显示标记值设置为 true
,如以下代码输出所示:
[admin:controller]: > show virtualservice http2-vs +------------------------------------+-----------------------------------------------------+ | Field | Value | +------------------------------------+-----------------------------------------------------+ | uuid | virtualservice-2d67f7ed-eeee-4b81-af01-78ded84f4352 | | name | http2-vs | | enabled | True | | services[1] | | | port | 80 | | enable_ssl | False | | port_range_end | 80 | | enable_http2 | True |<---- | services[2] | | | port | 443 | | enable_ssl | True | | port_range_end | 443 |<---- | eable_http2 | True | | application_profile_ref | applicationprofile-22 | | network_profile_ref | System-TCP-Proxy | | pool_ref | v2-pool | | se_group_ref | Default-Group | | http_policies[1] | | | index | 11 | | http_policy_set_ref | http_request_policy_1 | +------------------------------------+-----------------------------------------------------+
[admin:controller]: > show pool v2-pool +---------------------------------------+------------------------------------------------+ | Field | Value | +---------------------------------------+------------------------------------------------+ | uuid | pool-5f38c27f-ff10-48e1-88e2-a9a2b39ad198 | | name | v2-pool | | default_server_port | 80 | | graceful_disable_timeout | 1 min | | connection_ramp_duration | 10 min | | max_concurrent_connections_per_server | 0 | | servers[1] | | | ip | 10.90.103.72 | | port | 80 | | hostname | 10.90.103.72 | | enabled | True | | ratio | 1 | | verify_network | False | | resolve_server_by_dns | False | | static | False | | rewrite_host_header | False | | lb_algorithm | LB_ALGORITHM_LEAST_CONNECTIONS | | lb_algorithm_hash | LB_ALGORITHM_CONSISTENT_HASH_SOURCE_IP_ADDRESS | | inline_health_monitor | True | | use_service_port | False | | capacity_estimation | False | | capacity_estimation_ttfb_thresh | 0 milliseconds | | vrf_ref | global | | fewest_tasks_feedback_delay | 10 sec | | enabled | True | | request_queue_enabled | False | | request_queue_depth | 128 | | host_check_enabled | False | | sni_enabled | True | | rewrite_host_header_to_sni | False | | rewrite_host_header_to_server_name | False | | lb_algorithm_core_nonaffinity | 2 | | lookup_server_by_name | False | | analytics_profile_ref | System-Analytics-Profile | | tenant_ref | admin | | cloud_ref | Default-Cloud | | server_timeout | 0 milliseconds | | delete_server_on_dns_refresh | True | | enable_http2 | True | <----- +---------------------------------------+------------------------------------------------+
限制
HTTP/2 池不支持缓存。
不支持上游 HTTP/2 连接多路复用。
未提供 HTTP/2 运行状况监控器支持。如果后端服务器仅支持 HTTP/2,则 HTTP(S) 运行状况监控器不适用于该池。只能为该池配置 TCP 或 PING 运行状况监控器。
如果后端服务器启用了SSL 并同时支持 HTTP/1 和 HTTP/2,则必须为 HTTPS 运行状况监控器配置自己的属性。
对于未启用 SSL 的端口,不支持从 HTTP/1.1 升级到 HTTP/2.0。
客户端必须知道非 SSL 端口只能支持 HTTP/2。
后端池假设侦听配置的端口的服务器仅支持 HTTP/2,而不会发送从 HTTP1.1 到 HTTP/2.0 的升级。
对于池组,池组和所有关联池之间的 HTTP 版本必须匹配。
不会同时支持一端(前端)的 HTTP/1.1 分块 Transfer-Encoding 机制和另一端(后端)的 HTTP/2 分块机制。如果存在分块,即,如果需要使用流模式或部分缓冲模式,并且一端为块,另一端为 V2 块,则不支持该方法。
升级
如果在应用程序配置文件中为侦听端口 80 和 443 的虚拟服务启用了 HTTP/2,在升级后,将在端口 443 上为虚拟服务自动启用 HTTP/2。不会在端口 80(未启用 SSL 的端口)上启用 HTTP/2。
HTTP/2 配置文件的其他配置选项
HTTP/2 配置字段已移到 http_profile
下面名为 http2_profile
的子字段。以下字段已添加到 http2_profile
中:
max_http2_requests_per_connection
:该值控制可以通过客户端 HTTP/2 连接发送的最大请求数。如果该值设置为 0,则可以通过 HTTP/2 客户端连接发送不限数量的请求。
max_http2_header_field
:该字段控制压缩的请求标头字段的最大大小(以字节为单位)。该限制同样适用于请求标头的名称和值,范围是 1-8192 字节。默认值为 4096 字节。
http2_initial_window_size
:该字段控制 HTTP/2 流中的初始流控制的窗口大小。该字段的值范围是 64-32768 KB。默认值为 64 KB。
max_http2_control_frames_per_connection
:该字段控制客户端可以通过 HTTP/2 连接发送的控制帧数。该字段的值范围是 0-10000,默认值为 1000。可以将该值设置为零,以允许在客户端 HTTP/2 连接上发送不限数量的控制帧。max_http2_queued_frames_to_client_per_connection
:该字段控制可以在任何给定时间排队等待通过客户端 HTTP/2 连接发送的帧数。该字段的值范围是 0-10000,默认值为 1000。该参数的值为零表示,可以在客户端 HTTP/2 连接上排队不限数量的帧。max_http2_empty_data_frames_per_connection
:该字段控制客户端可以通过 HTTP/2 连接发送的空数据帧数。该字段的值范围是 0-10000,默认值为 1000。该参数的值为零表示,可以通过客户端 HTTP/2 连接发送不限数量的空数据帧。max_http2_concurrent_streams_per_connection
:该字段用于配置客户端 HTTP/2 连接上的最大并发流数。该字段的值范围是 1-256,默认值为 128。
以下 CLI 片段显示上述选项的配置示例。登录到 NSX Advanced Load Balancer CLI。使用 applicationprofile
模式和 http2_profile 选项更改上述参数的值。
[admin:controller]: > configure applicationprofile ap-1 Updating an existing object. Currently, the object is: +------------------------------------------------------+---------------------------------------------------------+ | Field | Value | +------------------------------------------------------+---------------------------------------------------------+ | uuid | applicationprofile-1d264f41-d19c-445e-a4df-740dca5957f0 | | name | ap-1 | | type | APPLICATION_PROFILE_TYPE_HTTP | | http_profile | | | connection_multiplexing_enabled | True | | xff_enabled | True | | xff_alternate_name | X-Forwarded-For | | hsts_enabled | False | | hsts_max_age | 365 | | secure_cookie_enabled | False | | httponly_enabled | False | | http_to_https | False | | server_side_redirect_to_https | False | | x_forwarded_proto_enabled | False | | post_accept_timeout | 30000 milliseconds | | client_header_timeout | 10000 milliseconds | | client_body_timeout | 30000 milliseconds | | keepalive_timeout | 30000 milliseconds | | client_max_header_size | 12 kb | | client_max_request_size | 48 kb | | client_max_body_size | 0 kb | | max_rps_unknown_uri | 0 | | max_rps_cip | 0 | | max_rps_uri | 0 | | max_rps_cip_uri | 0 | | ssl_client_certificate_mode | SSL_CLIENT_CERTIFICATE_NONE | | websockets_enabled | True | | max_rps_unknown_cip | 0 | | max_bad_rps_cip | 0 | | max_bad_rps_uri | 0 | | max_bad_rps_cip_uri | 0 | | keepalive_header | False | | use_app_keepalive_timeout | False | | allow_dots_in_header_name | False | | disable_keepalive_posts_msie6 | True | | enable_request_body_buffering | False | | enable_fire_and_forget | False | | max_response_headers_size | 48 kb | | respond_with_100_continue | True | | hsts_subdomains_enabled | True | | enable_request_body_metrics | False | | fwd_close_hdr_for_bound_connections | True | | max_keepalive_requests | 100 | | disable_sni_hostname_check | False | | reset_conn_http_on_ssl_port | False | | http_upstream_buffer_size | 0 kb | | enable_chunk_merge | True | | http2_profile | | | max_http2_control_frames_per_connection | 1000 | | max_http2_queued_frames_to_client_per_connection | 1000 | | max_http2_empty_data_frames_per_connection | 1000 | | max_http2_concurrent_streams_per_connection | 128 | | max_http2_requests_per_connection | 1000 | | max_http2_header_field_size | 4096 bytes | | http2_initial_window_size | 64 kb | | preserve_client_ip | False | | preserve_client_port | False | | preserve_dest_ip_port | False | | tenant_ref | admin | +------------------------------------------------------+---------------------------------------------------------+ [admin:controller]: applicationprofile> http_profile [admin:controller]: applicationprofile:http_profile> http2_profile [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_control_frames_per_connection 2000 Overwriting the previously entered value for max_http2_control_frames_per_connection [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_queued_frames_per_connection 2000 No command or arguments found in 'max_http2_queued_frames_per_connection 2000'. [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_queued_frames_to_client_per_connection 2000 Overwriting the previously entered value for max_http2_queued_frames_to_client_per_connection [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_concurrent_streams_per_connection 256 Overwriting the previously entered value for max_http2_concurrent_streams_per_connection [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_requests_per_connection 2500 Overwriting the previously entered value for max_http2_requests_per_connection [admin:controller]: applicationprofile:http_profile:http2_profile> http2_initial_window_size 256 Overwriting the previously entered value for http2_initial_window_size [admin:controller]: applicationprofile:http_profile:http2_profile> max_http2_header_field_size 8192 Overwriting the previously entered value for max_http2_header_field_size [admin:controller]: applicationprofile:http_profile:http2_profile> save [admin:controller]: applicationprofile:http_profile> save [admin:controller]: applicationprofile> save +------------------------------------------------------+---------------------------------------------------------+ | Field | Value | +------------------------------------------------------+---------------------------------------------------------+ | uuid | applicationprofile-1d264f41-d19c-445e-a4df-740dca5957f0 | | name | ap-1 | | type | APPLICATION_PROFILE_TYPE_HTTP | | http_profile | | | connection_multiplexing_enabled | True | | xff_enabled | True | | xff_alternate_name | X-Forwarded-For | | hsts_enabled | False | | hsts_max_age | 365 | | secure_cookie_enabled | False | | httponly_enabled | False | | http_to_https | False | | server_side_redirect_to_https | False | | x_forwarded_proto_enabled | False | | post_accept_timeout | 30000 milliseconds | | client_header_timeout | 10000 milliseconds | | client_body_timeout | 30000 milliseconds | | keepalive_timeout | 30000 milliseconds | | client_max_header_size | 12 kb | | client_max_request_size | 48 kb | | client_max_body_size | 0 kb | | max_rps_unknown_uri | 0 | | max_rps_cip | 0 | | max_rps_uri | 0 | | max_rps_cip_uri | 0 | | ssl_client_certificate_mode | SSL_CLIENT_CERTIFICATE_NONE | | websockets_enabled | True | | max_rps_unknown_cip | 0 | | max_bad_rps_cip | 0 | | max_bad_rps_uri | 0 | | max_bad_rps_cip_uri | 0 | | keepalive_header | False | | use_app_keepalive_timeout | False | | allow_dots_in_header_name | False | | disable_keepalive_posts_msie6 | True | | enable_request_body_buffering | False | | enable_fire_and_forget | False | | max_response_headers_size | 48 kb | | respond_with_100_continue | True | | hsts_subdomains_enabled | True | | enable_request_body_metrics | False | | fwd_close_hdr_for_bound_connections | True | | max_keepalive_requests | 100 | | disable_sni_hostname_check | False | | reset_conn_http_on_ssl_port | False | | http_upstream_buffer_size | 0 kb | | enable_chunk_merge | True | | http2_profile | | | max_http2_control_frames_per_connection | 2000 | | max_http2_queued_frames_to_client_per_connection | 2000 | | max_http2_empty_data_frames_per_connection | 1000 | | max_http2_concurrent_streams_per_connection | 256 | | max_http2_requests_per_connection | 2500 | | max_http2_header_field_size | 8192 bytes | | http2_initial_window_size | 256 kb | | preserve_client_ip | False | | preserve_client_port | False | | preserve_dest_ip_port | False | | tenant_ref | admin | +------------------------------------------------------+---------------------------------------------------------+ [admin:controller]: >
[admin:controller]: > show applicationprofile ap-1 +------------------------------------------------------+---------------------------------------------------------+ | Field | Value | +------------------------------------------------------+---------------------------------------------------------+ | uuid | applicationprofile-1d264f41-d19c-445e-a4df-740dca5957f0 | | name | ap-1 | | type | APPLICATION_PROFILE_TYPE_HTTP | | http_profile | | | connection_multiplexing_enabled | True | | xff_enabled | True | | xff_alternate_name | X-Forwarded-For | | hsts_enabled | False | | hsts_max_age | 365 | | secure_cookie_enabled | False | | httponly_enabled | False | | http_to_https | False | | server_side_redirect_to_https | False | | x_forwarded_proto_enabled | False | | post_accept_timeout | 30000 milliseconds | | client_header_timeout | 10000 milliseconds | | client_body_timeout | 30000 milliseconds | | keepalive_timeout | 30000 milliseconds | | client_max_header_size | 12 kb | | client_max_request_size | 48 kb | | client_max_body_size | 0 kb | | max_rps_unknown_uri | 0 | | max_rps_cip | 0 | | max_rps_uri | 0 | | max_rps_cip_uri | 0 | | ssl_client_certificate_mode | SSL_CLIENT_CERTIFICATE_NONE | | websockets_enabled | True | | max_rps_unknown_cip | 0 | | max_bad_rps_cip | 0 | | max_bad_rps_uri | 0 | | max_bad_rps_cip_uri | 0 | | keepalive_header | False | | use_app_keepalive_timeout | False | | allow_dots_in_header_name | False | | disable_keepalive_posts_msie6 | True | | enable_request_body_buffering | False | | enable_fire_and_forget | False | | max_response_headers_size | 48 kb | | respond_with_100_continue | True | | hsts_subdomains_enabled | True | | enable_request_body_metrics | False | | fwd_close_hdr_for_bound_connections | True | | max_keepalive_requests | 100 | | disable_sni_hostname_check | False | | reset_conn_http_on_ssl_port | False | | http_upstream_buffer_size | 0 kb | | enable_chunk_merge | True | | http2_profile | | | max_http2_control_frames_per_connection | 1000 | | max_http2_queued_frames_to_client_per_connection | 1000 | | max_http2_empty_data_frames_per_connection | 1000 | | max_http2_concurrent_streams_per_connection | 128 | | max_http2_requests_per_connection | 1000 | | max_http2_header_field_size | 4096 bytes | | http2_initial_window_size | 64 kb | | preserve_client_ip | False | | preserve_client_port | False | | preserve_dest_ip_port | False | | tenant_ref | admin | +------------------------------------------------------+---------------------------------------------------------+
日志
可以使用以下模式之一检查日志:
使用 NSX Advanced Load Balancer UI
使用 NSX Advanced Load Balancer CLI
使用 UI 检查日志
NSX Advanced Load Balancer 的应用程序日志将 HTTP/2.0 显示为请求中的 HTTP 版本。导航到 ,选择所需的虚拟服务,然后导航到日志选项卡以检查日志。
可以在重要日志下面检查与 HTTP/2 请求和响应相关的错误。
使用 CLI 检查日志
以下是适用于 HTTP/2 功能的计数器,可以在故障排除期间使用这些计数器。
请求处理错误
响应代码(2xx、3xx、4xx 和 5xx)
协议错误
流量控制错误
帧大小错误
压缩错误
拒绝的流错误
可以使用 show virtualservice <virtual service name> detail
命令检查 HTTP/2 方法的可用计数器。
[admin:controller]: > show virtualservice <virtual service name> detail | cache_bytes | 0 | | http2_requests_handled | 2 | | http2_response_2xx | 2 | | http2_response_3xx | 0 | | http2_response_4xx | 0 | | http2_response_5xx | 0 | | http2_protocol_errors | 0 | | http2_flow_control_errors | 0 | | http2_frame_size_errors | 0 | | http2_compression_errors | 0 | | http2_refused_stream_errors | 0 | | http2_enhance_your_calm | 0 | | http2_miscellaneous_errors | 0
可以使用 show pool <pool name> detail
命令在池状态中检查与 HTTP/2 相关的错误。
[admin:controller]: > show pool v2-pool detail | grep http2 | http2_protocol_header_errors | 0 | | http2_protocol_other_errors | 0 | | http2_flow_control_errors | 0 | | http2_frame_size_errors | 0 | | http2_compression_errors | 0 | | http2_refused_stream_errors | 0 | | http2_enhance_your_calm | 0 | | http2_misc_errors | 0 | [admin:controller]:
HPACK 动态表
除了静态表以外,HPACK 还具有一个连接级别动态表,从位置 62(静态表之后)开始,一直到 SETTINGS 帧中的 SETTINGS_HEADER_TABLE_SIZE 值定义的最大表大小。如果未明确定义,则使用默认值(4096 个八位字节)。在达到最大表大小时,将逐出最早的条目。为了简化该过程,在写入表时,每个条目将会递增。
标头的表条目位置不是静态的。在当前和将来请求在表中添加新标头时,它会不断增加。TCP 保证该顺序,因此,在 HTTP/2 中,动态表对于每个 TCP 连接是唯一的。
有关 HPACK 标头类型的完整信息,请参见 RFC7541。
在客户端已支持动态 HPACK 表。从 22.1.1 版本开始,NSX Advanced Load Balancer 添加了服务器端支持。
在服务器端,在 NSX Advanced Load Balancer 尝试创建 HTTP2 连接时,它检查是否在虚拟服务上启用了缓存。如果启用了缓存,它在 SETTINGS 帧中将 SETTINGS_HEADER_TABLE_SIZE 值设置为零以禁用动态 HPACK 表。如果未启用缓存,则 NSX Advanced Load Balancer 将 SETTINGS_HEADER_TABLE_SIZE 设置为 4k。无法配置 SETTINGS_HEADER_TABLE_SIZE。