闪亮的服务器会话超时不起作用

Posted

技术标签:

【中文标题】闪亮的服务器会话超时不起作用【英文标题】:Shiny server session time out doesn't work 【发布时间】:2016-02-23 16:47:57 【问题描述】:

我在 Linux 服务器上部署了一个闪亮的应用程序。如果一分钟内没有活动,我希望应用程序超时。根据我阅读的内容,我将 app_idle_timeout 行添加到了 shiny-server.conf 文件中,但我注意到它不起作用。有人可以建议我如何确保会话在一分钟后超时?注意:我没有闪亮的服务器 PRO。

下面是我的 shiny-server.conf 的样子。

Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server 
  listen 3838;

  # Define a location at the base URL
  location / 

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;
    app_idle_timeout 60;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;

  

~                 

【问题讨论】:

【参考方案1】:

您可以在shiny 应用程序中配置您的idle 时间,就像使用一些 JS 一样,这里应用程序将在 5 秒后超时。

library(shiny)
library(leaflet)

inactivity <- "function idleTimer() 
  var t = setTimeout(logout, 5000);
  window.onmousemove = resetTimer; // catches mouse movements
  window.onmousedown = resetTimer; // catches mouse movements
  window.onclick = resetTimer;     // catches mouse clicks
  window.onscroll = resetTimer;    // catches scrolling
  window.onkeypress = resetTimer;  //catches keyboard actions

  function logout() 
    window.close();  //close the window
  

  function resetTimer() 
    clearTimeout(t);
    t = setTimeout(logout, 5000);  // time is in milliseconds (1000 is 1 second)
  

idleTimer();"


ui <- fluidPage(
  tags$script(inactivity),    
  leafletOutput("mymap")

)

server <- shinyServer(function(input,output,session)

  points <- eventReactive(input$recalc, 
    cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
  , ignoreNULL = FALSE)

  output$mymap <- renderLeaflet(
    leaflet() %>%
      addProviderTiles(providers$Stamen.TonerLite,options = providerTileOptions(noWrap = TRUE)) %>% 
      addMarkers(data = points())
  )

)
runApp(list(ui = ui, server = server))

【讨论】:

【参考方案2】:

@PorkChop,感谢您非常有用的回答!

为了完整起见,这里是@PorkChop 代码的略微修改版本,它不会关闭浏览器选项卡,而是只关闭会话并为用户留下一条消息:

library(shiny)
library(leaflet)

timeoutSeconds <- 5

inactivity <- sprintf("function idleTimer() 
var t = setTimeout(logout, %s);
window.onmousemove = resetTimer; // catches mouse movements
window.onmousedown = resetTimer; // catches mouse movements
window.onclick = resetTimer;     // catches mouse clicks
window.onscroll = resetTimer;    // catches scrolling
window.onkeypress = resetTimer;  //catches keyboard actions

function logout() 
Shiny.setInputValue('timeOut', '%ss')


function resetTimer() 
clearTimeout(t);
t = setTimeout(logout, %s);  // time is in milliseconds (1000 is 1 second)


idleTimer();", timeoutSeconds*1000, timeoutSeconds, timeoutSeconds*1000)


ui <- fluidPage(
  tags$script(inactivity),    
  leafletOutput("mymap")
)

server <- shinyServer(function(input,output,session)
  
  observeEvent(input$timeOut,  
    print(paste0("Session (", session$token, ") timed out at: ", Sys.time()))
    showModal(modalDialog(
      title = "Timeout",
      paste("Session timeout due to", input$timeOut, "inactivity -", Sys.time()),
      footer = NULL
    ))
    session$close()
  )
  
  points <- eventReactive(input$recalc, 
    cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
  , ignoreNULL = FALSE)
  
  output$mymap <- renderLeaflet(
    leaflet() %>%
      addProviderTiles(providers$Stamen.TonerLite, options = providerTileOptions(noWrap = TRUE)) %>% 
      addMarkers(data = points())
  )
  
)

runApp(list(ui = ui, server = server))

This 非常有帮助。

【讨论】:

如果应用拆分成ui.R和server.R文件,这段代码可以放到server.R文件中吗? 如果您想 1:1 复制它,您可以将变量timeoutSecondsinactivity 放在一个名为 global.R 的文件中,该文件与 ui.R 和 server.R 位于同一文件夹中。 @ismirsehregal 这是一个很好的答案,对我有用。我能够用这个结束开源服务器上的会话。 rookieJoe 我会考虑将此标记为您接受的答案。 这太棒了!它会关闭单个会话,但让应用程序继续运行。当最后一个会话关闭时,您将如何关闭应用程序? Here 您可以找到有关如何计算活动会话数的示例。在 onSessionEnded 回调中,您可以检查会话数是否 = 0 并运行 stopApp()【参考方案3】:

会话超时功能在开源闪亮服务器上不可用。它仅作为专业版的一部分提供。

【讨论】:

我已经添加了示例来绕过它

以上是关于闪亮的服务器会话超时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ggplot 和dashboardPage 的闪亮不起作用

闪亮的 DownloadHandler 在服务器上不起作用

观察事件中的R闪亮updateSelectInput不起作用

在闪亮的仪表板中使用 Ggplot 选择输入不起作用

闪亮/ rscript - 使用checkboxGroupInput整数列表的反应图不起作用

在容器外加载数据时,dockerized 闪亮的应用程序不起作用