2016-06-09 12 views
0

Ich bin mit meiner Apache-Konfiguration stecken und freue mich über jede Hilfe zu diesem Thema.Wie Proxy WebSocket über Apache zu Play-Framework

Die Config ist wie folgt:

Diese sehr gut mit dem folgenden Apache-config funktioniert:

<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> 

Das Problem ist, dass eine Spielanwendung einen WebSocket hinzugefügt hat. Was mit dem obigen Setup nicht funktioniert. Also habe ich die Sachen auf der play-pages gelesen. Was mich dazu brachte, mod_proxy_wstunnel zu installieren. Ich füge auch die folgenden Zeilen in die Config, hatte aber keinen Erfolg damit:

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

Wenn ich versuche zu https://domain.tld/rlc/timerWs ich einen 500 Internal Server Error bekam zu verbinden, aber es gibt keinen neuen, spezifischen Fehler im apache Fehlerprotokoll.

Wie kann ich Apache so konfigurieren, dass WebSocket-Anfragen an meine Spielanwendungen ordnungsgemäß weitergeleitet werden?

Meine Spiele-Apps haben keine https-Adapter. Alle https-Sachen werden vom Apache-Proxy erledigt.

Play-Apps sind auf Version 2.5. Apache ist am 2.4.7.

Vielen Dank für Ihre Hilfe. Tobias

Antwort

0

Ich habe das Problem jetzt gelöst. Was war der Trick, https nicht nur auf dem Apache einzurichten, sondern auch auf Plays Application Server Jetty. Sehen Sie hierzu link. Dies führt zu einer anderen Adresse Proxypass (das WSS bemerkt statt ws):

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

musste ich auch in meinem Javascript die WebSocket-Adresse ändern, der Browser wissen zu lassen, wo den WebSocket-Backend zu finden.

$(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 
}); 

Davor habe ich eine Play-Route @routes.Application.timerWs().webSocketURL(request) die WebSocket zu adressieren.