Shiny应用部署至shinyapps.io出现服务器断开错误,疑似字体问题求助
问题原因排查与解决步骤
先澄清两个现象的真实关联
首先要明确:你在浏览器控制台看到的Source Sans Pro字体404加载失败,和应用提示"与服务器断开连接"没有直接因果关系。静态字体文件缺失只会导致页面字体回退、样式走样,不会直接触发Shiny的WebSocket连接中断。你之前的猜测只对了一半:本地Windows因为系统自带同款字体,就算应用自带的字体资源加载失败,浏览器也会自动调用系统字体渲染,完全感知不到404;而shinyapps.io的Linux运行环境没预装这个字体,才会把404信息打在控制台里,看起来和断连是同时触发的,本质是两个独立问题。
从你提供的服务器日志来看,断连的核心线索藏在容易被忽略的老版本依赖信息里,按下面的步骤一步步处理就行:
第一步:修复版本不兼容导致的WebSocket断连
你的日志里显示当前服务器跑的是2021年的老版本组合:R 4.0.2、shiny 1.6.0、httpuv 1.5.4。这个版本组合在Linux环境下存在已知的WebSocket心跳超时bug——本地Windows环境因为网络延迟低、链路短,触发不了这个bug;到了云端跨网络传输时,httpuv的心跳检测逻辑会因为超时自动断开连接,前端就会弹出"与服务器断开连接"的提示。
具体操作:
- 部署前用
renv做依赖版本锁定,不要让shinyapps.io自动拉取最新版的依赖包,强制让服务器安装和你本地开发完全一致的包版本。 - 至少要核对
shiny、shinydashboard、httpuv、htmltools四个核心包的版本和本地环境完全匹配,避免版本错位。
第二步:解决AdminLTE字体404的问题
这个问题是因为shinydashboard在打包部署时,经常漏带自带的静态字体文件,不用自己手动找字体资源补:
- 在
dashboardBody的最开头加一行资源挂载代码,强制加载shinydashboard自带的全部静态文件:dashboardBody( shinydashboard::useShinydashboard(), # 加在最开头 tabItems( # 你原来的页面逻辑 ) ) - 如果加完还是报字体404,就把本地R库路径下
shinydashboard包目录里的www文件夹,整个复制到你应用项目的根目录(和app.R平级),部署时会自动把这些静态文件上传到服务器,覆盖原来漏传的路径。
第三步:排查未被日志捕获的运行时崩溃
你现在拿到的服务器日志只到包加载完成、启动端口监听的位置,后面的错误没有打出来,大概率是应用运行时触发了未捕获的R异常,直接把R进程搞崩了,前端才会弹断连提示。常见的触发场景:
- 你代码里的
sidebarMenuOutput("menu")对应的服务端输出逻辑,是不是用了Windows本地的绝对路径(比如C:/Users/xxx/xxx)去读数据、读图片?这类路径在Linux服务器上完全读不到,会直接抛异常让进程崩溃。 - 部署前在
app.R的最开头加一行配置,关掉Shiny的错误静默拦截:
配置完成后如果有运行时错误,页面会直接显示具体的报错位置和错误信息,不会再只弹模糊的"与服务器断开连接"提示。options(shiny.sanitize.errors = FALSE)
最后补充:图标加载异常和字体问题同源,用上面的
useShinydashboard()挂载资源后,Font Awesome的图标路径也会同步修正,不会再出现图标变方块的问题。
内容的提问来源于stack exchange,提问作者mee1988
相关产品推荐
相关产品推荐

