我正在尝试让 Vaadin 7.1.5 Push 在 Apache Tomcat 7.0.42 + Apache HTTP 服务器(带有 mod_proxy_wstunnel 的 2.2.14)上工作。
当我直接访问 Tomcat 时(即,使用 WebSocket 进行推送),Vaadin 应用程序和推送工作正常。http://mydomain:8080/myapp
)。当我尝试使用 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
to 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 http://echo.websocket.org。我发现 501 错误是由 Atmosphere 引发的,但我不知道如何调试它。如果我删除 ws 代理(因此推送使用 HTTP 而不是 WS),我会立即收到“会话已过期”错误。
有谁知道如何正确地将推送请求从 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)