如何在Ubuntu 16.04上设置Shiny服务器

在本教程中,您将在运行Ubuntu 16.04的服务器上安装并配置Shiny和开源版本的Shiny Server,使用Let's Encrypt数字证书保护与Shiny服务器的连接,然后安装额外的软件包以运行交互式R Markdown文件。

介绍

虽然许多人主要使用开放源代码编程语言R进行统计和图形应用,但Shiny是一个R包 ,它允许您将R代码转换为交互式网页。 当与Shiny Server结合使用时,您可以使用免费,开放源代码和付费专业格式,也可以托管和管理Shiny应用程序和交互式R markdown文档

在本教程中,您将在运行Ubuntu 16.04的服务器上安装和配置Shiny和开源版本的Shiny Server,使用Let's Encrypt SSL证书保护与Shiny服务器的连接,然后安装额外的软件包以运行交互R Markdown文件。

先决条件

要完成本教程,您需要以下内容:

警告:服务器上任何小于1GB的内存可能导致Shiny Server或其相关R包的安装失败。

  • 在Ubuntu 16.04教程中安装R的第1步中安装的R的最新版本。

  • Nginx的安装方法如下:在Ubuntu 16.04教程中安装Nginx ,包括允许在第2步中使用命令sudo ufw allow 'Nginx Full'访问端口80443

  • 完全注册的域名。 本教程将始终使用example.com 您可以在Namecheap上购买域名,在Freenom上免费获取域名,或使用您所选择的域名注册商。

  • 以下两个DNS记录都是为您的服务器设置的。 你可以按照这个主机名教程了解如何添加它们的细节。

    • example.com指向您服务器的公有IP地址的记录。
    • www. example.com的一条记录www. example.com www. example.com指向您的服务器的公共IP地址。
  • 让我们来加密安装的域名的SSL证书后, 我们来加密Certbot教程

一旦所有的先决条件都到位,我们将开始在服务器上安装Shiny。

第1步 - 安装Shiny

在安装Shiny Server之前,您需要安装Shiny R软件包,该软件包提供运行Shiny Web应用程序的框架。

如果您熟悉R,可能会试图直接从R而不是从命令行安装软件包。 但是,使用以下命令是确保为所有用户安装软件包的最安全的方法,而不仅仅是当前运行R的用户。

su -像在用户自己的环境中一样运行以下命令, -c选项指定将要运行的命令。 在这种情况下,这个命令是用双引号括起来的。

install.packages是用于安装R软件包的R命令。 所以,在这个命令中,具体来说,这个shiny包是从指定的仓库安装的。

sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""

完成后,R会告诉你,安装是DONE ,它把下载的源代码包放在哪里:

...
* DONE (shiny)

The downloaded source packages are in
    ‘/tmp/Rtmp2GcWv4/downloaded_packages’

使用Shiny,您现在可以安装Shiny Server,并在浏览器中显示其默认欢迎屏幕。

第2步 - 安装Shiny服务器

在这一步中,您将安装Shiny服务器并调整防火墙,以允许通过Shiny服务器监听的端口的流量。

根据Per Shiny Server的官方安装说明,我们将使用wget下载用于64位体系结构的预构建二进制文件。 由于Shiny Server处于活跃的开发阶段,您应该查询官方的Shiny Server下载页面 ,获取最新的64位预编译二进制文件的URL,以匹配您的操作系统。 获得地址后,请相应地更改以下命令中的URL。

wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.5.5.872-amd64.deb

下载文件后,通过将以下命令的输出与64位顶部的RStudio Shiny Server下载页面上列出的MD5校验和进行比较,验证其完整性,即预先构建的二进制下载指令。

md5sum shiny-server-1.5.5.872-amd64.deb

如果校验和不匹配,请重新下载该文件并在继续之前再次验证其完整性。

由于Shiny Server依赖于GDebi(一种在安装本地deb软件包的同时解析和安装附加依赖项的工具),因此安装时需要更新软件包列表,然后安装gdebi-core软件包。

sudo apt-get update
sudo apt-get install gdebi-core

您现在已经准备好安装Shiny Server。

sudo gdebi shiny-server-1.5.5.872-amd64.deb

当GDebi要求您确认要安装软件包时,请键入y

[Secondary_label Output]
Shiny Server
 Shiny Server is a server program from RStudio, Inc. that makes Shiny applications available over the web. Shiny is a web application framework for the R statistical computation language.
Do you want to install the software package? [y/N]:y

此时,输出应指示已安装名为ShinyServer的服务并且已active Systemd服务。 如果输出表明存在问题,请在继续之前重新跟踪之前的步骤。

[Secondary_label Output]
...
● shiny-server.service - ShinyServer
   Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-10-13 14:24:28 UTC; 2 days ago
...

接下来,验证Shiny服务器确实正在监听端口3838

sudo netstat -plunt | grep -i shiny

如果成功,输出将包括以下行:

tcp        0      0 0.0.0.0:3838            0.0.0.0:*               LISTEN      18749/shiny-server

如果您的输出不是这样,请仔细检查您的终端是否有其他警告和错误消息。

现在,修改防火墙以允许流量通过Shiny服务器。

sudo ufw allow 3838

最后,将浏览器指向http:// www.example.com :3838 ,打开默认的Shiny Server主页,欢迎您访问Shiny Server并祝贺您的​​安装。

