2015-04-05 165 views
20

Websockets比普通的HTTP请求更快,浏览器通常可以打开更多的WebSocket连接。Rstudio的闪亮Apache代理Websockets?

我的浏览器是通过JavaScript控制台,虽然我的闪亮应用的工作原理和Apache的ProxyPass正确进行代理,WebSockets的工作不告诉我:

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

我见过的Apache可以配置不同的方式代理websockets。如:

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

和:

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/ 

我的问题是,可以在任何的这些适合与有光泽的使用?

+0

我有一个相关的问题。使用apache代理,我的闪亮应用准系统性断开,我在闪亮的服务器日志中看到“RobustSockJS碰撞”消息。为ws:添加websocket proxypass或/和proxypassreverse会得到改善。 – 2016-06-01 08:12:38

回答

1

很可能您的R文件严重地处理Websockets。

在你的Java脚本的HTML文件,你有这样的:

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

然后你定义为需要具备以下功能:

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

而在你的R代码里面你有一些类似:

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) 

哪里htmldata是HTML文件。

然后修改httpd.conf具有:

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

其中origin_port是原点和WS的端口号:主机的3838 /是地址和端口://127.0.0.1。

确保您没有遗漏任何这些关键部件。希望能帮助到你。

+0

感谢您的回答,但是直接连接到Shiny服务器时,Websockets功能齐全。当使用Apache代理Shiny-server时,Websockets的代理不正确。 – variable 2015-04-19 16:48:12

+0

哦!好。对于那个很抱歉。我没有清楚地理解这一点。 – 2015-04-20 07:53:48

+0

尝试ProxyPass,但也添加 ProxyPassReverse/shiny/ws://127.0.0.1:3838/ 我认为这可能是问题所在。 – 2015-04-20 08:01:25