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

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

虽然许多人转向开放源代码(编程语言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/) 来了解如何添加它们的细节.

步骤 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/)。

Published At
Categories with 技术
comments powered by Disqus