在服务器上部署shiny-server
怎么在我的小破服务器上部署shiny—server
1. 方法
- 在腾讯云域名里,添加一个泛解析,就是主机记录写成“*”,记录值填你的服务器ip。在阿里云服务器管理平台中,开启3838端口。
- 在服务器安装最新的R,默认情况下debian10只能安装3.6的R,根据官方文档安装成4.2的R。
- 安装shiny server,按照官方文档就可以了。
- 由于我的小破服务器内存只有2G,在安装一些R包(就是你,rcppeigen)时会因为内存不足报错。解决方法是在服务器设置一个交换空间,我设置了一个4G的,目前用着是感觉够用了。毕竟这云服务总共也就60G空间。另外,这个交换空间最好一直启用,否则后续可能打开一个shiny应用,服务器就崩了。
cd /
sudo dd if=/dev/zero of=swapfile bs=4M count=1024
sudo chmod 600 swapfile
sudo mkswap swapfile
sudo swapon swapfile
sudo vim /etc/fstab
# 最后一行添加 "/swapfile none swap sw 0 0",这样就算服务器重启也不用重新设置了
# 另外一些相关命令
sudo swapoff -a # 关闭所有交换空间
sudo swapon -a # 挂载 /etc/fstab 文件中列出的所有交换空间
sudo swapon -s # 检查所有的交换空间
- 用root账户在linux里启动R环境,安装shiny中需要的R包。这个时候就可以通过(ip+端口+项目文件夹名称,比如http://47.101.222.2:3838/01_hello)使用shiny-server了。
- 配置nginx反向代理,具体来说就是在/etc/nginx/sites-available/defaulthttp里添加下面这段,之后用软链接,链接到/etc/nginx/sites-enabled里。配置好后就可以通过shiny.caigui.site/01_hello使用了。
server {
listen 443 ssl;
server_name shiny.caigui.site www.shiny.caigui.site;
location / {
proxy_pass http://127.0.0.1:3838;
}
}
-
但想上面这样配置好还有一个问题,通过类似shiny.caigui.site/01_hello的链接打开的shiny页面,其中的动态元素呈现灰色,不能正常使用(具体来说,这个情况出现在mac的chrome浏览器中,使用iphone的chrome浏览器就正常了,windows我没有测试)。解决方法是,在/etc/shiny-server的shiny-server.conf的最下面,添加“sanitize_errors off;disable_protocols xdr-streaming xhr-streaming iframe-eventsource iframe-htmlfile;”,添加完后就正常了。解决方法来自这里,另外shiny-server的官方文档在这里。
-
现在可以在mac端和手机端通过类似于shiny.caigui.site/01_hello。另外,调试中,要及时清空缓存和cookie,否则做的更改有可能不能及时刷新。
2. 感想
每一步都有一堆坑,总共耗时一周,才搞定了这个玩意,真是不容易啊!
3. R包版本控制
问题起源,在root用户下安装了1.3.1版本的tidyr包,运行Rstudio-server时,app可以正常运行。但部署到网站后,打开报错tidyr版本只有1.2.1,不符合要求。
.libPaths()
# root R env
[1] "/usr/local/lib/R/site-library"
[2] "/usr/lib/R/site-library"
[3] "/usr/lib/R/library"
> find.package("tidyr")
[1] "/usr/local/lib/R/site-library/tidyr"
# caigui R env
[1] "/home/caigui/R/x86_64-pc-linux-gnu-library/4.2"
[2] "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"
[4] "/usr/lib/R/library"
# shiny R env
[1] "/home/shiny/R/x86_64-pc-linux-gnu-library/4.2"
[2] "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"
[4] "/usr/lib/R/library"
> find.package("tidyr")
[1] "/home/shiny/R/x86_64-pc-linux-gnu-library/4.2/tidyr"
# 可能的原因是,我最开始在shiny用户下安装了一些R包,当我最近都在root环境安装新包的时候,shiny用户也可以正常调用
# 但当我更新旧的R包时,shiny用户仍然在"/home/shiny/R/x86_64-pc-linux-gnu-library/4.2"调用了旧的包
# 这次就先省点事,直接在shiny用户下更新tidyr包吧,更新后work了!
# 算了,一劳永逸的解决吧
su shiny
cd /home/shiny
vim .Rprofile
# 添加下一行
# .libPaths(c("/usr/local/lib/R/site-library", "/usr/lib/R/site-library", "/usr/lib/R/library"))
R
.libPaths()
# 修改成功
# [1] "/usr/local/lib/R/site-library"
# [2] "/usr/lib/R/site-library"
# [3] "/usr/lib/R/library"
# 以后就直接在root下安装R包即可。