我们可以使用 Apache 为 java 应用程序服务器提供 HTTP/2 连接吗?

Can we use Apache to deliver HTTP/2 connection for a java application server?

这是我目前用来提供对 Web 应用程序的访问的基本架构(AngularJS 在前端 - JEE-JAX-RS 用于后端 REST API):

客户端 -> Apache -> 应用程序服务器(Java 容器 - 例如 tomcat)

客户端浏览器通过 HTTPS(由 Apache 处理)连接到应用程序,Apache 将连接转发到 Java 容器(我使用的是 Oracle Weblogic)。 一切正常。但现在我想使用 HTTP/2.

显然,HTTP/2 将仅在 JEE8 (Servlet v4) 中可用,这意味着它在很长一段时间内不会在 Weblogic 等解决方案中可用。

其实我有两个问题:

  1. 我可以只激活 Apache mod_http2 并配置我的前端吗 (AngularJS) 在 HTTP/2 中交流还是我也有必要 应用程序服务器能够处理 HTTP/2 ?
  2. 如果 Apache 在 HTTP/2 中接收到连接并将其转发到 Java 通过 HTTP/1.1 或 AJP 的容器,即使部分连接不在 HTTP/2 中,我仍然会受益于所有 HTTP/2 优势吗?

Apache(和 Nginx)目前无法在保留代理模式下工作并使用 HTTP/2.

与后端通信

当你有这样的 "mixed" 通信时(浏览器在 HTTP/2 中与 Apache 和 Apache 在 HTTP/1.1 或 AJP 中后端)你失去了一些优化 HTTP/2 带来,特别是多路复用和 HTTP/2 推送,更不用说将请求从 HTTP/2 转换为 HTTP/1.1 和反之亦然的开销。

HTTP/2已经在Java世界中可用:Jetty(我是JettyHTTP/2领导),Undertow和Netty已经提供透明HTTP/2 支持,以便您只需部署 JEE 应用程序,启用 HTTP/2 即可完成。

由于Apache和Nginx的这些限制,我们目前建议在Jetty之前使用HAProxy(详见here)。 此配置将为您提供 HTTP/2 的最大好处:由 HAProxy 执行的快速 TLS 卸载、强大的负载平衡、与后端的非常高效的通信(不转换为 HTTP/1.1),以及 HTTP/2 无处不在,因此它的所有好处。

Jetty 还提供了一个 ,据我所知,它在 Apache 或 Nginx 中是不可用的。

专门针对您的问题:

  1. 可以 激活 mod_http2 以便浏览器和 Apache 将通过 HTTP/2 进行通信,但您可能会丢失 HTTP/2 推送。但是,与后端的通信将使用 HTTP/1.1。这会起作用,但不是最佳 HTTP/2 部署。
  2. 如果部分通信不在 HTTP/2 中,您将 不会 在客户端和后端之间的通信中获得任何 HTTP/2 优势。

是的,您可以在 Apache24/conf 文件夹中的 httpd.conf 文件中激活 mod_http2。您还需要启用以下模块: 1. mod_log_config 2. mod_setenvif 3. mod_ssl 4. socache_shmcb_module 您必须通过取消注释行将 httpd-ssl.conf 文件包含在 httpd.conf 文件中 -- include /extra/httpd-ssl.conf 在 conf 文件夹中包含证书和密钥,并在 https-ssl.conf 文件中设置它们的路径 上述步骤将在 Apache 2.4

中启用 HTTP/2

您可以通过安装 Tomcat-9 为 Tomcat 上托管的 Java 应用程序启用 HTTP/2.0。 Tomcat-9 支持HTTP/2.0 和服务器推送服务。

您可以使用以下 link 中的说明将您的请求从 Apache 2.4 重定向到 Tomcat 9 https://www3.ntu.edu.sg/home/ehchua/programming/howto/ApachePlusTomcat_HowTo.html

使用这些步骤,您可以启用 HTTP/2.0 在客户端浏览器、Apache 和您的 Java 应用程序之间工作。通过这种方式,您将获得 HTTP/2.0 的全部好处。

我已经在我的项目中实施了上述所有步骤,并获得了高效沟通的全部奖励。

如果您有任何疑问,可以在这里留下您的意见。

HTTP/2 也可用于 Tomcat 8.5