gpt4 book ai didi

apache2 - 如何通过 Apache HTTP 服务器让 Vaadin Push 工作?

转载 作者:行者123 更新时间:2023-12-04 11:25:42 26 4
gpt4 key购买 nike

我正在尝试让 Vaadin 7.1.5 Push 在 Apache Tomcat 7.0.42 + Apache HTTP 服务器(带有 mod_proxy_wstunnel 的 2.2.14)上工作。

当我直接访问 Tomcat(即 http://mydomain:8080/myapp)时,Vaadin 应用程序和使用 WebSocket 推送工作正常。当我尝试使用 Apache 模块 mod_proxy 和 mod_proxy_wstunnel 访问它时,就会出现问题。发生的情况是应用程序挂起,加载指示器变红,我在浏览器控制台的推送请求中收到此错误:

HTTP Status 501 - Websocket protocol not supported
type Status report
message Websocket protocol not supported
description The server does not support the functionality needed to fulfill this request.

Apache Tomcat/7.0.42

在需要 Push 之前,我使用 mod_jk 转发来自 http://mydomain/myapp 的请求至 http://mydomain:8080/myapp .显然 mod_jk 不支持 WebSocket 所以我选择使用 ProxyPass 指令。这是我的 Apache 配置:
ProxyPass               /myapp/PUSH/ ws://localhost:8080/myapp/PUSH/
ProxyPassReverse /myapp/PUSH/ ws://localhost:8080/myapp/PUSH/

ProxyPass /myapp/VAADIN/ http://localhost:8080/myapp/VAADIN/
ProxyPassReverse /myapp/VAADIN/ http://localhost:8080/myapp/VAADIN/
ProxyPass /myapp http://localhost:8080/myapp
ProxyPassReverse /myapp http://localhost:8080/myapp

我怀疑 mod_proxy_wstunnel 是罪魁祸首,但显然当我代理 http://echo.websocket.org 时它工作正常.我发现 501 错误是由 Atmosphere 引发的,但我不知道如何调试它。如果我删除 ws 代理(因此推送使用 HTTP 而不是 WS),我会立即收到“ session 已过期”错误。

有谁知道如何正确地将来自 Apache HTTP 服务器的推送请求代理到 Apache Tomcat?

最佳答案

我通过确保 ProxyPass(和 ProxyPassReverse)的路径与应用程序的上下文相同并在 tomcat 的 server.xml 配置中创建一个新的 NIO 连接器来解决这个问题:

<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
proxyName="mydomain"
proxyPort="80" />

我很确定有一种方法可以使用与应用程序上下文不同的路径,但这对我有用。

更新:请注意,此解决方案不适用于不支持 websocket 的浏览器(例如 IE <= 9)。我怀疑它与作为后备方法的 HTTP 流有关..

关于apache2 - 如何通过 Apache HTTP 服务器让 Vaadin Push 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18918392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com