Apache2 如何通过ApacheHTTP服务器获得Vaadin推送工作?

Apache2 如何通过ApacheHTTP服务器获得Vaadin推送工作?,apache2,tomcat7,push,vaadin,atmosphere,Apache2,Tomcat7,Push,Vaadin,Atmosphere,我试图让Vaadin 7.1.5推送在ApacheTomcat7.0.42+ApacheHTTP服务器(2.2.14带有mod_proxy_wstunel)上运行 当我直接访问Tomcat(即http://mydomain:8080/myapp)。当我尝试使用apachemodules mod_proxy&mod_proxy_wstunel访问它时,问题就出现了。发生的情况是,应用程序挂起,加载指示器变为红色,并且我在浏览器控制台的推送请求中出现以下错误: HTTP Status 501 - W

我试图让Vaadin 7.1.5推送在ApacheTomcat7.0.42+ApacheHTTP服务器(2.2.14带有mod_proxy_wstunel)上运行

当我直接访问Tomcat(即
http://mydomain:8080/myapp
)。当我尝试使用apachemodules mod_proxy&mod_proxy_wstunel访问它时,问题就出现了。发生的情况是,应用程序挂起,加载指示器变为红色,并且我在浏览器控制台的推送请求中出现以下错误:

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
在需要推送之前,我使用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_wstunel是罪魁祸首,但显然,当我代理时,它工作得很好。我发现501错误是由大气抛出的,但我不知道如何调试它。如果删除ws-proxy(因此推送使用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),以下是使用两个连接器的方法:nio和ajp

Tomcat配置:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    connectionTimeout="20000" />

<Connector port="8009" protocol="AJP/1.3" />
  • 首先,每个没有X-Atmosphere-Transport=websocket参数的推送请求都会通过http协议发送到nio连接器(因此可能会发生流式回退)
  • 然后,其他推送请求(WebSocket)通过mod_proxy_wstunnel发送到nio连接器
  • 其他请求(非推送)发送至ajp接头

我也遇到了这个问题。下面的代码片段帮了我的忙:

<Location /vaadinServlet/PUSH>
   Require all granted
   RewriteEngine on
   RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
   RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
   RewriteRule .* ws://localhost:8080%{REQUEST_URI} [P]
</Location>

要求所有授权
重新启动发动机
RewriteCond%{HTTP:UPGRADE}^websocket$[NC]
RewriteCond%{HTTP:CONNECTION}升级$[NC]
重写规则。*ws://localhost:8080%{REQUEST_URI}[P]
而你需要


我在Spring Boot 1.4.2和Tomcat 8.5.6中使用Apache 2.4.10和Vaadin 7.7.3。

此解决方案适用于WebSocket和长轮询(以及可能的流式)传输。使用单个HTTP[S]可以很好地工作Tomcat连接器适用于所有设备-即,最后一行可以是
ProxyPass/http://app.domain.com:8080/
。我确实需要在按下
按钮后删除尾随的
/
s。
<Location /vaadinServlet/PUSH>
   Require all granted
   RewriteEngine on
   RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
   RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
   RewriteRule .* ws://localhost:8080%{REQUEST_URI} [P]
</Location>