CentOS下RStudio Server运行Shiny App报Connection Refused错误
CentOS服务器部署的RStudio Server中运行Shiny应用故障:RStudio Server IDE内启动Shiny App后,会正常弹出新浏览器窗口,但页面提示Connection Refused(连接被拒绝)错误。
测试所用应用为存放于用户家目录下的官方hello world示例Shiny应用。同一台CentOS服务器上同时部署了用于运行已发布应用的Shiny Server,该服务运行状态完全正常。
环境版本
- CentOS Stream release 8
- R version 4.1.3 (2022-03-10) -- "One Push-Up"
- RStudio Server 2021.09.1 Build 372 2009-2021 RStudio, PBC "Ghost Orchid" Release (8b9ced18, 2021-11-08) for CentOS 8
- Shiny Server v1.5.18.987 (Node.js v16.14.0)
故障表现
启动应用时RStudio IDE内无错误提示,控制台显示应用处于运行状态,输出内容如下:
> runApp('test') Listening on http://127.0.0.1:7880
仅浏览器端返回连接拒绝错误。
Shiny应用默认绑定127.0.0.1环回地址,该地址仅支持服务器本地访问。本地浏览器弹出访问时,实际请求的是你当前操作的个人电脑的7880端口,而非远程CentOS服务器的对应端口,因此触发连接拒绝。
同机部署的Shiny Server默认绑定0.0.0.0对外暴露端口,本身就是面向公网访问设计的服务组件,因此运行不受影响。
方法1:开启RStudio Server端口代理(推荐,不改变原有使用习惯)
- 编辑RStudio Server主配置文件:
sudo vim /etc/rstudio/rserver.conf
- 在配置文件中加入以下内容,关闭应用访问限制、开启端口转发:
server-app-armor-enabled=0 www-frame-origin=same
如果配置文件中已经自定义过www-port、rsession-which-r参数,保留原有配置即可,不需要重复添加。
3. 执行命令重启RStudio Server服务让配置生效:
sudo systemctl restart rstudio-server
重启完成后重新在IDE中启动Shiny应用,RStudio Server会自动将Shiny监听的本地环回端口代理到自身服务路径下,弹出的浏览器页面可正常加载应用。
方法2:临时指定Shiny监听地址(仅适合短期调试)
启动Shiny应用时手动指定host参数为0.0.0.0,让应用监听所有网卡的请求:
runApp('test', host = '0.0.0.0', port = 7880)
使用该方法需要提前在服务器防火墙、云安全组中放开对应端口(本例为7880),访问时直接走http://<服务器IP>:7880路径,不经过RStudio Server的身份校验,不建议长期使用。
校验结果
配置生效后,启动Shiny应用时控制台依旧会显示监听127.0.0.1的对应端口,但RStudio会自动生成带/p/端口号/后缀的代理访问地址,弹出的页面不会再出现连接拒绝错误。
内容的提问来源于stack exchange,提问作者QuentinB

