闪亮的服务器:套接字挂断
Posted
技术标签:
【中文标题】闪亮的服务器:套接字挂断【英文标题】:Shiny server: socket hang up 【发布时间】:2016-06-05 20:16:32 【问题描述】:更新:我在下面添加了解决方案
问题
一点背景知识:我在 Ubuntu 精确服务器上运行 Shiny server v1.5。基本上我有一个 rmarkdown 页面,它允许用户使用一些参数,然后有一个下载按钮,它使用闪亮的生成文档,如下所示:
```r,echo=FALSE
downloadHandler(
filename = "report.pdf",
content = function(file)
knitr::knit2pdf("report.Rnw",envir=environment())
file.rename(normalizePath('report.pdf'), file)
)
```
Shiny 应用程序在我的本地计算机上运行良好,但在服务器上崩溃。更具体地说,r 降价网页工作正常,但一旦我点击下载按钮,应用程序在大约 30 秒后崩溃。服务器日志显示套接字超时错误:
[2016-02-24 03:38:52.240] [INFO] shiny-server - Starting listener on 0.0.0.0:3838
[2016-02-24 03:49:30.183] [ERROR] shiny-server - Uncaught exception: Error: socket hang up
[2016-02-24 03:49:30.184] [ERROR] shiny-server - Error: socket hang up
at createHangUpError (_http_client.js:215:15)
at Socket.socketCloseListener (_http_client.js:247:23)
at Socket.emit (events.js:129:20)
at TCP.close (net.js:485:12)
[2016-02-24 03:49:30.184] [INFO] shiny-server - Stopping listener on 0.0.0.0:3838
[2016-02-24 03:49:30.185] [INFO] shiny-server - Shutting down worker processes (with notification)
/opt/shiny-server/lib/main.js:364
throw err;
^
Error: socket hang up
at createHangUpError (_http_client.js:215:15)
at Socket.socketCloseListener (_http_client.js:247:23)
at Socket.emit (events.js:129:20)
at TCP.close (net.js:485:12)
生成此 pdf 文件需要很长时间(大约五分钟),所以我怀疑我在某处遗漏了一些超时参数。这就是我在闪亮配置中所做的:
run_as shiny;
app_init_timeout 999999;
app_idle_timeout 999999;
# Define a server that listens on port 3838
server
listen 3838;
....
...但无济于事,因为我仍然收到错误消息。任何建议将不胜感激!
解决办法
正如@daattali 所提到的,您不能在downloadButton 中花费那么长时间,更改服务器设置不会改变任何内容。所以我最终将生成和下载功能分为两部分,如下所示:
```r, echo=FALSE
shinyApp(
ui = fluidPage(
fluidRow(
column(2,
conditionalPanel(
condition = "!$('makeReport').hasClass('shiny-busy')",
actionButton("makeReport","Generate Report",icon=icon("file"))
)
),
column(4,
conditionalPanel(
condition = "!$('makeReport').hasClass('shiny-busy')",
uiOutput("downloadButton")
#downloadButton("downloadReport", "Download Report")
)
)
)
),
server = function(input, output)
output$download_button <- renderUI(
downloadButton("downloadReport", "Download Results")
)
makeReportAction <- eventReactive(input$makeReport,
...
knitr::knit2pdf("report.Rnw",envir=globalenv())
)
output$downloadButton <- renderUI(
makeReportAction() #only appear after first click on generate
downloadButton("downloadReport", "Download Report")
)
output$downloadReport <- downloadHandler(
filename = "report.pdf",
content = function(file)
cat(paste("Does the pdf exist?",file.exists("report.pdf")))
file.rename(normalizePath('report.pdf'), file)
)
)
```
【问题讨论】:
【参考方案1】:这可能是上周在 Google 董事会上有人问 Joe Cheng 的同一个问题
https://groups.google.com/forum/#!topic/shiny-discuss/4bL9jFaYly0
下载处理程序似乎有时间限制,所以不妨试试看是否可以预先生成文件,并仅在单击按钮时提供文件
【讨论】:
以上是关于闪亮的服务器:套接字挂断的主要内容,如果未能解决你的问题,请参考以下文章
带有 Gunicorn 的 Flask App 在生产中给出错误:套接字挂断