2016-06-09 68 views
0

我被我的Apache-config卡住了,并且非常感谢这方面的帮助。如何通过Apache代理WebSocket来播放框架

的配置是这样的:

这工作得很好,下面的Apache的配置:

<VirtualHost *:80> 
    ServerName domain.tld 
    DocumentRoot /var/www/html 
    ErrorLog ${APACHE_LOG_DIR}/error.log 
    CustomLog ${APACHE_LOG_DIR}/access.log combined 
    Redirect permanent/https://domain.tld/ 
    Redirect permanent/https://domain.tld/ 
</VirtualHost> 

<VirtualHost _default_:443> 
#ssl-config here 
<Proxy http://localhost:9000/*> 
     Order deny,allow 
     Allow from all 
</Proxy> 
ProxyPass   /app1 http://domain.tld:9000/app1 
ProxyPassReverse /app1 http://domain.tld:9000/app1 
ProxyPassReverse /app1 http://domain.tld/app1 
</VirtualHost> 

问题在于,一个游戏应用程序加入了WebSocket。这不符合上述设置。所以我读了play-pages上的东西。这导致我安装了mod_proxy_wstunnel。我还有以下行添加到配置,但与没有成功:

ProxyPass   /app1/timerWs ws://domain.tld:9000/app1/timerWs 
ProxyPassReverse /app1/timerWs ws://domain.tld:9000/app1/timerWs 

当我试图连接到https://domain.tld/rlc/timerWs我得到了一个500内部服务器错误,但目前还没有新的,更具体的错误在Apache错误日志中。

如何配置Apache以正确代理WebSocket请求到我的播放应用程序?

我的play-apps没有https适配器。所有的https都是由Apache代理完成的。

Play-apps在版本2.5上。 Apache在2.4.7上。

非常感谢您的帮助。 Tobias

回答

0

我已经解决了这个问题。窍门是,不仅在Apache上设置https,还在Plays应用服务器Jetty上设置https。要做到这一点,请参阅link。这就引出了另一个的ProxyPass地址(注意WSS而不是WS):

ProxyPass   /app1/timerWs wss://domain.tld:9000/app1/timerWs 
ProxyPassReverse /app1/timerWs wss://domain.tld:9000/app1/timerWs 

我也有我的Javascript来改变WebSocket的地址,让浏览器知道在哪里可以找到的WebSocket-后端。

$(function() { 
    var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket 
    var dateSocket = new WS("wss://domain.tld/rlc/timerWs") 
    var receiveEvent = function(event) { 
     $("#timer").html(event.data); 
    } 
    dateSocket.onmessage = receiveEvent 
}); 

在此之前,我用了一个播放路线@routes.Application.timerWs().webSocketURL(request)解决的WebSocket。