Jetty 9.0 嵌入了带有 SPDY 但没有 SSL/NPN 的配置

Posted

技术标签:

【中文标题】Jetty 9.0 嵌入了带有 SPDY 但没有 SSL/NPN 的配置【英文标题】:Jetty 9.0 embeded config with SPDY but without SSL/NPN 【发布时间】:2014-04-19 05:10:07 【问题描述】:

SSL/NPN 将通过我们的负载均衡器 (Haproxy) 进行处理,因此我真的不需要 Jetty 为我们执行此操作。

但我在网上看到的所有示例都只显示了如何使用 SSL/NPN 来做到这一点,而不是没有。

到目前为止,这是我尝试过的:

Server server = new Server();
HTTPConfiguration httpConfig = .... // set up some additional http config here
PushStrategey push = new ReferrerPushStrategy();
List<ConnectionFactory> factories = new ArrayList<>();
factories.add(new HTTPSPDYServerConnectionFactory(SPDY.V3, httpConfig, push));
factories.add(new HTTPSPDYServerConnectionFactory(SPDY.V2, httpConfig, push));
factories.add(new HTTPConnectionFactory(httpConfig));
ServerConnector connector = new ServerConnector(server, factories.toArray(new ConnectionFactory[factories.size()]));
connector.setPort(port);
server.addConnector(connector);
connector.start();
....

不幸的是,似乎出了点问题,当我尝试通过 curl 或我的浏览器等客户端访问服务器时,它们会无限期地挂起。我做错了什么?

谢谢

【问题讨论】:

【参考方案1】:

当您将 ServerConnector 配置为使用明文 SPDY 时,您的客户端也必须使用明文 SPDY。

如果您使用像 curl 这样的客户端或浏览器,它们不会说明文 SPDY。客户端将发送一个无法理解的 HTTP 请求(服务器需要 SPDY),这就是您的连接“挂起”的原因。

只有 Chromium/Chrome 有一种模式,您可以使用 --use-spdy=no-ssl 参数使其说出明文 SPDY,如 here 所述。

因此,如果您使用明文 SPDY,则配置多个 ServerConnectionFactory 毫无意义,因为无法根据正在协商的协议选择一个,因为没有协议协商。

协议协商仅在使用 SSL+NPN 时发生。

如果你真的想设置一个明文SPDY ServerConnector,你的代码基本上是正确的(除了不必要的多个ServerConnectionFactory); this 是在Jetty SPDY 测试套件中如何设置的示例。

最后,另请参阅reference documentation about SPDY。

【讨论】:

当然,谢谢,这是有道理的。这是否意味着我必须为我们想要支持的每个 SPDY 版本打开单独的连接器/端口?我想在这种情况下,在负载均衡器而不是 Jetty 上实现 SPDY 和 SSL/NPN 更有意义,尽管在这种情况下很难实现有用的推送策略。 取决于负载均衡器。那些能够在卸载 SSL 后将明文 SPDY“隧道”传输到后端的客户端将允许客户端受益于 Jetty 中的 SPDY 功能,例如多路复用和 SPDY 推送,而不会使负载均衡器与 SPDY 功能混淆。例如Webtide blogs就是这样配置的,使用HAProxy作为负载均衡器。在这种情况下,我只会宣传一个 SPDY 版本;大多数(如果不是所有)浏览器都支持 SPDY/3,因此仍然支持 SPDY/2 没有什么意义。 @sbordet 我有一个关于 SPDY 码头 9.0 的问题,但不知何故我无法弄清楚。我们可以将 jetty 9.0 与 SPDY 以及 solr zookeeper 一起使用吗?我一直在尝试这样做,但不知何故,如果我在 jetty 9.0 中添加模块 spdy,zookeeper 服务器甚至都不会启动。如果你能帮助我,我将不胜感激。我也发布了一个关于它的问题,***.com/questions/23191710/…

以上是关于Jetty 9.0 嵌入了带有 SPDY 但没有 SSL/NPN 的配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JDK8 上使用 SPDY 运行 Jetty?

使用开箱即用的 SPDY 运行 Jetty

如何使用 ALPN 使用 SPDY 运行 Jetty?

Jetty:可以使用 SPDY/3.1 吗?

SPDY “Hello server” 与 Jetty

如何通过 ALPN 在 Jetty SPDY 上使用客户端证书?