智能文献分析app在腾讯云服务器部署过程

问题缘起

带研究生用 Shiny 开发的智能文献分析app准备在腾讯云服务器上部署,遇到了不少问题,现将问题解决过程记录如下,以作备忘。

解决过程

将app 目录下的所有文件上传到服务器 srv/shiny-server/lsa 目录下,打开页面出现如下报错信息:

An error has occurred
The application failed to start.

The application exited during initialization.

Error in load(name, envir = .GlobalEnv) : 
  bad restore file magic number (file may be corrupted) -- no data loaded
Calls: sys.load.image -> load
In addition: Warning message:
file ‘.RData’ has magic number 'RDX3'
  Use of save versions prior to 2 is deprecated 
Execution halted

根据报错信息,在 [stackoverflow]() 网站上查到一条一模一样的求助提问,遗憾的是没有人回复。然后去 rstudio 的官网查找 shiny-server 部署指南。根据 Why does my app work locally, but not on my Shiny Server? 一文的介绍,分析出错原因可能有三方面:一是 云服务器上 Rstudio server 安装的R包与本地电脑运行环境不同(少安装或版本号不同);二是开发的app中文件地址使用的是绝对地址而非相对地址,会造成文件加载错误;三是文件的读写出现了问题。

先从第一种可能入手,检查app代码,是否要加载的R包在 Rstudio server 上都有安装。发现有一些R包没有安装,在逐一安装过程中,haven 包始终安装不上,报错信息如下:

Error: package or namespace load failed for ‘haven’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/home/R/R/x86_64-redhat-linux-gnu-library/3.4/haven/libs/haven.so':
/home/R/R/x86_64-redhat-linux-gnu-library/3.4/haven/libs/haven.so:undefined symbol: libiconv
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/R/R/x86_64-redhat-linux-gnu-library/3.4/haven’
Warning in install.packages :
installation of package ‘haven’ had non-zero exit status

在网上查找了一番,都没有找到正确的解决办法,去 havenCRAN 上发布的网址搜索话题,发现:https://github.com/tidyverse/haven/issues/363 给出了最佳解决办法,在 Rstudio server 的控制台,输入以下代码:

withr::with_makevars(c(PKG_LIBS = "-liconv"), install.packages("haven"), assignment = "+=")

这样 haven 包就安装好了,之后再安装 rio 包也告成功。

类似的,在 Rstudio server 上升级 readxl 包也有同样的报错,相应的解决方法类似,输入以下代码:

withr::with_makevars(c(PKG_LIBS = "-liconv"), install.packages("readxl"), assignment = "+=")

readxl 包的升级安装也告成功。

进一步对照开发的 shiny app 源代码加载的R包,逐一检查是否有遗漏未安装的情况。突然发现,app 最需要的 bibliometrix 包没有安装。在腾讯云服务器的 rstudio server 中发现该包有一个依赖 cowplot 必须运行在 R3.5 版本上。由于腾讯云服务器上的 rstudio server 在2017年4月安装,版本是3.4.3,必须要对服务器上的 R升级才能安装 cowplot 包和 bibliometrix 包。这样一来,问题转变为怎样升级云服务器上的R基本程序及用户定义的包。

经在网上搜索,发现:Ubuntu 更新R版本 一文最具启发性和适用性,参考此文建议,在腾讯云服务器上升级R基本程序及用户定义包的步骤如下:

步骤1:修改 sources.list 文件

首先,修改 /etc/apt/sources.list 文件,使得R基本程序的下载顺利。腾讯云服务器上安装的操作系统是 UBUNTU 16.04LTS,对应的UBUNTU系统代号是 Xenial 在该文件最后一行增加以下代码:

# Edit /etc/apt/sources.list and add the line appropriate to your distribution of Ubuntu.
# 如果是 UBUNTU 18.04LTS 则加上下一行
deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/
# 如果是 UBUNTU 16.04LTS 则加上下一行
deb https://cloud.r-project.org/bin/linux/ubuntu xenial-cran35/
# 如果是 UBUNTU 14.04LTS 则加上下一行
deb https://cloud.r-project.org/bin/linux/ubuntu trusty-cran35/

在修改完 sources.list 文件后,记得保存。

步骤2:删除已安装的 r-base r-base-core r-base-dev 文件

如果之前有安装 R 基本程序,需要删除后再安装,输入以下代码:

sudo apt-get --purge remove r-base
sudo apt-get --purge remove r-base-core
sudo apt-get --purge remove r-base-dev

上面代码中,注意不要使用 autoremove 命令来删除原有程序,因为 purge remove autoremove 三个命令使用的情境有区别。

步骤3:安装新的 r-base r-base-core r-base-dev 文件

在控制台输入以下指令

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
sudo apt-get update
sudo apt-get install r-base  r-base-core r-base-dev

输入以上指令后,如有提问,全部都是 Y 回车,很快,最新的R3.6.1(2019-7-29)版装好了。

在控制台输入 R 就可以进入 R 的编程环境并看到 R 的版本号。

步骤4:升级用户定义 R 包

如果之前在服务器上已安装了很多用户定义 R 包,现在要在新版本上安装会有些麻烦: 原因有二,一是新旧版本的用户定义R包安装目录不一样;二是有一部分新旧版本R包不兼容,如果不升级旧版本R包,就无法用在新版本的R中。

经搜索,有两种方法可应对:一是更改腾讯云服务器上 Rstudio-server 的默认库路径,见:关于在Rstudio-server中直接在公用库中安装和使用R包 一文。这种方式下的代码如下:


# 设置R默认的库路径方式如下
#.libPaths(c("/cluster/apps/R/3.5.1/lib64/R/library", .libPaths())) 
# R包会默认安装到第一个路径下
# .libPaths()
# [1] "/cluster/apps/R/3.5.1/lib64/R/library" 
# "/cluster/home/jlu/R/x86_64-unknown-linux-gnu-library/3.5.1" 
# [3] "/usr/local/lib64/R/library"

# 直接替换库的路径方式如下
# .libPaths("/cluster/apps/R/3.5.1/lib64/R/library") 
# .libPaths()
# [1] "/cluster/apps/R/3.5.1/lib64/R/library"  #只保留公共库

不过,这种方法有风险,万一更改库路径后还是不正常运行,浪费时间与精力;二是编写代码在服务器上批量自动安装R包,可以借鉴:服务器上批量安装本地R包一个从CRAN上批量下载R包的函数 ,参考代码如下

# packages=c("tidyverse","data.table","devtools","shiny","shinydashboard")
# ipak <- function(pkg){
#  new.pkg <- pkg[!(pkg %in% installed.packages()[, "Package"])]
#  if (length(new.pkg)) 
#    install.packages(new.pkg, dependencies = TRUE)
#  sapply(pkg, require, character.only = TRUE)
# }
# ipak(packages)

rstudio server 上安装R包时还遇到以下问题,在UBUNTU 16.04LTS 中,R包 magick 的安装代码如下:

sudo add-apt-repository -y ppa:cran/imagemagick
sudo apt-get update
sudo apt-get install -y libmagick++-dev

注意:这不是在 rstudio server 控制台输入,而是在 UBUNTU 控制台输入。

整个安装完成后,重启服务器,打开 https://ip:3838/lsa 即可看到成功运行的 shiny app 了。

补充一些资料作为以后备查:

Avatar
Wu, Jun
Associate professor
Next
Previous