Heroku上Shiny应用闲置1分钟触发H15超时,如何延长至30分钟?
Heroku部署Shiny应用H15超时问题解决办法
问题描述
通过Docker镜像在Heroku成功部署Shiny应用,运行顺畅,但仅滚动页面(无点击、悬停图表等交互操作)时,闲置1分钟后页面变灰,日志显示“H15 timeout”错误,希望将Web服务器超时延长至至少30分钟。
解决方案
Heroku的WebSocket连接默认闲置超时为55秒,这是触发H15错误的核心原因。要解决这个问题,需要让Shiny应用定期发送心跳请求,维持连接活跃状态,避免被Heroku路由器判定为闲置。
方法1:添加前端心跳脚本
在Shiny应用的UI代码中插入以下JavaScript脚本,每隔45秒发送一次心跳请求:
ui <- shinydashboard::dashboardPage( # 你的原有UI内容 shiny::tags$script(HTML(" setInterval(function() { // 发送空POST请求保持连接 fetch(window.location.href, {method: 'POST', body: ''}) .catch(err => console.log('心跳请求失败:', err)); }, 45000); // 45秒触发一次 ")) )
方法2:使用shinyjs实现心跳
如果你已引入shinyjs包,可通过以下方式实现心跳:
library(shinyjs) ui <- shinydashboard::dashboardPage( useShinyjs(), # 你的原有UI内容 ) server <- function(input, output, session) { # 每隔45秒触发一次心跳 observe({ invalidateLater(45000, session) session$sendCustomMessage("heartbeat", list()) }) }
验证效果
修改代码后重新部署应用,闲置超过1分钟后页面不会再变灰,日志中也不会出现H15超时错误。
附:你的Dockerfile内容
FROM ubuntu:18.04 FROM rocker/r-ubuntu:18.04 RUN export DEBIAN_FRONTEND=noninteractive RUN apt-get update -y && apt-get install -y tzdata RUN ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime RUN dpkg-reconfigure --frontend noninteractive tzdata RUN apt-get update -y && apt-get install -y build-essential curl libssl1.0.0 libssl-dev gnupg2 software-properties-common dirmngr apt-transport-https apt-utils lsb-release ca-certificates RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 RUN add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran40/' RUN apt-get update -y && apt-get install -y r-base RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list RUN apt-get update -y RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev mssql-tools RUN apt-get update && apt-get install -y --no-install-recommends \ sudo \ libcurl4-gnutls-dev \ libcairo2-dev \ libxt-dev \ libssl-dev \ libssh2-1-dev \ libgdal-dev\ unixodbc\ unixodbc-dev\ && rm -rf /var/lib/apt/lists/* RUN R -e 'install.packages(c(\ "shinydashboard", \ "shinyjs", \ "dplyr", \ "stringr", \ "sqldf", \ "scales", \ "DT", \ "plyr", \ "odbc", \ "pool", \ "shinydashboardPlus", \ "waiter", \ "feather" \ ), \ repos="https://packagemanager.rstudio.com/cran/__linux__/focal/2021-04-23"\ )' RUN Rscript -e "install.packages('echarts4r')" RUN Rscript -e "install.packages('highcharter')" RUN Rscript -e "install.packages('formattable')" RUN Rscript -e "install.packages('shiny')" RUN apt-get update && apt-get install -y --no-install-recommends \ sudo \ libudunits2-dev \ libgeos-dev \ libproj-dev RUN Rscript -e "install.packages('shinyWidgets')" RUN Rscript -e "install.packages('waiter')" RUN echo "local(options(shiny.port = as.numeric(Sys.getenv('PORT')), shiny.host = '0.0.0.0'))" > /usr/lib/R/etc/Rprofile.site RUN addgroup --system app \ && adduser --system --ingroup app app WORKDIR /home/app COPY app . RUN chown app:app -R /home/app USER app EXPOSE 3838 CMD ["R", "-e", "shiny::runApp('/home/app')"]
内容的提问来源于stack exchange,提问作者akshay bholee
相关产品推荐
相关产品推荐

