You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:40:57