17.13. 配置 HTTP/2
Undertow 允许使用 HTTP/2 标准,这可以通过压缩标头和在同一 TCP 连接上多路复用来缩短延迟。它还使服务器能够在请求资源之前将资源推送至客户端,从而加快页面负载。
请注意,HTTP/2 仅适用于同时支持 HTTP/2 标准的客户端和浏览器。
大多数现代浏览器通过安全 TLS 连接(称为 h2
)强制 HTTP/2,可能不支持通过普通 HTTP(称为 h2c
)的 HTTP/2。换而言之,仍可以将 JBoss EAP 配置为使用 HTTP/2 和 h2c
,无需使用 HTTPS,仅使用 HTTP 升级时使用普通 HTTP。在这种情况下,您只需在 HTTP 侦听器 Undertow 中启用 HTTP/2:
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=enable-http2,value=true)
要将 Undertow 配置为使用 HTTP/2,请在 Undertow 中启用 HTTPS 侦听器以使用 HTTP/2,方法是将 enable-http2
属性 设置为 true
:
/subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=enable-http2,value=true)
有关 HTTPS 侦听器并将 Undertow 配置为将 HTTPS 用于 Web 应用程序的更多信息,请参阅如何配置服务器安全性为应用配置单向和双向 SSL/TLS。
为了使用带有 elytron
子系统的 HTTP/2,您需要确保 Undertow 的 https
配置为可修改。这可以通过将相应的 -listener
中的 configuressl-contextserver-ssl-context
的 wrap
属性设置为 false
来实现。默认情况下,wrap
属性设为 false
。Undertow 需要此功能,才能对 ALPN 对 ssl-context
进行修改。如果提供的 ssl-context
不可写,则无法使用 ALPN,连接将返回 HTTP/1.1。
使用 HTTP/2 时支持 ALPN
在安全 TLS 连接中使用 HTTP/2 时,需要支持 ALPN TLS 协议扩展的 TLS 堆栈。获取这个堆栈会根据安装的 JDK 的不同而有所不同。
- 使用 Java 8 时,ALPN 实施直接引入到 JBoss EAP 中,其依赖性依赖于 Java 内部。因此,ALPN 实施仅适用于 Oracle 和 OpenJDK。它不适用于 IBM Java。红帽强烈建议您利用 JBoss EAP 中 OpenSSL 供应商的 ALPN TLS 协议扩展支持,以及实施 ALPN 功能的 OpenSSL 库。使用 OpenSSL 供应商提供的 ALPN TLS 协议扩展支持应该可以提高性能。
- 自 Java 9 起,JDK 以原生方式支持 ALPN;但是,使用来自 OpenSSL 提供商的 ALPN TLS 协议扩展支持还应提高使用 Java 9 或更高版本的性能。
安装 OpenSSL 的说明(获得 ALPN TLS 协议扩展支持),请参见 JBoss 核心服务中的安装 OpenSSL。Red Hat Enterprise Linux 8 支持标准系统 OpenSSL,且不需要额外的 JBoss Core Services OpenSSL。
安装了 OpenSSL 后,请按照配置 JBoss EAP 使用 OpenSSL 中的说明操作。
验证 HTTP/2 是否正在使用
若要验证 Undertow 是否在使用 HTTP/2,您需要检查来自 Undertow 的标头。使用 https(如 https://localhost:8443 )导航到您的 JBoss EAP 实例,再使用浏览器的开发人员工具来检查标题。使用 HTTP/2 时,一些浏览器(如 Google Chrome)将显示 HTTP/2 伪标头,如 :path
、:
。其他浏览器(如 Firefox 和 Safari)会将标头的状态或版本报告为 authority
、:method
和:schemeHTTP/2.0
。