miq*_*miq 7 push apache2 vaadin atmosphere tomcat7
我正在尝试将Vaadin 7.1.5推送到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
Run Code Online (Sandbox Code Playgroud)
需要推之前,我使用的mod_jk从请求转发http://mydomain/myapp到http://mydomain:8080/myapp.Apparenly 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
Run Code Online (Sandbox Code Playgroud)
我怀疑mod_proxy_wstunnel应该受到责备,但显然当我代理http://echo.websocket.org时,它工作正常.我发现Atmosphere抛出了501错误,但我不知道如何调试它.如果我删除了ws代理(因此push使用HTTP而不是WS),我会立即得到"Session expired"错误.
有谁知道如何正确地代理从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" />
Run Code Online (Sandbox Code Playgroud)
我很确定有一种方法可以使用与应用程序上下文不同的路径,但这对我有用。
更新:请注意,此解决方案不适用于不支持 websocket 的浏览器(例如 IE <= 9)。我怀疑这与 HTTP 流作为后备方法有关。