作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
虽然许多人转向开放源代码(编程语言R)(https://www.r-project.org/about.html)用于统计和图形应用,但Shiny是一个R包,允许您将您的R代码转换为交互式网页。
在本教程中,您将在运行 Ubuntu 20.04 的服务器上安装和配置 Shiny 和开源版本的 Shiny Server。
前提条件
要完成本教程,您将需要:
- Ubuntu 20.04 服务器,带有sudo非根用户和防火墙,您可通过遵循 [Ubuntu 20.04 初始服务器设置指南] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04)来设置.
- 最新版本的R,您可以安装在 [How To Install R on Ubuntu 20.04] (https://andsky.com/tech/tutorials/how-to-install-r-on-ubuntu-20-04).
- Nginx安装,接入端口为"80"和"443". 遵循 [如何在 Ubuntu 20.04 上安装 Nginx (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-20-04) 安装 Nginx 。 在第2步中,使用
sudo ufw
命令允许Nginx Full
同时打开第80端口和第443端口,而不是sudo ufw 允许``Nginx HTTP
命令,后者只打开第80端口() ( )* 已注册域名. 这个教程始终使用`example.com'。 您可以在 [Namecheap] (https://www.namecheap.com 上购买一个域名, 在 [Freenom] (http://www.freenom.com/en/index.html) 上免费获取一个域名, 或者使用您选择的域名注册员. () ( )* 为您的服务器设置了以下两个 DNS 记录 。 遵循 [DNS 快速启动] (https://docs.digitalocean.com/products/networking/dns/quickstart/) 来了解如何添加它们的细节.
- 一个带有 " example.com " 的记录,指向您的服务器的公开IP地址. ()
) - 有"www.example.com"的记录,也指向了您服务器的公开IP地址. () (
)* A Let's Encrypt SSL 证书用于域名,可以通过遵循 [如何使用 Certbot 独立模式来获取 Let's Encrypt SSL 证书] (https://andsky.com/tech/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on-ubuntu-20-04)来安装. 在步骤2中,使用命令
sudo certbot-nginx-d example.com-d www.example.com'而不是该文章中给出的
certbot certle'命令获取SSL证书。 (_) (英语)
步骤 1 - 安装 Shiny
在安装 Shiny Server 之前,您需要安装 Shiny R 软件包,该软件包为运行 Shiny Web 应用程序提供了框架,而您可以直接从 R 或命令行安装 R 软件包,但建议使用后一种方法来确保所有用户都安装了这些软件包,而不仅仅是当前运行 R 的用户。
要从官方存储库中安装 Shiny R 包,使其可供所有用户使用,请使用以下命令:
1sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""
在su -
中,你将命令运行为 root. c
旗将命令传递给被su -
引用的用户。
完成后,输出表示安装完成,并确定下载的源包在哪里:
1[secondary_label Output]
2...
3* DONE (shiny)
4
5The downloaded source packages are in
6 ‘/tmp/RtmpPCeOoz/downloaded_packages’
有了Shiny,您可以安装Shiny Server,并在浏览器中引入默认欢迎屏幕。
第2步:安装Shiny服务器
在此步骤中,您将安装Shiny Server并调整防火墙以允许通过Shiny Server聆听的端口的流量。
写作时可用的 Ubuntu 最新版本是 Shiny Server 1.5.18.987. 使用以下命令下载 64 位架构的预建二进制。
1wget https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.18.987-amd64.deb
接下来,使用以下命令来验证下载的文件与 [RStudio Shiny Server 下载页面] 列出的 Sha256 支票总和的完整性(https://www.rstudio.com/products/shiny/download-server/ubuntu/):
1sha256sum shiny-server-1.5.18.987-amd64.deb
如果检查总数不匹配,请重新下载文件并验证其完整性。
Shiny Server 依赖于 GDebi进行安装,而 GDebi 是一种安装本地 deb
包的工具,同时解决和安装其他依赖。
更新您的包列表,然后安装gdebi-core
包:
1sudo apt update
2sudo apt install gdebi-core
接下来,使用以下gdebi
命令安装Shiny Server:
1sudo gdebi shiny-server-1.5.17.973-amd64.deb
您将被要求确认安装:
1[secondary_label Output]
2Shiny Server
3 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.
4Do you want to install the software package? [y/N]:y
输入y
来确认您想要安装该软件包。
命令输出的末尾将显示一个名为shiny-server
的服务正在运行:
1[secondary_label Output]
2● shiny-server.service - ShinyServer
3 Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
4 Active: active (running) since Sun 2022-02-06 01:37:23 UTC; 14ms ago
5 Main PID: 51306 (shiny-server)
6...
使用ss
命令来验证shiny-server
在端口3838
上收听:
1sudo ss -plut | grep -i shiny
plut
的旗帜调查了shiny-server
在听的位置:
p
是 进程的缩写,表示使用 socket 的进程l
是 倾听的缩写,并显示听力插件- 如果适用,则
u
会显示 UDP插件 - 如果适用,则
t
会显示 TCP插件
输出将显示以下行:
1[secondary_label Output]
2tcp LISTEN 0 511 *:3838 *:* users:(("shiny-server",pid=51306,fd=18))
当您确认‘shiny-server’在端口‘3838’上收听时,请修改防火墙以允许流量传入Shiny Server:
1sudo ufw allow 3838
在 Web 浏览器中,请访问 http://your_server_ip:3838
以创建默认的 Shiny Server 主页,该主页欢迎您访问 Shiny Server,并祝贺您安装。您将在屏幕右侧看到一个小框,表示 ** 出现了错误**。 在步骤 4 中安装 rmarkdown
时,错误消息将被交互式 Shiny Doc 取代。
<$>[注]
**注:**允许通过端口3838进行流量的防火墙规则是暂时的。在完成步骤3中的任务之前,将浏览器指向https://your_server_ip:3838
将无法加载任何内容。在步骤3中的任务完成后,将不再需要通过该端口访问Shiny Server。在步骤5中,您将删除防火墙规则。
您现在安装了 Shiny 和 Shiny Server,并在端口3838
上聆听。
在下一步中,您将使用 Nginx 设置反向代理,并为您的域安装 SSL 证书,这将允许您在端口 443
上安全访问 Shiny Server。
步骤 3 – 使用反向代理和SSL证书保护闪光服务器
在此步骤中,您将配置 Nginx 以通过 WebSocket向 Shiny Server 传输接收请求,这是 Web 服务器和客户端之间的消息传输协议。
打开主要的 Nginx 配置文件,‘nginx.conf’,以编辑:
1sudo nano /etc/nginx/nginx.conf
在此文件中,您可以为使用的任何 Nginx _server 块创建配置变量。
使用 Nginx 的 地图模块,创建 WebSocket 需要的值的变量,将以下指令复制到 http 块中:
1[label /etc/nginx/nginx.conf]
2http {
3 ...
4 # Map proxy settings for RStudio
5 map $http_upgrade $connection_upgrade {
6 default upgrade;
7 '' close;
8 }
9}
地图
指令将$http_upgrade
(客户端Upgrade**
标题的值)与弯曲框中的条件进行比较.如果值是一个空串(```),那么地图
会创建$connection_upgrade
变量并将其设置为关闭
。
完成后,保存并关闭文件。
接下来,打开您的域名服务器封锁:
1sudo nano /etc/nginx/sites-available/example.com
查找和编辑位置
块,只包含以下指令:
1[label /etc/nginx/sites-available/example.com]
2location / {
3 proxy_pass http://your_server_ip:3838;
4 proxy_redirect http://your_server_ip:3838/ https://$host/;
5 proxy_http_version 1.1;
6 proxy_set_header Upgrade $http_upgrade;
7 proxy_set_header Connection $connection_upgrade;
8 proxy_read_timeout 20d;
9 }
「proxy_pass」告訴 Nginx將來自網頁伺服器應用程式根的請求轉送到伺服器在端口「3838」上聆聽的 IP 地址。
proxy_redirect
重写到来的字符串, http://your_server_ip:3838/
,到处理请求的服务器上的 HTTPS 等级。
proxy_set_header
重新定义或附加字段到传送到代理服务器的请求标题。
proxy_read_timeout 设置了连续两次读取操作之间从代理服务器读取响应的时间。
完成后,保存并关闭文件。
在激活您刚刚在 /etc/nginx/sites-available/example.com
中所做的更改之前,请测试文件是否存在错误:
1sudo nginx -t
如果没有错误,请执行以下命令,以防止默认的 Nginx 欢迎页面加载:
1sudo unlink /etc/nginx/sites-enabled/default
然后通过运行此命令激活更改:
1sudo systemctl restart nginx
您现在已经通过反向代理和SSL证书保护了Shiny Server. 尝试加载https://example.com
(没有指定IP地址和端口号码)以检查您的设置是否有效。
接下来,您将配置交互式 R Markdown 文档的设置。
步骤 4 — 托管交互式 R Markdown 文档
除了托管 Shiny 应用程序外,Shiny Server 还可用于托管交互式 R Markdown 文档。 您的工作 Shiny Server 可以托管 Shiny 应用程序,但它无法托管交互式 R Markdown 文档而无需rmarkdown
R 包。
使用以下命令来安装rmarkdown
:
1sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""
要验证安装,请访问 https://example.com
. 在步骤 2 中遇到的错误现在应该被交互式的场景取代。 或者,您可以访问 https://example.com/sample-apps/rmd/
查看完整的场景本身。
步骤 5 – 拒绝公众访问 Shiny Server 端口号码
在第 2 步中,您创建了一个防火墙规则,允许通过其端口号访问 Shiny Server. 现在它可以通过 https://example.com
访问,您不需要向该端口提供公共访问权限。
首先,使用以下命令查看所有现有规则:
1sudo ufw status numbered
结果将看起来像这样:
1[secondary_label Output]
2Status: active
3
4 To Action From
5 -- ------ ----
6[ 1] OpenSSH ALLOW IN Anywhere
7[ 2] Nginx Full ALLOW IN Anywhere
8[ 3] 3838 ALLOW IN Anywhere
9[ 4] OpenSSH (v6) ALLOW IN Anywhere (v6)
10[ 5] Nginx Full (v6) ALLOW IN Anywhere (v6)
11[ 6] 3838 (v6) ALLOW IN Anywhere (v6)
与 Shiny Server 防火墙相关的规则标记为3838
(上文输出中的规则 3 和 6)。
1sudo ufw delete 3
如果从列表中删除一个规则,则规则数字会发生变化(在这种情况下,规则6将成为规则5)。
1sudo ufw status numbered
结果将与前一个相似:
1[secondary_label Output]
2Status: active
3
4 To Action From
5 -- ------ ----
6[ 1] OpenSSH ALLOW IN Anywhere
7[ 2] Nginx Full ALLOW IN Anywhere
8[ 3] OpenSSH (v6) ALLOW IN Anywhere (v6)
9[ 4] Nginx Full (v6) ALLOW IN Anywhere (v6)
10[ 5] 3838 (v6) ALLOW IN Anywhere (v6)
删除其他3838
规则(上文输出中的规则5):
1sudo ufw delete 5
若要应用更改,请重新加载防火墙:
1sudo ufw reload
Shiny Server 仍然活跃,但将不再通过端口号公开访问。
结论
您现在有一个功能齐全的Shiny Server,可以托管Shiny应用程序和互动的R Markdown文档。
当你准备开始部署时,你可以找到 Shiny Server 的配置文件在 /etc/shiny-server/shiny-server.conf
. 默认情况下,它设置为在 /srv/shiny-server/
目录中服务应用程序,这意味着在 /srv/shiny-server/app_name
放置的任何 Shiny 应用程序将可供公众使用在 https://example.com/app_name/
。
要了解更多有关定制 Shiny Server 以满足您的具体需求的信息,请访问 Shiny Server 管理员指南或阅读 rstudio.com 的教程(https://shiny.rstudio.com/tutorial/)。