注:您可能会在屏幕的右侧看到一个小框,并显示一条消息,指出发生了错误 一旦在第4步中安装了rmarkdown ,错误信息将被替换为交互式Shiny Doc。

您现在已经安装并测试了Shiny和Shiny服务器,因此我们通过将Nginx配置为反向代理并通过HTTPS路由所有流量来确保安装。

第3步 - 使用反向代理和SSL证书保护Shiny服务器

在这一步中,您将配置Nginx通过WebSocket (Web服务器和客户端之间的消息传递协议)将传入请求转发到Shiny Server。

因为我们要创建任何Nginx服务器块可以使用的配置变量,请打开主要的Nginx配置文件nginx.conf进行编辑。

sudo nano /etc/nginx/nginx.conf

使用Nginx的map模块 ,通过将以下指令复制到http块中,为WebSocket所需的值创建变量:

/etc/nginx/nginx.conf
http {
    ...
    # Map proxy settings for RStudio
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}

map指令将$http_upgrade (客户端的升级标头的值)与花括号中的条件进行比较。 如果值是''map创建$connection_upgrade变量并将其设置为close 否则, map创建$connection_upgrade变量并将其设置为默认值upgrade

保存您的工作并关闭文件以继续。

接下来,创建一个全新的Nginx服务器模块,这样如果您稍后遇到问题,您仍然可以使用默认的配置文件来恢复。

sudo nano /etc/nginx/sites-available/example.com

通过将以下内容复制并粘贴到新文件中,为Shiny Server创建一组新的指令:

example.com'> / etc / nginx / sites-available / example.com
server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;
   server_name example.com www.example.com;
   return 301 https://$server_name$request_uri;
}
server {
   listen 443 ssl;
   server_name example.com www.example.com;
   ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;

   location / {
       proxy_pass http://your_server_ip:3838;
       proxy_redirect http://your_server_ip:3838/ https://$host/;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection $connection_upgrade;
       proxy_read_timeout 20d;
   }
}

这种配置的最终结果是,端口803838上所有到服务器的传入请求都被重定向到端口443上使用HTTPS。

这个配置的一些更复杂的方面的概述包括:

  • 返回 :为进入HTTPS的普通HTTP请求创建永久重定向。

  • proxy_pass :指示Nginx将在Web服务器应用程序根目录下的请求转发到监听端口3838的服务器的IP地址。

  • proxy_redirect :将传入的字符串http:// your_server_ip :3838/重写为处理该请求的服务器上的HTTPS等效项。 $host变量的值是Nginx正在运行的服务器的主机名。

  • proxy_set_header :将字段重新定义或附加到传递给代理服务器的请求标头。

  • proxy_read_timeout :设置两次连续读取操作之间从代理服务器读取响应的超时时间。

保存并关闭文件以继续。

接下来,通过在/etc/nginx/sites-enabled目录中为它创建一个符号链接来启用新的服务器块。

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

而且,由于我们的新服务器模块现在可以处理端口80上的所有请求,因此您可以通过删除sites-enabled目录中的符号链接来禁用默认模块。

sudo rm -f /etc/nginx/sites-enabled/default

现在,在激活更改之前测试您的新配置。

sudo nginx -t

如果遇到任何问题,请按照输出中的说明解决问题。

一旦你的语法正常,你的测试成功了,你就可以通过重新加载Nginx来激活所有的变化。

sudo systemctl restart nginx

在Nginx重新启动之后,通过将浏览器指向https:// example.com ,验证您的Shiny服务器是否通过HTTPS提供请求。 您应该看到在第2步结束时看到的相同的默认Shiny Server主页。

然后,通过在浏览器的地址栏中输入http:// example.com ,验证传入的HTTP请求是否被重定向到HTTPS。 如果工作正常,您应该自动重定向到https:// example.com

Shiny Server现在使用反向代理和SSL证书进行了安全保护,因此您可以为交互式R Markdown文档配置您的设置。

第4步 - 托管交互式R文档

Shiny Server不仅可用于托管Shiny应用程序,还可用于托管交互式R Markdown文档。

此时,您有一个可以托管Shiny应用程序的Shiny Server,但由于未安装rmarkdown R软件包,因此无法托管交互式R Markdown文档。

因此,使用与第1步中的命令类似的命令来安装Shiny软件包,请安装rmarkdown

sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""

然后,转到https:// example.com /sample-apps/rmd/来验证安装。 您应该在浏览器中看到交互式R Markdown文档。 此外,如果您返回到https:// example.com ,则您之前收到的错误消息现在应该替换为动态内容。

如果您收到错误消息,请按照屏幕上的说明进行操作,并查看终端输出以获取更多信息。

您的Shiny Server安装程序是完整的,安全的,可以同时提供Shiny应用程序以及Interactive R Markdown文档。

结论

在本教程中,您将设置并保护一个功能齐全的Shiny Server,该Shiny Server可托管Shiny应用程序和交互式R Markdown文档。

要建立您当前的设置,您可以:

  • 通过“ Shiny Server管理员指南” ,了解如何根据您的确切需求管理和自定义服务器。

  • 通过rstudio.com上的教程详细了解如何编写Shiny应用程序。

  • 了解有关编写交互式R markdown文档的更多信息,请查看rstudio.com上的R Markdown页面。