在 Apache 防火墙后面运行 SPDY 的 Jetty 服务器

Posted

技术标签:

【中文标题】在 Apache 防火墙后面运行 SPDY 的 Jetty 服务器【英文标题】:Jetty server running SPDY behind an Apache firewall 【发布时间】:2015-08-27 09:01:32 【问题描述】:

我在 /mine 有一个应用程序在支持 SPDY 的 Jetty 服务器上运行。它位于用作代理的 Apache 防火墙后面。

/mine 上的应用程序通过 Apache 上的以下配置规则进行路由:

RewriteRule ^/mine$ /mine/ [R,L]
ProxyPass /code/ https://jettyserver:9443/mine/ nocanon
ProxyPassReverse /mine/ https://jettyserver:9443/mine/ nocanon

因此,当我点击 apache/mine/ 时,我的浏览器没有与我的应用程序协商 SPDY。

将 mod_spdy 添加到代理将是正确的方法,但我目前无法使用我们正在运行的 Apache 执行此操作。

有没有办法让它工作?

【问题讨论】:

【参考方案1】:

对于您要运行的特定配置,恐怕无法使其与 SPDY 或 HTTP/2 一起使用。

配置为反向代理的 Apache 与 Jetty 对话 HTTP/1.1,因此根本无法让 SPDY 或 HTTP/2 进入图片(考虑到您无法让 Apache 对话 SPDY)。

但是,有许多替代解决方案。 让我们只关注 HTTP/2,因为 SPDY 现在正被淘汰,取而代之的是 HTTP/2。

第一个也是最简单的解决方案就是完全删除 Apache。 您只需将 Jetty 公开为您的服务器,它就可以毫无问题地向浏览器发送 HTTP/2 和 HTTP/1.1。 Jetty 将处理 TLS,然后是 HTTP/2 或 HTTP/1.1。

第二种解决方案是将HAProxy放在前面,然后将其转发给Jetty。 HAProxy 将处理 TLS 并将明文 HTTP/2 或 HTTP/1.1 转发到 Jetty。

这两种解决方案的优势在于您将受益于 Jetty 的 HTTP/2 支持以及它的 HTTP/2 Push capabilities。 不仅如此,Jetty 还为您提供了广泛的 Apache 功能,例如 rewriting、proxying、php/FastCGI support 等。 对于大多数配置,您不需要 Apache,因为 Jetty 可以做到。

第一个解决方案的优点是您只需配置一个服务器(Jetty),但您可能会为 TLS 支付一点费用,因为 Jetty 使用的 JDK 实现并不是最有效的。

第二种解决方案的优点是 TLS 将由 HAProxy 更有效地完成,并且您可以更轻松地在端口 80 上运行它。但是,您必须配置两台服务器(HAProxy 和 Jetty),而不仅仅是一台。

查看Jetty HTTP/2 documentation 和Webtide blogs,我们经常在其中添加有关 HTTP/2、配置和示例的条目。

【讨论】:

感谢您的回答,它证实了我的怀疑。据我所知,Apache 目前还没有 HTTP/2 的故事。在支持 HTTP/2 之前,我们可以尝试构建并进入我们的 Apache 2.4 代理的 mod_spdy 源代码。我们也在考虑将代理迁移到 nginx 只是出于好奇,为什么要把 Apache 放在前面? 代理后面有很多服务器,我们的服务器只是其中之一。我们将尝试在我们的 Apache 2.4 上构建 mod_spdy,看看这是否会在短期内有所帮助。 我不认为带有 mod_spdy 的 Apache 能够与后端(仅对前端)说 SPDY,所以你仍然会使用 HTTP/1.1 来处理 Jetty,但好处很少,如果有的话。

以上是关于在 Apache 防火墙后面运行 SPDY 的 Jetty 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache 中定义本地站点 - 使用 80 以外的端口

将 mod-spdy 与 mod-mono 集成

HAproxy 和 Node.js+Spdy

Windows 版的 Spdy ( speedy ) 是不是可用?

将 SPDY 与 Netty 一起使用

我可以将 SPDY 与 Unicorn 一起使用吗?