介绍
虽然许多人主要使用开放源代码编程语言R进行统计和图形应用,但Shiny是一个R包 ,它允许您将R代码转换为交互式网页。 当与Shiny Server结合使用时,您可以使用免费,开放源代码和付费专业格式,也可以托管和管理Shiny应用程序和交互式R markdown文档 。
在本教程中,您将在运行Ubuntu 16.04的服务器上安装和配置Shiny和开源版本的Shiny Server,使用Let's Encrypt SSL证书保护与Shiny服务器的连接,然后安装额外的软件包以运行交互R Markdown文件。
先决条件
要完成本教程,您需要以下内容:
- 按照Ubuntu 16.04初始服务器设置教程设置的一台Ubuntu 16.04服务器, 其最小内存为1GB ,包括sudo非root用户和防火墙。
警告:服务器上任何小于1GB的内存可能导致Shiny Server或其相关R包的安装失败。
在Ubuntu 16.04教程中安装R的第1步中安装的R的最新版本。
Nginx的安装方法如下:在Ubuntu 16.04教程中安装Nginx ,包括允许在第2步中使用命令
sudo ufw allow 'Nginx Full'
访问端口80
和443
。完全注册的域名。 本教程将始终使用
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
,它把下载的源代码包放在哪里:
Output...
* 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
如果成功,输出将包括以下行:
Outputtcp 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所需的值创建变量:
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创建一组新的指令:
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;
}
}
这种配置的最终结果是,端口80
和3838
上所有到服务器的传入请求都被重定向到端口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页面。