【问题标题】:Can Apache Proxy Websockets for Rstudio's Shiny?可以为 Rstudio 的 Shiny 代理 Websockets 吗?
【发布时间】:2015-06-09 20:36:40
【问题描述】:

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 配置为代理 websocket 的不同方式。如:

    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/

我的问题是,这些中的任何一个都可以与闪亮一起使用吗?

【问题讨论】:

  • 我有一个相关的问题。使用 apache 代理,我闪亮的应用程序被准系统断开,并且我在闪亮的服务器日志中看到“RobustSockJS 冲突”消息。为 ws: 添加 websocket proxypass 或/和 proxypassreverse 确实有所改善。

标签: r apache proxy websocket shiny


【解决方案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是origin的端口号,ws://127.0.0.1:3838/是主机的地址和端口。

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

【讨论】:

  • 感谢您的回答,但是当直接连接到 Shiny-server 时,Websockets 功能齐全。当 Shiny-server 使用 Apache 代理时,Websockets 代理不正确。
  • 尝试 ProxyPass,但还要添加一个 ProxyPassReverse /shiny/ ws://127.0.0.1:3838/ 我认为这可能是问题所在。
  • 我添加了代理转发部分。希望它能解决您的问题。
  • 感谢您的尝试,但是按照建议添加 ProxyPass 和 ProxyPassReverse 并不能正确代理 websocket。我认为最好是可以访问shiny-server 的人在发布答案之前先在本地确认它是否有效。
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多