2015-04-05 13 views
20

Le web socket possono essere più veloci delle semplici richieste HTTP e i browser in genere possono aprire più connessioni websocket.Can Websocket Apache Proxy per Rstudio Shiny?

Il mio browser è dirmi tramite la console javascript che mentre i miei lucidi opere app e Apache ProxyPass è proxy correttamente, WebSockets non funzionano:

WebSocket connection to 'wss://www.example.com/shiny/01_hello/__sockjs__/058/v193lng7/websocket' failed: WebSocket is closed before the connection is established. 

Ho visto diversi modi in cui Apache può essere configurato per proxy websockets. Come ad esempio:

ProxyPass /shiny/ ws://127.0.0.1:3838/ 
    ProxyPass /shiny/ wss://127.0.0.1:3838/ 
    RedirectMatch ^/shiny$ /shiny/ 

e:

RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^/socket.io   [NC] 
    RewriteCond %{QUERY_STRING} transport=websocket [NC] 
    RewriteRule /(.*)   ws://localhost:3001/$1 [P,L] 

    ProxyPass/http://localhost:3001/ 
    ProxyPassReverse/http://localhost:3001/ 

La mia domanda è, può uno di questi essere adattati per l'uso con lucido?

+0

Ho un problema correlato. Usando il proxy di apache le mie app lucide sono quasi sistematicamente disconnesse e vedo i messaggi di "collisione RobustSockJS" nel registro del server lucido. Aggiungere websocket proxypass o/e proxypassreverse per ws: migliora. –

risposta

1

Molto probabilmente il tuo file R gestisce male i Websockets.

Nel file HTML nello script Java, avete qualcosa di simile:

var socket = new WebSocket("wss://"+hostlocation, "HelloR") 

E poi le seguenti funzioni che si definiscono come avete bisogno:

socket.onopen = function() {} 
socket.onmessage = function got_packet(msg) {} 
socket.onclose = function(){} 

E nel codice R si avere qualcosa di simile:

w = create_server(webpage=static_text_service(htmldata)) 
f = function(DATA,WS,...) 
{ 
list(msg,p)= process(data) 
websocket_broadcast(toJSON(list(msg=msg, fig=p)),WS$server) 
} 
set_callback("receive",f,w) 
ctmp = tempfile() 
itmp = tempfile() 
daemonize(w) 

Dove htmldata è il file html.

Quindi modificare la httpd.conf avere:

<VirtualHost *:origin_port> 
    ProxyPass /shiny/ ws://127.0.0.1:3838/ 
    ProxyPassReverse /shiny/ ws://127.0.0.1:3838/ 
</VirtualHost> 

dove origin_port è il numero della porta di origine e WS: //127.0.0.1: 3838/è l'indirizzo e porta dell'host.

Assicurati di non mancare nessuna di queste parti critiche. Spero che sia d'aiuto.

+0

Grazie per la risposta, tuttavia Websockets sono pienamente funzionanti quando si collega direttamente a Shiny-server. Quando Shiny-server viene utilizzato come proxy con Apache, i Websocket non vengono inviati correttamente. – variable

+0

Oh! Ok. Mi dispiace per quello Non l'avevo capito chiaramente. –

+0

Provate ProxyPass, ma aggiungete anche ProxyPassReverse/shiny/ws: //127.0.0.1: 3838/ Penso che questo potrebbe essere il problema. –

Problemi correlati