本文的 旧版本 由 Dean Attali 编写。
介绍
虽然许多人主要将 开源编程语言 R 用于统计和图形应用程序,但 Shiny 是一个 R 包,它允许您转换 R 代码进入交互式网页。 当与 Shiny Server 结合使用时(提供免费、开源和付费的专业格式),您还可以托管和管理 Shiny 应用程序和 交互式 R 降价文档 。
在本教程中,您将在运行 Ubuntu 16.04 的服务器上安装和配置 Shiny 和开源版本的 Shiny Server,使用 Let's Encrypt SSL 证书保护与 Shiny 服务器的连接,然后安装额外的包以运行交互式R Markdown 文档。
先决条件
要完成本教程,您需要以下内容:
- 按照 this Ubuntu 16.04 initial server setup tutorial 设置一台具有 至少 1GB RAM 的 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
警告: 服务器上任何小于 1GB 的 RAM 都可能导致 Shiny Server 或其相关 R 包的安装失败。
- 按照this install R on Ubuntu 16.04 tutorial中的步骤1安装最新版本的R。
- 按照 this How To Install Nginx on Ubuntu 16.04 tutorial 安装 Nginx,包括在步骤 2 中使用命令
sudo ufw allow 'Nginx Full'
允许访问端口80
和443
. - 完全注册的域名。 本教程将自始至终使用
example.com
。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。 您可以关注 this hostname tutorial 了解如何添加它们的详细信息。
- 带有
example.com
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.example.com
的 A 记录指向您服务器的公共 IP 地址。
- 带有
- 按照 这个 Let's Encrypt Certbot 教程 安装的域的 Let's Encrypt SSL 证书。
准备好所有先决条件后,我们将首先在服务器上安装 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 Server 侦听的端口。
根据 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 Server 确实在侦听端口 3838
。
sudo netstat -plunt | grep -i shiny
如果成功,输出将包括以下行:
Outputtcp 0 0 0.0.0.0:3838 0.0.0.0:* LISTEN 18749/shiny-server
如果您的输出看起来不像这样,请仔细检查您的终端是否有其他警告和错误消息。
现在,修改防火墙以允许流量通过 Shiny Server。
sudo ufw allow 3838
最后,将您的浏览器指向 http://www.example.com:3838
以显示默认的 Shiny Server 主页,欢迎您使用 Shiny Server 并祝贺您安装。
注意: 您可能会在屏幕右侧看到一个小框,其中显示一条消息,指出发生错误。 在步骤 4 中安装 rmarkdown
后,错误消息将替换为交互式 Shiny Doc。
您现在已经安装并测试了 Shiny 和 Shiny Server,因此让我们通过将 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
(客户端的 Upgrade 标头的值)与大括号中的条件进行比较。 如果值为 ,则
map
创建 $connection_upgrade
变量并将其设置为 close
。 否则,map
创建 $connection_upgrade
变量并将其设置为默认值 upgrade
。
保存您的工作并关闭文件以继续。
接下来,创建一个全新的 Nginx 服务器块,以便在以后遇到问题时仍然可以恢复到默认配置文件。
sudo nano /etc/nginx/sites-available/example.com
通过将以下内容复制并粘贴到新文件中,为 Shiny Server 创建一组新指令:
/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; } }
此配置的最终效果是端口 80
和 3838
上对服务器的所有传入请求都被重定向到在端口 443
上使用 HTTPS。
此配置的一些更复杂方面的概述包括:
- return:为以纯 HTTP 到 HTTPS 的请求创建永久重定向。
- 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 服务器,但它还不能托管交互式 R Markdown 文档,因为没有安装 rmarkdown
R 包。
因此,使用类似于步骤 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 服务器,它可以托管 Shiny 应用程序和交互式 R Markdown 文档。
要在当前设置的基础上构建,您可以:
- 通过 Shiny 服务器管理员指南 了解如何根据您的确切需求管理和自定义服务器。
- 通过 rstudio.com 上的 教程了解有关编写 Shiny 应用程序的更多信息。
- 通过查看 rstudio.com 上的 R Markdown 页面,了解有关编写交互式 R Markdown 文档的更多信息。