适用于Rstudio的Apache代理Websocket可以闪亮吗?

时间:2015-04-05 05:38:42

标签: r apache proxy websocket shiny

Websockets可以比普通的HTTP(s)请求更快,浏览器通常可以打开更多的websocket连接。

我的浏览器通过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/

我的问题是,这些中的任何一种都可以适用于光泽吗?

1 个答案:

答案 0 :(得分:1)

很可能你的R档文件很糟糕。

在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://127.0.0.1:3838 /是主机的地址和端口。

确保您没有遗漏任何这些关键部分。希望它有所帮助。