HTTP/2 在 haproxy 和 apache 上的使用 tomcat 堆栈
HTTP/2 usage on haproxy and apache tomcat stack
我们有非常简单的设置,例如:
客户端 <----->Haproxy<----->Apache 使用虚拟主机连接到 tomcat 使用 mod_jk。
我打算在上述设置中利用 HTTP/2。我在 HAPROXY 终止了 SSL。在 apache 中我有 100-120 个虚拟主机。有人可以建议我应该为所有那些当前的非 SSL 虚拟主机设置 SSL 证书 + SSL 虚拟主机吗?
其次,我是否也需要在 tomcat server.xml 中设置 ssl cert + Config?
我有点困惑,我应该在 Stack 中实现哪一层 HTTP/2?
HAproxy only recently added support for HTTP/2 in 1.8 但仅来自传入前端连接,不适用于传出 back-end 连接。
但即便如此,您还是有一些选择,具体取决于您使用的软件版本以及它们提供的 HTTP/2 支持:
在 HAProxy 中终止 HTTP/2,就像您终止 SSL/TLS 一样,只需对 Apache 说 HTTP/1.1 并继续使用 mod_jk与 Tomcat.
交谈
在 HAProxy 处终止 SSL/TLS,并将明文 HTTP/2 消息转发给 Apache,然后 Apache 可以继续使用 mod_jk 与 Tomcat。这要求您使用听起来有点奇怪的组合,将前端 HAProxy 连接视为 HTTP(因此它卸载 SSL/TLS),但后端连接到 Apache 就像 TCP 连接而不是您当前可能使用的 HTTP 连接.这个设置详细here.
将 HAProxy 更改为完整的 TCP 代理,而不是 HTTP 代理,并将 SSL/TLS 加密请求转发到可以使用 HTTPS 和 HTTP/2 的 Apache。这假设您不需要 HAProxy 的 SSL/TLS and/or HTTP 数据来知道将其发送到哪个 Apache。使用 mod_jk.
与 Tomcat 通信
完全删除 HAProxy 并终止你在 Apache 的 SSL/TLS 和 HTTP/2。如果您有一个 Apache 服务器为所有这些虚拟主机提供服务,那么老实说,我不确定 HAProxy 目前能为您提供什么?但是,如果您有多个 Apache,那么这会更有意义,因此您可能不想考虑此选项。
选项 2-4 中的任何一个,但也将 mod_jk 替换为 mod_proxy_http2,这样您就可以一直说 HTTP/2(假设您的 Tomcat 支持 HTTP/2)。请注意 mod_proxy_http2 仍被标记为实验性的,因此您可能还不适应在生产环境中使用它。
不过你需要一路讲 HTTP/2 吗?在我看来不,最大的好处是在你的基础设施的入口点,因为最大的收益是由于低延迟链接(如浏览器->入口点)的速度改进。但是,如果您想利用 HTTP/2 Push 等,那么您可能需要一直支持它,或者使用 Link headers 并让 HTTP 入口点支持它(例如Apache 支持 HTTP/2 推送并且如果 Tomcat 设置适当 Link headers 即使 Tomcat 不支持 HTTP/2 也可以推送资产。有关这方面的更多讨论,请参阅 this question and the answers。
我们有非常简单的设置,例如:
客户端 <----->Haproxy<----->Apache 使用虚拟主机连接到 tomcat 使用 mod_jk。
我打算在上述设置中利用 HTTP/2。我在 HAPROXY 终止了 SSL。在 apache 中我有 100-120 个虚拟主机。有人可以建议我应该为所有那些当前的非 SSL 虚拟主机设置 SSL 证书 + SSL 虚拟主机吗?
其次,我是否也需要在 tomcat server.xml 中设置 ssl cert + Config?
我有点困惑,我应该在 Stack 中实现哪一层 HTTP/2?
HAproxy only recently added support for HTTP/2 in 1.8 但仅来自传入前端连接,不适用于传出 back-end 连接。
但即便如此,您还是有一些选择,具体取决于您使用的软件版本以及它们提供的 HTTP/2 支持:
在 HAProxy 中终止 HTTP/2,就像您终止 SSL/TLS 一样,只需对 Apache 说 HTTP/1.1 并继续使用 mod_jk与 Tomcat.
交谈
在 HAProxy 处终止 SSL/TLS,并将明文 HTTP/2 消息转发给 Apache,然后 Apache 可以继续使用 mod_jk 与 Tomcat。这要求您使用听起来有点奇怪的组合,将前端 HAProxy 连接视为 HTTP(因此它卸载 SSL/TLS),但后端连接到 Apache 就像 TCP 连接而不是您当前可能使用的 HTTP 连接.这个设置详细here.
将 HAProxy 更改为完整的 TCP 代理,而不是 HTTP 代理,并将 SSL/TLS 加密请求转发到可以使用 HTTPS 和 HTTP/2 的 Apache。这假设您不需要 HAProxy 的 SSL/TLS and/or HTTP 数据来知道将其发送到哪个 Apache。使用 mod_jk.
与 Tomcat 通信
完全删除 HAProxy 并终止你在 Apache 的 SSL/TLS 和 HTTP/2。如果您有一个 Apache 服务器为所有这些虚拟主机提供服务,那么老实说,我不确定 HAProxy 目前能为您提供什么?但是,如果您有多个 Apache,那么这会更有意义,因此您可能不想考虑此选项。
选项 2-4 中的任何一个,但也将 mod_jk 替换为 mod_proxy_http2,这样您就可以一直说 HTTP/2(假设您的 Tomcat 支持 HTTP/2)。请注意 mod_proxy_http2 仍被标记为实验性的,因此您可能还不适应在生产环境中使用它。
不过你需要一路讲 HTTP/2 吗?在我看来不,最大的好处是在你的基础设施的入口点,因为最大的收益是由于低延迟链接(如浏览器->入口点)的速度改进。但是,如果您想利用 HTTP/2 Push 等,那么您可能需要一直支持它,或者使用 Link headers 并让 HTTP 入口点支持它(例如Apache 支持 HTTP/2 推送并且如果 Tomcat 设置适当 Link headers 即使 Tomcat 不支持 HTTP/2 也可以推送资产。有关这方面的更多讨论,请参阅 this question and the answers。