我正在尝试让 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
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时它工作正常。我发现 501 错误是由 Atmosphere 引发的,但我不知道如何调试它。如果我删除 ws 代理(因此推送使用 HTTP 而不是 WS),我会立即收到“会话已过期”错误。
有谁知道如何正确地将来自 Apache HTTP 服务器的推送请求代理到 Apache Tomcat?