【使用心得】如何在阿里云部署Shiny App
今天我帮小伙伴在阿里云部署了下shiny app。将自己的经历记录下来,帮助到其他人。其实已经有一些博客教程,比如阿里云服务器部署Shiny App就描述的挺详细的,感兴趣的可以先看这篇。
1. 选择套餐
首先,第一步是根据自己的需求来选择云服务器的套餐,如果是小型的shinyapp,可以选择轻量服务器。我选的套餐是轻量应用服务器1核2G。
2. 在服务器端安装R语言与相关包
选完套餐后,下一步就是登录阿里云控制台进行远程登录。打开黑乎乎的command line后,接下来操作就是给Ubuntu配置环境了,你得懂一点linux命令行。
具体详细的新手教程请参考这个网站。将下面的命令一行一行复制到控制台。
# update indices
apt update -qq
# install two helper packages we need
apt install --no-install-recommends software-properties-common dirmngr
# import the signing key (by Michael Rutter) for these repo
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
# add the R 4.0 repo from CRAN -- adjust 'focal' to 'groovy' or 'bionic' as needed
add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
sudo apt-get install libcurl4-openssl-dev
3. 安装Rshiny server
配置完环境和装完R后就是从Rstudio那里安装Shiny-server
sudo su - \
"R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
-c sudo apt-get install gdebi-core
wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.16.958-amd64.deb
sudo gdebi shiny-server-1.5.16.958-amd64.deb
4. 安装Shiny App需要的包
为了让你的shiny app能够顺利运行,必须安装必要的依赖包,否则就会出现”package not installed”的情况。而缺少依赖包也确实是99%的问题核心。另一个问题是,最好用shiny用户权限来安装包而不是root权限。
默认的情况下,你登录控制台会是root权限,所以要用
su - shiny
来切换用户权限。这是因为,不同权限的用户,R包的安装路径会不一样。如果root权限下安装,则你的shiny app可能无法找到相关的依赖,也就无法运行。
下面是我要部署的shiny app要安装的依赖包。一个好习惯是,把自己需要安装的r包写在 global.R 这个R文件里。搞清楚你可能安装的R包后,运行下面的命令。将那行R包替换成你需要的,记得用单引号哦。如果你想确定哪些安装了哪些没安装,可以在控制台的R语言中(最好以shiny用户的权限)通过以下两行命令:packages <- c('shiny', 'shinyjs')
和setdiff(packages, rownames(installed.packages()))
来判断你的服务器上缺少哪些R包。
su - shiny
sudo su - \
"R -e \"install.packages( c('deltaPlotR','DT','data.table','difNLR','difR','ggdendro','ggplot2','grid','gridExtra','knitr','latticeExtra','ltm','mirt','msm','lme4','nnet','plotly','purrr','psych','psychometric','rmarkdown','shiny','shinyBS','ShinyItemAnalysis','shinyjs','stringr','tidyr','dplyr','tibble','VGAM','xtable'), repos='https://cran.rstudio.com/', INSTALL_opts = '--no-lock')\"" -c
5. 上传shiny到服务器上
接下来的一步就是将你的Shiny App包从你本地上传到云服务器上。这一步可以有好几种方式实现比如git, sftp。我使用的git进行,修改和version control比较方便。如果你想快速上传文件也可以用ftp来传输。在服务器控制台运行以下命令,将XXXX换成你的github repo。
cd /srv/shiny-server
git clone XXXX .
6. 修改shiny包的权限
最后一步当然是要在服务器端修改你Shiny App的权限,否则他人登录你的app会因为缺少root权限反复“disconnected from server”。
sudo groupadd shiny
sudo usermod -aG shiny shiny
sudo chmod -R shiny:shiny /srv/shiny-server
sudo chomod g+w /srv/shiny-server
sudo chomod g+s /srv/shiny-server
#重启服务
sudo systemctl restart shiny-server.service
7. 用公网IP查看你的app是否已经发布
Da La!到这一步基本上就大功告成了。打开你的浏览器,输入http://[公网ip]:3838/[app名字]。将[公网ip]换成你服务器的公网ip,这个可以在你的工作台->服务器信息->ip地址 处查看。将[app名字]换成你的shiny app的文件夹名.
8. 写在最后
如果你第一次部署的话,一定会遇到各种问题。一定要耐心,善用谷歌百度才搜索。以下是我的一点小心得:
如果出现不可知的问题可以通过在控制台中输入以下命令来查看。比如出现“[WARN] shiny-server - Running as root unnecessarily is a security risk! You could be running more securely as non-root.”。这很可能是权限问题,可以去试试修改以下你的Shiny app文件夹的权限。
cat /var/log/shiny-server.log
好啦,希望你能成功部署你的shiny app。国内的云服务发展很快,但是相关的易上手教程却很少,希望有越来越多的先行者将自己的经验记录下来并传播出去。如果接下来要替换域名和申请HTTPS证书,请参考这篇博客。