我们可以使用 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 等解决方案中可用。
其实我有两个问题:
- 我可以只激活 Apache mod_http2 并配置我的前端吗
(AngularJS) 在 HTTP/2 中交流还是我也有必要
应用程序服务器能够处理 HTTP/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 中是不可用的。
专门针对您的问题:
- 您 可以 激活
mod_http2
以便浏览器和 Apache 将通过 HTTP/2 进行通信,但您可能会丢失 HTTP/2 推送。但是,与后端的通信将使用 HTTP/1.1。这会起作用,但不是最佳 HTTP/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
这是我目前用来提供对 Web 应用程序的访问的基本架构(AngularJS 在前端 - JEE-JAX-RS 用于后端 REST API):
客户端 -> Apache -> 应用程序服务器(Java 容器 - 例如 tomcat)
客户端浏览器通过 HTTPS(由 Apache 处理)连接到应用程序,Apache 将连接转发到 Java 容器(我使用的是 Oracle Weblogic)。 一切正常。但现在我想使用 HTTP/2.
显然,HTTP/2 将仅在 JEE8 (Servlet v4) 中可用,这意味着它在很长一段时间内不会在 Weblogic 等解决方案中可用。
其实我有两个问题:
- 我可以只激活 Apache mod_http2 并配置我的前端吗 (AngularJS) 在 HTTP/2 中交流还是我也有必要 应用程序服务器能够处理 HTTP/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 还提供了一个
专门针对您的问题:
- 您 可以 激活
mod_http2
以便浏览器和 Apache 将通过 HTTP/2 进行通信,但您可能会丢失 HTTP/2 推送。但是,与后端的通信将使用 HTTP/1.1。这会起作用,但不是最佳 HTTP/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